@@ -367,18 +367,22 @@ object RefChecks {
367
367
def subMember (s : Symbol ) = s derivesFrom member.owner
368
368
369
369
if (subOther(member.owner) && deferredCheck)
370
+ // println(i"skip 1 ${member.showLocated}, ${other.showLocated}")
370
371
// Console.println(infoString(member) + " shadows1 " + infoString(other) " in " + clazz);//DEBUG
371
372
return
373
+ /*
372
374
val parentSymbols = clazz.info.parents.map(_.typeSymbol)
373
375
def matchIn(parent: Symbol): Boolean = considerMatching(member, other, parent.thisType)
374
376
if parentSymbols.exists(p =>
375
377
subOther(p) && subMember(p) && deferredCheck && matchIn(p))
376
378
then
379
+ println(i"skip 2 ${member.showLocated}, ${other.showLocated}")
377
380
//Console.println(infoString(member) + " shadows2 " + infoString(other) + " in " + clazz);//DEBUG
378
381
return
379
382
if parentSymbols.forall(p => subOther(p) == subMember(p) && matchIn(p)) then
383
+ println(i"skip 3 ${member.showLocated}, ${other.showLocated}")
380
384
//Console.println(infoString(member) + " shadows " + infoString(other) + " in " + clazz);//DEBUG
381
- return
385
+ return*/
382
386
}
383
387
384
388
/* Is the intersection between given two lists of overridden symbols empty? */
@@ -508,21 +512,27 @@ object RefChecks {
508
512
* - matching names and types, but different target names
509
513
*/
510
514
def considerMatching (sym1 : Symbol , sym2 : Symbol , self : Type ): Boolean =
511
- ! (sym1.owner.is(JavaDefined , butNot = Trait ) && sym2.owner.is(JavaDefined , butNot = Trait )) && // javac already handles these checks
512
- (sym1.isType || {
513
- val sd1 = sym1.asSeenFrom(self)
514
- val sd2 = sym2.asSeenFrom(self)
515
- sd1.matchesLoosely(sd2)
515
+ if sym1.owner.is(JavaDefined , butNot = Trait )
516
+ && sym2.owner.is(JavaDefined , butNot = Trait )
517
+ then false // javac already handles these checks
518
+ else if sym1.isType then true
519
+ else
520
+ val sd1 = sym1.asSeenFrom(self)
521
+ val sd2 = sym2.asSeenFrom(self)
522
+ sd1.matchesLoosely(sd2)
516
523
&& (sym1.hasTargetName(sym2.targetName)
517
524
|| compatibleTypes(sym1, sd1.info, sym2, sd2.info))
518
- })
519
525
520
526
val opc = new OverridingPairs .Cursor (clazz):
521
527
override def matches (sym1 : Symbol , sym2 : Symbol ): Boolean =
522
528
considerMatching(sym1, sym2, self)
529
+
530
+ // We can exclude pairs safely from checking only of they also matched in
531
+ // the parent class. See neg/i12828.scala for an example where this matters.
523
532
override def canBeHandledByParent (sym1 : Symbol , sym2 : Symbol , parentType : Type ): Boolean =
524
533
considerMatching(sym1, sym2, parentType)
525
534
.showing(i " already handled ${sym1.showLocated}: ${sym1.asSeenFrom(parentType).signature}, ${sym2.showLocated}: ${sym2.asSeenFrom(parentType).signature} = $result" , refcheck)
535
+ end opc
526
536
527
537
while opc.hasNext do
528
538
checkOverride(opc.overriding, opc.overridden)
@@ -535,13 +545,11 @@ object RefChecks {
535
545
//
536
546
// class A { type T = B }
537
547
// class B extends A { override type T }
538
- for
539
- dcl <- clazz.info.decls.iterator
540
- if dcl.is(Deferred )
541
- other <- dcl.allOverriddenSymbols
542
- if ! other.is(Deferred )
543
- do
544
- checkOverride(dcl, other)
548
+ for dcl <- clazz.info.decls.iterator do
549
+ if dcl.is(Deferred ) then
550
+ for other <- dcl.allOverriddenSymbols do
551
+ if ! other.is(Deferred ) then
552
+ checkOverride(dcl, other)
545
553
546
554
printMixinOverrideErrors()
547
555
0 commit comments