@@ -591,17 +591,17 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
591
591
tp
592
592
case tp : TypeRef =>
593
593
val sym = tp.symbol
594
- if ( ! sym.isClass) this (tp.translucentSuperType )
595
- else if ( semiEraseVCs && isDerivedValueClass(sym)) eraseDerivedValueClass(tp)
596
- else if ( defn.isSyntheticFunctionClass(sym)) defn.functionTypeErasure(sym)
594
+ if ! sym.isClass then this (checkedSuperType(tp) )
595
+ else if semiEraseVCs && isDerivedValueClass(sym) then eraseDerivedValueClass(tp)
596
+ else if defn.isSyntheticFunctionClass(sym) then defn.functionTypeErasure(sym)
597
597
else eraseNormalClassRef(tp)
598
598
case tp : AppliedType =>
599
599
val tycon = tp.tycon
600
600
if (tycon.isRef(defn.ArrayClass )) eraseArray(tp)
601
601
else if (tycon.isRef(defn.PairClass )) erasePair(tp)
602
602
else if (tp.isRepeatedParam) apply(tp.translateFromRepeated(toArray = sourceLanguage.isJava))
603
603
else if (semiEraseVCs && isDerivedValueClass(tycon.classSymbol)) eraseDerivedValueClass(tp)
604
- else apply(tp.translucentSuperType )
604
+ else this (checkedSuperType(tp) )
605
605
case tp : TermRef =>
606
606
this (underlyingOfTermRef(tp))
607
607
case _ : ThisType =>
@@ -689,6 +689,18 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
689
689
tp
690
690
}
691
691
692
+ /** Like translucentSuperType, but issue a fatal error if it does not exist. */
693
+ private def checkedSuperType (tp : TypeProxy )(using Context ): Type =
694
+ val tp1 = tp.translucentSuperType
695
+ if ! tp1.exists then
696
+ val msg = tp.typeConstructor match
697
+ case tycon : TypeRef =>
698
+ MissingType (tycon.prefix, tycon.name).toMessage.message
699
+ case _ =>
700
+ i " Cannot resolve reference to $tp"
701
+ throw FatalError (msg)
702
+ tp1
703
+
692
704
/** Widen term ref, skipping any `()` parameter of an eventual getter. Used to erase a TermRef.
693
705
* Since getters are introduced after erasure, one would think that erasing a TermRef
694
706
* could just use `widen`. However, it's possible that the TermRef got read from a class
@@ -815,7 +827,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
815
827
throw new MissingType (tp.prefix, tp.name)
816
828
val sym = tp.symbol
817
829
if (! sym.isClass) {
818
- val info = tp.translucentSuperType
830
+ val info = checkedSuperType(tp)
819
831
if (! info.exists) assert(false , i " undefined: $tp with symbol $sym" )
820
832
return sigName(info)
821
833
}
@@ -841,7 +853,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
841
853
sigName( // todo: what about repeatedParam?
842
854
if (erasureDependsOnArgs(sym)) this (tp)
843
855
else if (sym.isClass) tp.underlying
844
- else tp.translucentSuperType )
856
+ else checkedSuperType(tp) )
845
857
case ErasedValueType (_, underlying) =>
846
858
sigName(underlying)
847
859
case JavaArrayType (elem) =>
0 commit comments