Skip to content

Commit

Permalink
Add tests to check for wrong owner
Browse files Browse the repository at this point in the history
  • Loading branch information
hamzaremmal committed Nov 8, 2023
1 parent 0e2041a commit fda646c
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ class MacroAnnotations(phase: IdentityDenotTransformer):
report.error(em"Macro added a definition with the wrong owner - ${tree.symbol.owner} - ${tdef.symbol} in ${tree.source}")
else if !isSymbolInDecls(tree.symbol) then
tree.symbol.enteredAfter(phase)
traverseChildren(tree) // Taverse before or after dealing with this class?
traverseChildren(tree)
case _ => traverseChildren(tree)
}.traverse(tree)

Expand Down
2 changes: 2 additions & 0 deletions tests/neg-macros/wrong-owner.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Macro added a definition with the wrong owner - class String - class Foo in tests/neg-macros/wrong-owner/Test_2.scala
1 error found
19 changes: 19 additions & 0 deletions tests/neg-macros/wrong-owner/Macro_1.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import scala.annotation.experimental
import scala.annotation.MacroAnnotation
import scala.quoted.*

@experimental
class wrongOwner extends MacroAnnotation :
def transform(using Quotes)(tree: quotes.reflect.Definition): List[quotes.reflect.Definition] =
import quotes.reflect.*
tree match
case ClassDef(name, ctr, parents, self, body) =>
val cls = tree.symbol
val toStringSym = Symbol.requiredMethod("java.lang.Object.toString")
val toStringOverrideSym = Symbol.newMethod(Symbol.classSymbol("java.lang.String"), "toString", toStringSym.info, Flags.Override, Symbol.noSymbol)
val toStringDef = DefDef(toStringOverrideSym, _ => Some(Literal(StringConstant("Hello from macro"))))
val newClassDef = ClassDef.copy(tree)(name, ctr, parents, self, toStringDef :: body)
List(newClassDef)
case _ =>
report.error("@toString can only be annotated on class definitions")
tree :: Nil
7 changes: 7 additions & 0 deletions tests/neg-macros/wrong-owner/Test_2.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// nopos-error

import scala.annotation.experimental

@experimental
@wrongOwner
class Foo

0 comments on commit fda646c

Please sign in to comment.