@@ -12,7 +12,8 @@ import transform.MegaPhase.MiniPhase
1212import Decorators ._
1313import Symbols .Symbol
1414import Constants .Constant
15- import transform .{Pickler , Staging }
15+ import Types ._
16+ import transform .{SetDefTree , SetDefTreeOff }
1617
1718class InitChecker extends PluginPhase with StandardPlugin {
1819 import tpd ._
@@ -22,35 +23,45 @@ class InitChecker extends PluginPhase with StandardPlugin {
2223
2324 val phaseName = name
2425
25- override val runsAfter = Set (Staging .name)
26- override val runsBefore = Set (Pickler .name)
26+ override val runsAfter = Set (SetDefTree .name)
27+ override val runsBefore = Set (SetDefTreeOff .name)
2728
2829 def init (options : List [String ]): List [PluginPhase ] = this :: Nil
2930
3031 private def checkDef (tree : Tree )(implicit ctx : Context ): Tree = {
31- val span = tree.symbol.defTree.span
32- if (! (span.exists && span.end > span.start))
33- ctx.error(" cannot get tree for " + tree.symbol.show, tree.sourcePos)
32+ if (tree.symbol.defTree.isEmpty)
33+ ctx.error(" cannot get tree for " + tree.show, tree.sourcePos)
3434 tree
3535 }
3636
37- private def checkRef (tree : Tree )(implicit ctx : Context ): Tree = {
38- val helloPkgSym = ctx.requiredPackage(" hello" )
39- val libPkgSym = ctx.requiredPackage(" lib" )
40- val enclosingPkg = tree.symbol.enclosingPackageClass
41-
42- if (enclosingPkg == helloPkgSym) { // source code
43- checkDef(tree)
44- }
45- else if (enclosingPkg == libPkgSym) { // tasty from library
46- checkDef(tree)
47- // check that all sub-definitions have trees set properly
48- transformAllDeep(tree.symbol.defTree)
37+ private def checkable (sym : Symbol )(implicit ctx : Context ): Boolean =
38+ sym.exists && ! sym.isOneOf(Flags .Package ) && ! sym.isOneOf(Flags .Param ) &&
39+ (sym.isClass || ! sym.isOneOf(Flags .Case , butNot = Flags .Enum )) // pattern-bound symbols
40+
41+ private def checkRef (tree : Tree )(implicit ctx : Context ): Tree =
42+ if (! checkable(tree.symbol)) tree
43+ else {
44+ val helloPkgSym = ctx.requiredPackage(" hello" ).moduleClass
45+ val libPkgSym = ctx.requiredPackage(" lib" ).moduleClass
46+ val enclosingPkg = tree.symbol.enclosingPackageClass
47+
48+ if (enclosingPkg == helloPkgSym) { // source code
49+ checkDef(tree)
50+ ctx.warning(" tree: " + tree.symbol.defTree.show)
51+ }
52+ else if (enclosingPkg == libPkgSym) { // tasty from library
53+ checkDef(tree)
54+ // check that all sub-definitions have trees set properly
55+ // make sure that are no cycles in the code
56+ transformAllDeep(tree.symbol.defTree)
57+ ctx.warning(" tree: " + tree.symbol.defTree.show)
58+ }
59+ else {
60+ ctx.warning(tree.symbol + " is neither in lib nor hello, owner = " + enclosingPkg, tree.sourcePos)
61+ }
62+ tree
4963 }
5064
51- tree
52- }
53-
5465 override def transformValDef (tree : ValDef )(implicit ctx : Context ): Tree = checkDef(tree)
5566
5667 override def transformDefDef (tree : DefDef )(implicit ctx : Context ): Tree = checkDef(tree)
@@ -60,4 +71,12 @@ class InitChecker extends PluginPhase with StandardPlugin {
6071 override def transformSelect (tree : Select )(implicit ctx : Context ): Tree = checkRef(tree)
6172
6273 override def transformIdent (tree : Ident )(implicit ctx : Context ): Tree = checkRef(tree)
74+
75+ override def transformTypeTree (tree : TypeTree )(implicit ctx : Context ): Tree = {
76+ tree.tpe.foreachPart {
77+ case tp : NamedType => checkRef(TypeTree (tp))
78+ case _ =>
79+ }
80+ tree
81+ }
6382}
0 commit comments