Skip to content

Commit

Permalink
Support macro annotation expansions in -Wmacros:MODE
Browse files Browse the repository at this point in the history
Specifically, for `-Wmacros:none` or `-Wmacros:before`, we shouldn't
warn about unused symbols in code resulting from expansion of a macro
annotation.
  • Loading branch information
cb372 authored and lrytz committed Mar 18, 2020
1 parent c14cd94 commit 9b505e2
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 2 deletions.
Expand Up @@ -651,11 +651,13 @@ trait TypeDiagnostics {
}
object skipMacroExpansion extends UnusedPrivates {
override def traverse(t: Tree): Unit =
if (!hasMacroExpansionAttachment(t)) super.traverse(t)
if (!hasMacroExpansionAttachment(t) && !(t.hasSymbol && isExpanded(t.symbol)))
super.traverse(t)
}
object checkMacroExpandee extends UnusedPrivates {
override def traverse(t: Tree): Unit =
super.traverse(if (hasMacroExpansionAttachment(t)) macroExpandee(t) else t)
if (!(t.hasSymbol && isExpanded(t.symbol)))
super.traverse(if (hasMacroExpansionAttachment(t)) macroExpandee(t) else t)
}

private def warningsEnabled: Boolean = {
Expand Down
6 changes: 6 additions & 0 deletions test/files/neg/macro-annot-unused-param.check
@@ -0,0 +1,6 @@
Test_2.scala:2: warning: parameter value x in anonymous function is never used
@mymacro
^
error: No warnings can be incurred under -Werror.
1 warning
1 error
22 changes: 22 additions & 0 deletions test/files/neg/macro-annot-unused-param/Macros_1.scala
@@ -0,0 +1,22 @@
// scalac: -Ymacro-annotations
import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context
import scala.annotation.StaticAnnotation

object Macros {
def annotImpl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = {
import c.universe._
val classTree = annottees.head.tree
val objectTree = q"""
object X {
def f: Int => String = { x => "hello" }
}
"""

c.Expr[Any](Block(List(classTree, objectTree), Literal(Constant(()))))
}
}

class mymacro extends StaticAnnotation {
def macroTransform(annottees: Any*): Any = macro Macros.annotImpl
}
7 changes: 7 additions & 0 deletions test/files/neg/macro-annot-unused-param/Test_2.scala
@@ -0,0 +1,7 @@
// scalac: -Ymacro-annotations -Wunused:params -Wmacros:after -Werror
@mymacro
class X

object Test {
println(X.f(123))
}
22 changes: 22 additions & 0 deletions test/files/pos/macro-annot-unused-param/Macros_1.scala
@@ -0,0 +1,22 @@
// scalac: -Ymacro-annotations
import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context
import scala.annotation.StaticAnnotation

object Macros {
def annotImpl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = {
import c.universe._
val classTree = annottees.head.tree
val objectTree = q"""
object X {
def f: Int => String = { x => "hello" }
}
"""

c.Expr[Any](Block(List(classTree, objectTree), Literal(Constant(()))))
}
}

class mymacro extends StaticAnnotation {
def macroTransform(annottees: Any*): Any = macro Macros.annotImpl
}
7 changes: 7 additions & 0 deletions test/files/pos/macro-annot-unused-param/Test_2.scala
@@ -0,0 +1,7 @@
// scalac: -Ymacro-annotations -Wunused:params -Werror
@mymacro
class X

object Test {
println(X.f(123))
}

0 comments on commit 9b505e2

Please sign in to comment.