@@ -31,6 +31,7 @@ import dotty.tools.dotc.core.Types.*
3131import  dotty .tools .dotc .core .TypeErasure 
3232import  dotty .tools .dotc .transform .GenericSignatures 
3333import  dotty .tools .dotc .transform .ElimErasedValueType 
34+ import  dotty .tools .dotc .transform .Mixin 
3435import  dotty .tools .io .AbstractFile 
3536import  dotty .tools .dotc .report 
3637
@@ -395,12 +396,20 @@ trait BCodeHelpers extends BCodeIdiomatic {
395396     */  
396397    def  getGenericSignature (sym : Symbol , owner : Symbol ):  String  =  {
397398      atPhase(erasurePhase) {
398-         val   memberTpe  = 
399+         def   computeMemberTpe () :   Type  = 
399400          if  (sym.is(Method )) sym.denot.info
400401          else  if  sym.denot.validFor.phaseId >  erasurePhase.id &&  sym.isField &&  sym.getter.exists then 
401402            //  Memoization field of getter entered after erasure, see run/i17069 for an example
402403            sym.getter.denot.info.resultType
403404          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+ 
404413        getGenericSignatureHelper(sym, owner, memberTpe).orNull
405414      }
406415    }
@@ -491,7 +500,7 @@ trait BCodeHelpers extends BCodeIdiomatic {
491500      report.debuglog(s " Potentially conflicting names for forwarders:  $conflictingNames" )
492501
493502      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
495504        if  (m ==  NoSymbol )
496505          report.log(s " $m0 is a bridge method that overrides nothing, something went wrong in a previous phase. " )
497506        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 {
507516          //  we generate ACC_SYNTHETIC forwarders so Java compilers ignore them.
508517          val  isSynthetic  = 
509518            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 )
514520          addForwarder(jclass, moduleClass, m, isSynthetic)
515521        }
516522      }
0 commit comments