@@ -8,10 +8,11 @@ import Symbols.*
8
8
import Types .*
9
9
import StdNames .*
10
10
import NameKinds .OuterSelectName
11
+ import util .Property
11
12
12
13
import ast .tpd .*
13
14
import config .Printers .init as printer
14
- import reporting .trace as log
15
+ import reporting .trace . force as log
15
16
16
17
import Semantic .Arg
17
18
import Semantic .NewExpr
@@ -46,6 +47,8 @@ import scala.annotation.tailrec
46
47
object ParamOverridingCheck :
47
48
type Contextual [T ] = Context ?=> T
48
49
50
+ private val IsInSuperCall = new Property .Key [Boolean ]
51
+
49
52
// ----------------------- Domain definitions --------------------------------
50
53
51
54
sealed abstract class Value :
@@ -81,7 +84,12 @@ object ParamOverridingCheck:
81
84
def select (field : Symbol , receiver : Type , needResolve : Boolean = true , source : Tree ): Contextual [Value ] = log(" select " + field.show + " , this = " + value, printer) {
82
85
value match
83
86
case ref : ThisRef =>
84
- val target = if needResolve then Semantic .resolve(ref.klass, field) else field
87
+ val target =
88
+ if needResolve && ! ctx.property(IsInSuperCall ).nonEmpty then
89
+ Semantic .resolve(ref.klass, field)
90
+ else
91
+ field
92
+
85
93
if target.is(Flags .Lazy ) then
86
94
val rhs = target.defTree.asInstanceOf [ValDef ].rhs
87
95
eval(rhs, ref, target.owner.asClass)
@@ -256,11 +264,13 @@ object ParamOverridingCheck:
256
264
def initParent (parent : Tree ) =
257
265
parent match
258
266
case tree @ Block (stats, NewExpr (tref, New (tpt), ctor, argss)) => // can happen
259
- val args = evalArgs(argss.flatten, thisV, klass)
267
+ val ctx2 = ctx.withProperty(IsInSuperCall , Some (true ))
268
+ val args = evalArgs(argss.flatten, thisV, klass)(using ctx2)
260
269
superCall(tref, ctor, args)
261
270
262
271
case tree @ NewExpr (tref, New (tpt), ctor, argss) => // extends A(args)
263
- val args = evalArgs(argss.flatten, thisV, klass)
272
+ val ctx2 = ctx.withProperty(IsInSuperCall , Some (true ))
273
+ val args = evalArgs(argss.flatten, thisV, klass)(using ctx2)
264
274
superCall(tref, ctor, args)
265
275
266
276
case _ => // extends A or extends A[T]
@@ -314,13 +324,13 @@ object ParamOverridingCheck:
314
324
do
315
325
// println(paramSym.show + " is overridden in " + thisV.klass)
316
326
if ! overridingSym.is(Flags .ParamAccessor ) then
317
- report.warning(" Overriding parameter " + paramSym.show + " in " + klass + " as non-parameter in " + thisV.klass, overridingSym.defTree)
327
+ report.warning(" Overriding parameter " + paramSym.show + " in " + klass.show + " as non-parameter in " + thisV.klass.show , overridingSym.defTree)
318
328
else
319
329
val overridingValue = thisV.field(overridingSym)
320
330
// println(overridingSym.show + " in " + thisV.klass + " = " + overridingValue)
321
331
// println(paramSym.show + " in " + klass + " = " + thisV.field(paramSym))
322
332
if thisV.field(paramSym) != overridingValue then
323
- report.warning(" Incorrect overriding: " + paramSym.show + " in " + klass + " have different value from " + overridingSym.show + " in " + thisV.klass, overridingValue.source)
333
+ report.warning(" Incorrect overriding: " + paramSym.show + " in " + klass.show + " has a different value from " + overridingSym.show + " in " + thisV.klass.show , overridingValue.source)
324
334
325
335
thisV
326
336
}
0 commit comments