@@ -9,7 +9,7 @@ import dotty.tools.dotc.config.Printers.{macroAnnot => debug}
99import dotty .tools .dotc .core .Annotations .*
1010import dotty .tools .dotc .core .Contexts .*
1111import dotty .tools .dotc .core .Decorators .*
12- import dotty .tools .dotc .core .DenotTransformers .DenotTransformer
12+ import dotty .tools .dotc .core .DenotTransformers .IdentityDenotTransformer
1313import dotty .tools .dotc .core .Flags .*
1414import dotty .tools .dotc .core .MacroClassLoader
1515import dotty .tools .dotc .core .Symbols .*
@@ -23,7 +23,8 @@ import scala.util.control.NonFatal
2323
2424import java .lang .reflect .InvocationTargetException
2525
26- class MacroAnnotations :
26+ class MacroAnnotations (phase : IdentityDenotTransformer ):
27+
2728 import tpd .*
2829 import MacroAnnotations .*
2930
@@ -58,9 +59,11 @@ class MacroAnnotations:
5859 case (prefixed, newTree :: suffixed) =>
5960 allTrees ++= prefixed
6061 insertedAfter = suffixed :: insertedAfter
61- prefixed.foreach(checkMacroDef(_, tree, annot))
62- suffixed.foreach(checkMacroDef(_, tree, annot))
63- transform.TreeChecker .checkMacroGeneratedTree(tree, newTree)
62+ for prefixedTree <- prefixed do
63+ checkMacroDef(prefixedTree, tree, annot)
64+ for suffixedTree <- suffixed do
65+ checkMacroDef(suffixedTree, tree, annot)
66+ TreeChecker .checkMacroGeneratedTree(tree, newTree)
6467 newTree
6568 case (Nil , Nil ) =>
6669 report.error(i " Unexpected `Nil` returned by `( ${annot.tree}).transform(..)` during macro expansion " , annot.tree.srcPos)
@@ -76,6 +79,7 @@ class MacroAnnotations:
7679 insertedAfter.foreach(allTrees.++= )
7780
7881 val result = allTrees.result()
82+ for tree <- result do enterMissingSymbols(tree)
7983 debug.println(result.map(_.show).mkString(" expanded to:\n " , " \n " , " " ))
8084 result
8185
@@ -120,7 +124,7 @@ class MacroAnnotations:
120124
121125 /** Check that this tree can be added by the macro annotation */
122126 private def checkMacroDef (newTree : DefTree , annotatedTree : Tree , annot : Annotation )(using Context ) =
123- transform. TreeChecker .checkMacroGeneratedTree(annotatedTree, newTree)
127+ TreeChecker .checkMacroGeneratedTree(annotatedTree, newTree)
124128 val sym = newTree.symbol
125129 val annotated = annotatedTree.symbol
126130 if sym.isType && ! sym.isClass then
@@ -130,6 +134,22 @@ class MacroAnnotations:
130134 else if annotated.isClass && annotated.owner.is(Package ) /* && !sym.isClass*/ then
131135 report.error(i " macro annotation can not add top-level ${sym.showKind}. $annot tried to add $sym. " , annot.tree)
132136
137+ /**
138+ * Enter the symbols generated by MacroAnnotations
139+ */
140+ private def enterMissingSymbols (tree : DefTree )(using Context ) = new TreeTraverser {
141+ def traverse (tree : tpd.Tree )(using Context ): Unit = tree match
142+ case tdef @ TypeDef (_, template : Template ) =>
143+ val isSymbolInDecls = tdef.symbol.asClass.info.decls.toList.toSet
144+ for tree <- template.body do
145+ if tree.symbol.owner != tdef.symbol then
146+ report.error(em " Macro added a definition with the wrong owner - ${tree.symbol.owner} - ${tdef.symbol} in ${tree.source}" , tree.srcPos)
147+ else if ! isSymbolInDecls(tree.symbol) then
148+ tree.symbol.enteredAfter(phase)
149+ traverseChildren(tree)
150+ case _ => traverseChildren(tree)
151+ }.traverse(tree)
152+
133153object MacroAnnotations :
134154
135155 /** Is this an annotation that implements `scala.annation.MacroAnnotation` */
0 commit comments