File tree Expand file tree Collapse file tree 6 files changed +83
-0
lines changed
sbt-test/scala2-compat/i16630 Expand file tree Collapse file tree 6 files changed +83
-0
lines changed Original file line number Diff line number Diff line change 1+ val scala3Version = sys.props(" plugin.scalaVersion" )
2+ val scala2Version = sys.props(" plugin.scala2Version" )
3+
4+ lazy val scala2 = project.in(file(" scala2" ))
5+ .settings(
6+ scalaVersion := scala2Version,
7+ libraryDependencies += " org.scala-lang" % " scala-reflect" % scalaVersion.value
8+ )
9+
10+ lazy val scala3 = project.in(file(" scala3" ))
11+ .settings(
12+ scalaVersion := scala3Version
13+ )
14+ .dependsOn(scala2)
15+
16+ lazy val `scala2-test` = project.in(file(" scala2-test" ))
17+ .settings(
18+ scalaVersion := scala2Version,
19+ scalacOptions ++= Seq (
20+ " -Ytasty-reader" ,
21+ // TODO add an option here to let scalac read experimental tasty files
22+ ),
23+ )
24+ .dependsOn(scala3)
Original file line number Diff line number Diff line change 1+ object TestScala2 extends App {
2+ private val line : Any = Macros .location.line
3+ if (line != 2 ) {
4+ println(" test failed: " + line)
5+ System .exit(1 )
6+ } else
7+ println(" test passed: " + line)
8+ TestScala3
9+ }
Original file line number Diff line number Diff line change 1+ import scala .reflect .macros .blackbox .Context
2+ import scala .language .experimental .macros
3+
4+ case class Location (path : String , line : Int )
5+
6+ object Scala2MacrosCompat {
7+ def locationImpl [T ](c : Context ): c.Tree = {
8+ import c .universe ._
9+ val location = typeOf[Location ]
10+ val line = Literal (Constant (c.enclosingPosition.line))
11+ val path = Literal (Constant (c.enclosingPosition.source.path))
12+ q " new $location( $path, $line) "
13+ }
14+ }
Original file line number Diff line number Diff line change 1+
2+ import scala .quoted .{Quotes , Expr }
3+ import scala .language .experimental .macros
4+
5+ case class Location [T ](path : String , line : Int )
6+
7+ class Macros [T ]:
8+ def location : Location [T ] = macro Scala2MacrosCompat .locationImpl
9+ inline def location : Location [T ] = $ {Macros .locationImpl}
10+
11+ object Macros :
12+
13+ import scala .quoted .*
14+ def locationImpl [T : Type ](using quotes : Quotes ): Expr [Location [T ]] =
15+ import quotes .reflect .Position
16+ val file = Expr (Position .ofMacroExpansion.sourceFile.jpath.toString)
17+ val line = Expr (Position .ofMacroExpansion.startLine + 1 )
18+ ' {new Location [T ]($file, $line)}
19+
Original file line number Diff line number Diff line change 1+ def TestScala3 = {
2+ val line : Any = new Macros [Unit ].location.line
3+ if (line != 2 ) {
4+ println(" test failed: " + line)
5+ System .exit(1 )
6+ } else
7+ println(" test passed: " + line)
8+ }
9+ object TestScala3App extends App {
10+ TestScala3
11+ }
Original file line number Diff line number Diff line change 1+ # This test is based loosely on https://docs.scala-lang.org/scala3/guides/migration/tutorial-macro-mixing.html
2+ # Unfortunately Scala 2.13 refuses to read "experimental" tasty files, so the test is incomplete.
3+ # However, the original issue was a failure to compile, so the full test is not essential.
4+
5+ # FIXME change the line below to scala2-test/run once we can make scala 2.13 read experimental scala 3 tasty files
6+ > scala3/run
You can’t perform that action at this time.
0 commit comments