@@ -432,19 +432,10 @@ object Semantic {
432
432
val cls = target.owner.enclosingClass.asClass
433
433
val ddef = target.defTree.asInstanceOf [DefDef ]
434
434
val env2 = Env (ddef, args.map(_.value).widenArgs)
435
- if target.isPrimaryConstructor then
436
- given Env = env2
437
- val tpl = cls.defTree.asInstanceOf [TypeDef ].rhs.asInstanceOf [Template ]
438
- val res = withTrace(trace.add(cls.defTree)) { eval(tpl, ref, cls, cacheResult = true ) }
439
- Result (ref, res.errors)
440
- else if target.isConstructor then
441
- given Env = env2
442
- eval(ddef.rhs, ref, cls, cacheResult = true )
443
- else
444
- // normal method call
445
- withEnv(if isLocal then env else Env .empty) {
446
- eval(ddef.rhs, ref, cls, cacheResult = true ) ++ checkArgs
447
- }
435
+ // normal method call
436
+ withEnv(if isLocal then env else Env .empty) {
437
+ eval(ddef.rhs, ref, cls, cacheResult = true ) ++ checkArgs
438
+ }
448
439
else if ref.canIgnoreMethodCall(target) then
449
440
Result (Hot , Nil )
450
441
else
@@ -475,6 +466,37 @@ object Semantic {
475
466
}
476
467
}
477
468
469
+ def callConstructor (ctor : Symbol , args : List [ArgInfo ], source : Tree ): Contextual [Result ] = log(" call " + ctor.show + " , args = " + args, printer, res => res.asInstanceOf [Result ].show) {
470
+ value match {
471
+ case Hot | Cold | _ : RefSet | _ : Fun =>
472
+ report.error(" unexpected constructor call, meth = " + ctor + " , value = " + value, source)
473
+ Result (Hot , Nil )
474
+
475
+ case ref : Ref =>
476
+ val trace1 = trace.add(source)
477
+ if ctor.hasSource then
478
+ given Trace = trace1
479
+ val cls = ctor.owner.enclosingClass.asClass
480
+ val ddef = ctor.defTree.asInstanceOf [DefDef ]
481
+ val env2 = Env (ddef, args.map(_.value).widenArgs)
482
+ if ctor.isPrimaryConstructor then
483
+ given Env = env2
484
+ val tpl = cls.defTree.asInstanceOf [TypeDef ].rhs.asInstanceOf [Template ]
485
+ val res = withTrace(trace.add(cls.defTree)) { eval(tpl, ref, cls, cacheResult = true ) }
486
+ Result (ref, res.errors)
487
+ else
488
+ given Env = env2
489
+ eval(ddef.rhs, ref, cls, cacheResult = true )
490
+ else if ref.canIgnoreMethodCall(ctor) then
491
+ Result (Hot , Nil )
492
+ else
493
+ // no source code available
494
+ val error = CallUnknown (ctor, source, trace.toVector)
495
+ Result (Hot , error :: Nil )
496
+ }
497
+
498
+ }
499
+
478
500
/** Handle a new expression `new p.C` where `p` is abstracted by `value` */
479
501
def instantiate (klass : ClassSymbol , ctor : Symbol , args : List [ArgInfo ], source : Tree ): Contextual [Result ] = log(" instantiating " + klass.show + " , value = " + value + " , args = " + args, printer, res => res.asInstanceOf [Result ].show) {
480
502
val trace1 = trace.add(source)
@@ -493,10 +515,10 @@ object Semantic {
493
515
Result (Hot , Errors .empty)
494
516
else
495
517
val outer = Hot
496
- val value = Warm (klass, outer, ctor, args2)
497
- val task = ThisRef (klass, outer, ctor, args2)
498
- this .addTask(task )
499
- Result (value, Errors .empty )
518
+ val warm = Warm (klass, outer, ctor, args2)
519
+ val argInfos2 = args.zip(args2).map { (argInfo, v) => argInfo.copy(value = v) }
520
+ val res = warm.callConstructor(ctor, argInfos2, source )
521
+ Result (warm, res.errors )
500
522
501
523
case Cold =>
502
524
val error = CallCold (ctor, source, trace1.toVector)
@@ -510,10 +532,10 @@ object Semantic {
510
532
case _ => ref
511
533
512
534
val argsWidened = args.map(_.value).widenArgs
513
- val value = Warm (klass, outer, ctor, argsWidened)
514
- val task = ThisRef (klass, outer, ctor, argsWidened)
515
- this .addTask(task )
516
- Result (value, Errors .empty )
535
+ val argInfos2 = args.zip(argsWidened).map { (argInfo, v) => argInfo.copy(value = v) }
536
+ val warm = Warm (klass, outer, ctor, argsWidened)
537
+ val res = warm.callConstructor(ctor, argInfos2, source )
538
+ Result (warm, res.errors )
517
539
518
540
case Fun (body, thisV, klass, env) =>
519
541
report.error(" unexpected tree in instantiating a function, fun = " + body.show, source)
@@ -1132,7 +1154,7 @@ object Semantic {
1132
1154
if cls.hasSource then
1133
1155
tasks.append { () =>
1134
1156
printer.println(" init super class " + cls.show)
1135
- val res2 = thisV.call (ctor, args, superType = NoType , source)
1157
+ val res2 = thisV.callConstructor (ctor, args, source)
1136
1158
errorBuffer ++= res2.errors
1137
1159
()
1138
1160
}
0 commit comments