Skip to content

Commit 6b028ec

Browse files
committed
Add property IsInSuperCall to context
1 parent 3dc1cd7 commit 6b028ec

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

compiler/src/dotty/tools/dotc/transform/init/ParamOverridingCheck.scala

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import Symbols.*
88
import Types.*
99
import StdNames.*
1010
import NameKinds.OuterSelectName
11+
import util.Property
1112

1213
import ast.tpd.*
1314
import config.Printers.init as printer
14-
import reporting.trace as log
15+
import reporting.trace.force as log
1516

1617
import Semantic.Arg
1718
import Semantic.NewExpr
@@ -46,6 +47,8 @@ import scala.annotation.tailrec
4647
object ParamOverridingCheck:
4748
type Contextual[T] = Context ?=> T
4849

50+
private val IsInSuperCall = new Property.Key[Boolean]
51+
4952
// ----------------------- Domain definitions --------------------------------
5053

5154
sealed abstract class Value:
@@ -81,7 +84,12 @@ object ParamOverridingCheck:
8184
def select(field: Symbol, receiver: Type, needResolve: Boolean = true, source: Tree): Contextual[Value] = log("select " + field.show + ", this = " + value, printer) {
8285
value match
8386
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+
8593
if target.is(Flags.Lazy) then
8694
val rhs = target.defTree.asInstanceOf[ValDef].rhs
8795
eval(rhs, ref, target.owner.asClass)
@@ -256,11 +264,13 @@ object ParamOverridingCheck:
256264
def initParent(parent: Tree) =
257265
parent match
258266
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)
260269
superCall(tref, ctor, args)
261270

262271
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)
264274
superCall(tref, ctor, args)
265275

266276
case _ => // extends A or extends A[T]
@@ -314,13 +324,13 @@ object ParamOverridingCheck:
314324
do
315325
// println(paramSym.show + " is overridden in " + thisV.klass)
316326
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)
318328
else
319329
val overridingValue = thisV.field(overridingSym)
320330
// println(overridingSym.show + " in " + thisV.klass + " = " + overridingValue)
321331
// println(paramSym.show + " in " + klass + " = " + thisV.field(paramSym))
322332
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)
324334

325335
thisV
326336
}

0 commit comments

Comments
 (0)