@@ -33,33 +33,38 @@ class Checker extends Phase {
33
33
34
34
override def runOn (units : List [CompilationUnit ])(using Context ): List [CompilationUnit ] =
35
35
units.foreach { unit => traverser.traverse(unit.tpdTree) }
36
+ semantic.check()
36
37
super .runOn(units)
37
38
39
+ def run (using Context ): Unit = {
40
+ // ignore, we already called `semantic.check()` in `runOn`
41
+ }
42
+
38
43
val traverser = new TreeTraverser {
39
44
override def traverse (tree : Tree )(using Context ): Unit =
40
45
traverseChildren(tree)
41
46
tree match {
42
- case tdef : MemberDef =>
47
+ case mdef : MemberDef =>
43
48
// self-type annotation ValDef has no symbol
44
- if tdef.name != nme.WILDCARD then
45
- tdef.symbol.defTree = tree
49
+ if mdef.name != nme.WILDCARD then
50
+ mdef.symbol.defTree = tree
51
+
52
+ mdef match
53
+ case tdef : TypeDef if tdef.isClassDef =>
54
+ import semantic ._
55
+ val cls = tdef.symbol.asClass
56
+ val ctor = cls.primaryConstructor
57
+ val args = ctor.defTree.asInstanceOf [DefDef ].termParamss.flatten.map(_ => Hot )
58
+ val outer = Hot
59
+ val thisRef = ThisRef (cls, outer, ctor, args)
60
+ if shouldCheckClass(cls) then semantic.addTask(thisRef)(using Trace .empty)
61
+ case _ =>
62
+
46
63
case _ =>
47
64
}
48
65
}
49
66
50
- override def run (using Context ): Unit = {
51
- val unit = ctx.compilationUnit
52
- unit.tpdTree.foreachSubTree {
53
- case tdef : TypeDef if tdef.isClassDef =>
54
- transformTypeDef(tdef)
55
-
56
- case _ =>
57
- }
58
- }
59
-
60
-
61
- private def transformTypeDef (tree : TypeDef )(using Context ): tpd.Tree = {
62
- val cls = tree.symbol.asClass
67
+ private def shouldCheckClass (cls : ClassSymbol )(using Context ) = {
63
68
val instantiable : Boolean =
64
69
cls.is(Flags .Module ) ||
65
70
! cls.isOneOf(Flags .AbstractOrTrait ) && {
@@ -71,21 +76,6 @@ class Checker extends Phase {
71
76
}
72
77
73
78
// A concrete class may not be instantiated if the self type is not satisfied
74
- if (instantiable && cls.enclosingPackageClass != defn.StdLibPatchesPackage .moduleClass) {
75
- import semantic ._
76
- val tpl = tree.rhs.asInstanceOf [Template ]
77
- val thisRef = ThisRef (cls).ensureExists
78
-
79
- val paramValues = tpl.constr.termParamss.flatten.map(param => param.symbol -> Hot ).toMap
80
-
81
- given Promoted = Promoted .empty
82
- given Trace = Trace .empty
83
- given Env = Env (paramValues)
84
-
85
- val res = eval(tpl, thisRef, cls)
86
- res.errors.foreach(_.issue)
87
- }
88
-
89
- tree
79
+ instantiable && cls.enclosingPackageClass != defn.StdLibPatchesPackage .moduleClass
90
80
}
91
81
}
0 commit comments