@@ -1130,7 +1130,6 @@ class TreeUnpickler(reader: TastyReader,
11301130
11311131 def makeSelect (qual : Tree , name : Name , denot : Denotation ): Select =
11321132 var qualType = qual.tpe.widenIfUnstable
1133- val owner = denot.symbol.maybeOwner
11341133 val tpe0 = name match
11351134 case name : TypeName => TypeRef (qualType, name, denot)
11361135 case name : TermName => TermRef (qualType, name, denot)
@@ -1142,6 +1141,43 @@ class TreeUnpickler(reader: TastyReader,
11421141 val denot = accessibleDenot(qual.tpe.widenIfUnstable, name, sig, target)
11431142 makeSelect(qual, name, denot)
11441143
1144+ def readSelectIn (): Select =
1145+ var sname = readName()
1146+ val qual = readTerm()
1147+ val ownerTpe = readType()
1148+ val owner = ownerTpe.typeSymbol
1149+ val SignedName (name, sig, target) = sname : @ unchecked // only methods with params use SELECTin
1150+ val qualType = qual.tpe.widenIfUnstable
1151+ val prefix = ctx.typeAssigner.maybeSkolemizePrefix(qualType, name)
1152+
1153+ /** Tasty should still be able to resolve a method from another root class,
1154+ * even if it has been moved to a super type,
1155+ * or an override has been removed.
1156+ *
1157+ * This is tested in
1158+ * - sbt-test/tasty-compat/remove-override
1159+ * - sbt-test/tasty-compat/move-method
1160+ */
1161+ def lookupInSuper =
1162+ val cls = ownerTpe.classSymbol
1163+ if cls.exists then
1164+ cls.asClass.classDenot
1165+ .findMember(name, cls.thisType, EmptyFlags , excluded= Private )
1166+ .atSignature(sig, target)
1167+ else
1168+ NoDenotation
1169+
1170+ val denot =
1171+ val d = ownerTpe.decl(name).atSignature(sig, target)
1172+ (if ! d.exists then lookupInSuper else d).asSeenFrom(prefix)
1173+
1174+ makeSelect(qual, name, denot)
1175+
1176+ def readSelectInPoly (): Select =
1177+ val tree = readSelectIn()
1178+ val info = readType()
1179+ tree.withType(tree.symbol.copy(info = info).termRef)
1180+
11451181 def readQualId (): (untpd.Ident , TypeRef ) =
11461182 val qual = readTerm().asInstanceOf [untpd.Ident ]
11471183 (untpd.Ident (qual.name).withSpan(qual.span), qual.tpe.asInstanceOf [TypeRef ])
@@ -1290,37 +1326,8 @@ class TreeUnpickler(reader: TastyReader,
12901326 case SELECTouter =>
12911327 val levels = readNat()
12921328 readTerm().outerSelect(levels, SkolemType (readType()))
1293- case SELECTin =>
1294- var sname = readName()
1295- val qual = readTerm()
1296- val ownerTpe = readType()
1297- val owner = ownerTpe.typeSymbol
1298- val SignedName (name, sig, target) = sname : @ unchecked // only methods with params use SELECTin
1299- val qualType = qual.tpe.widenIfUnstable
1300- val prefix = ctx.typeAssigner.maybeSkolemizePrefix(qualType, name)
1301-
1302- /** Tasty should still be able to resolve a method from another root class,
1303- * even if it has been moved to a super type,
1304- * or an override has been removed.
1305- *
1306- * This is tested in
1307- * - sbt-test/tasty-compat/remove-override
1308- * - sbt-test/tasty-compat/move-method
1309- */
1310- def lookupInSuper =
1311- val cls = ownerTpe.classSymbol
1312- if cls.exists then
1313- cls.asClass.classDenot
1314- .findMember(name, cls.thisType, EmptyFlags , excluded= Private )
1315- .atSignature(sig, target)
1316- else
1317- NoDenotation
1318-
1319- val denot =
1320- val d = ownerTpe.decl(name).atSignature(sig, target)
1321- (if ! d.exists then lookupInSuper else d).asSeenFrom(prefix)
1322-
1323- makeSelect(qual, name, denot)
1329+ case SELECTin => readSelectIn()
1330+ case SELECTinPoly => readSelectInPoly()
13241331 case REPEATED =>
13251332 val elemtpt = readTpt()
13261333 SeqLiteral (until(end)(readTerm()), elemtpt)
0 commit comments