Skip to content

Commit d93e7c0

Browse files
committed
update Analyzer
1 parent c8c598f commit d93e7c0

File tree

1 file changed

+40
-21
lines changed

1 file changed

+40
-21
lines changed

sbt-dotty/sbt-test/sbt-dotty/analyzer-plugin/plugin/Analyzer.scala

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import transform.MegaPhase.MiniPhase
1212
import Decorators._
1313
import Symbols.Symbol
1414
import Constants.Constant
15-
import transform.{Pickler, Staging}
15+
import Types._
16+
import transform.{SetDefTree, SetDefTreeOff}
1617

1718
class 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

Comments
 (0)