Merge pull request #2563 from eed3si9n/wip/macro-nonarg-dep

Fixes incremental compiler missing member ref from macro expansion sbt/sbt#2560
This commit is contained in:
eugene yokota 2016-04-19 10:57:25 -04:00
commit ce611fbdca
9 changed files with 76 additions and 2 deletions

View File

@ -146,7 +146,9 @@ final class Dependency(val global: CallbackGlobal) extends LocateClassFile {
// In some cases (eg. macro annotations), `typeTree.tpe` may be null. See sbt/sbt#1593 and sbt/sbt#1655.
case typeTree: TypeTree if typeTree.tpe != null => symbolsInType(typeTree.tpe) foreach addDependency
case MacroExpansionOf(original) if inspectedOriginalTrees.add(original) => traverse(original)
case m @ MacroExpansionOf(original) if inspectedOriginalTrees.add(original) =>
traverse(original)
super.traverse(m)
case other => super.traverse(other)
}

View File

@ -1 +1,5 @@
incOptions := sbt.inc.IncOptions.Default
lazy val root = (project in file(".")).
settings(
incOptions := sbt.inc.IncOptions.Default,
scalaVersion := "2.11.7"
)

View File

@ -1,9 +1,13 @@
> compile
# comment out `initialized` method in A
$ copy-file changes/A1.scala src/main/scala/A.scala
$ sleep 1000
# compilation of A.scala succeeds but B.scala gets invalidated (properly) and B.scala fails to compile
-> compile
# we change A.scala to its original shape so compilation should succeed again
$ copy-file changes/A2.scala src/main/scala/A.scala
$ sleep 1000
# this fails at the moment due to use of stale class file for A, see #958 for details
> compile

View File

@ -0,0 +1,22 @@
val defaultSettings = Seq(
scalaVersion := "2.11.8",
libraryDependencies <+= scalaVersion("org.scala-lang" % "scala-reflect" % _ )//,
//incOptions := incOptions.value.withNameHashing(true)
)
lazy val root = (project in file(".")).
aggregate(macroProvider, macroClient).
settings(
defaultSettings
)
lazy val macroProvider = (project in file("macro-provider")).
settings(
defaultSettings
)
lazy val macroClient = (project in file("macro-client")).
dependsOn(macroProvider).
settings(
defaultSettings
)

View File

@ -0,0 +1,5 @@
package example
object Bar {
def bar(x: Int, y: Int): Int = x
}

View File

@ -0,0 +1,5 @@
package example
object Bar {
def bar(x: Int): Int = x
}

View File

@ -0,0 +1,5 @@
package example
object Client {
def foo: Unit = Provider.tree(0)
}

View File

@ -0,0 +1,16 @@
package example
import scala.language.experimental.macros
import scala.reflect.macros._
object Provider {
def tree(args: Any): Any = macro treeImpl
def treeImpl(c: Context)(args: c.Expr[Any]) = {
import c.universe._
c.Expr[Any](
Apply(
Select(Ident(TermName("Bar")), TermName("bar")),
List(Literal(Constant(0))))
)
}
}

View File

@ -0,0 +1,11 @@
> compile
## Replace client-side file Bar.scala to something that should not compile
$ copy-file changes/Bar.scala macro-client/Bar.scala
## Expect failure here
-> macroClient/compile
## It should still fail after clean
> macroClient/clean
-> macroClient/compile