@@ -31,6 +31,7 @@ import dotty.tools.dotc.core.Types.*
31
31
import dotty .tools .dotc .core .TypeErasure
32
32
import dotty .tools .dotc .transform .GenericSignatures
33
33
import dotty .tools .dotc .transform .ElimErasedValueType
34
+ import dotty .tools .dotc .transform .Mixin
34
35
import dotty .tools .io .AbstractFile
35
36
import dotty .tools .dotc .report
36
37
@@ -395,12 +396,20 @@ trait BCodeHelpers extends BCodeIdiomatic {
395
396
*/
396
397
def getGenericSignature (sym : Symbol , owner : Symbol ): String = {
397
398
atPhase(erasurePhase) {
398
- val memberTpe =
399
+ def computeMemberTpe () : Type =
399
400
if (sym.is(Method )) sym.denot.info
400
401
else if sym.denot.validFor.phaseId > erasurePhase.id && sym.isField && sym.getter.exists then
401
402
// Memoization field of getter entered after erasure, see run/i17069 for an example
402
403
sym.getter.denot.info.resultType
403
404
else owner.denot.thisType.memberInfo(sym)
405
+
406
+ val memberTpe = if sym.is(MixedIn ) then
407
+ mixinPhase.asInstanceOf [Mixin ].mixinForwarderGenericInfos.get(sym) match
408
+ case Some (genericInfo) => genericInfo
409
+ case none => computeMemberTpe()
410
+ else
411
+ computeMemberTpe()
412
+
404
413
getGenericSignatureHelper(sym, owner, memberTpe).orNull
405
414
}
406
415
}
@@ -491,7 +500,7 @@ trait BCodeHelpers extends BCodeIdiomatic {
491
500
report.debuglog(s " Potentially conflicting names for forwarders: $conflictingNames" )
492
501
493
502
for (m0 <- sortedMembersBasedOnFlags(moduleClass.info, required = Method , excluded = ExcludedForwarder )) {
494
- val m = if (m0.is (Bridge )) m0.nextOverriddenSymbol else m0
503
+ val m = if (m0.isOneOf (Bridge | MixedIn )) m0.nextOverriddenSymbol else m0
495
504
if (m == NoSymbol )
496
505
report.log(s " $m0 is a bridge method that overrides nothing, something went wrong in a previous phase. " )
497
506
else if (m.isType || m.is(Deferred ) || (m.owner eq defn.ObjectClass ) || m.isConstructor || m.name.is(ExpandedName ))
@@ -507,10 +516,7 @@ trait BCodeHelpers extends BCodeIdiomatic {
507
516
// we generate ACC_SYNTHETIC forwarders so Java compilers ignore them.
508
517
val isSynthetic =
509
518
m0.name.is(NameKinds .SyntheticSetterName ) ||
510
- // Only hide bridges generated at Erasure, mixin forwarders are also
511
- // marked as bridge but shouldn't be hidden since they don't have a
512
- // non-bridge overload.
513
- m0.is(Bridge ) && m0.initial.validFor.firstPhaseId == erasurePhase.next.id
519
+ m0.is(Bridge )
514
520
addForwarder(jclass, moduleClass, m, isSynthetic)
515
521
}
516
522
}
0 commit comments