@@ -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,14 @@ 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+ enterMissingSymbols(prefixedTree)
65+ for suffixedTree <- suffixed do
66+ checkMacroDef(suffixedTree, tree, annot)
67+ enterMissingSymbols(suffixedTree)
68+ TreeChecker .checkMacroGeneratedTree(tree, newTree)
69+ enterMissingSymbols(newTree)
6470 newTree
6571 case (Nil , Nil ) =>
6672 report.error(i " Unexpected `Nil` returned by `( ${annot.tree}).transform(..)` during macro expansion " , annot.tree.srcPos)
@@ -120,7 +126,7 @@ class MacroAnnotations:
120126
121127 /** Check that this tree can be added by the macro annotation */
122128 private def checkMacroDef (newTree : DefTree , annotatedTree : Tree , annot : Annotation )(using Context ) =
123- transform. TreeChecker .checkMacroGeneratedTree(annotatedTree, newTree)
129+ TreeChecker .checkMacroGeneratedTree(annotatedTree, newTree)
124130 val sym = newTree.symbol
125131 val annotated = annotatedTree.symbol
126132 if sym.isType && ! sym.isClass then
@@ -130,6 +136,20 @@ class MacroAnnotations:
130136 else if annotated.isClass && annotated.owner.is(Package ) /* && !sym.isClass*/ then
131137 report.error(i " macro annotation can not add top-level ${sym.showKind}. $annot tried to add $sym. " , annot.tree)
132138
139+ private def enterMissingSymbols (tree : MemberDef )(using Context ) = new TreeTraverser {
140+ def traverse (tree : tpd.Tree )(using Context ): Unit = tree match
141+ case tdef @ TypeDef (_, template : Template ) =>
142+ // for tree <- template.constr :: template.body do
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}" )
147+ else if ! isSymbolInDecls(tree.symbol) then
148+ tree.symbol.enteredAfter(phase)
149+ traverseChildren(tree) // Taverse before or after dealing with this class?
150+ case _ => traverseChildren(tree)
151+ }.traverse(tree)
152+
133153object MacroAnnotations :
134154
135155 /** Is this an annotation that implements `scala.annation.MacroAnnotation` */
0 commit comments