@@ -12,7 +12,8 @@ import transform.MegaPhase.MiniPhase
12
12
import Decorators ._
13
13
import Symbols .Symbol
14
14
import Constants .Constant
15
- import transform .{Pickler , Staging }
15
+ import Types ._
16
+ import transform .{SetDefTree , SetDefTreeOff }
16
17
17
18
class InitChecker extends PluginPhase with StandardPlugin {
18
19
import tpd ._
@@ -22,35 +23,45 @@ class InitChecker extends PluginPhase with StandardPlugin {
22
23
23
24
val phaseName = name
24
25
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)
27
28
28
29
def init (options : List [String ]): List [PluginPhase ] = this :: Nil
29
30
30
31
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)
34
34
tree
35
35
}
36
36
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
49
63
}
50
64
51
- tree
52
- }
53
-
54
65
override def transformValDef (tree : ValDef )(implicit ctx : Context ): Tree = checkDef(tree)
55
66
56
67
override def transformDefDef (tree : DefDef )(implicit ctx : Context ): Tree = checkDef(tree)
@@ -60,4 +71,12 @@ class InitChecker extends PluginPhase with StandardPlugin {
60
71
override def transformSelect (tree : Select )(implicit ctx : Context ): Tree = checkRef(tree)
61
72
62
73
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
+ }
63
82
}
0 commit comments