@@ -1131,6 +1131,7 @@ class TreeUnpickler(reader: TastyReader,
11311131
11321132 def makeSelect (qual : Tree , name : Name , denot : Denotation ): Select =
11331133 var qualType = qual.tpe.widenIfUnstable
1134+ val owner = denot.symbol.maybeOwner
11341135 val tpe0 = name match
11351136 case name : TypeName => TypeRef (qualType, name, denot)
11361137 case name : TermName => TermRef (qualType, name, denot)
@@ -1142,43 +1143,6 @@ class TreeUnpickler(reader: TastyReader,
11421143 val denot = accessibleDenot(qual.tpe.widenIfUnstable, name, sig, target)
11431144 makeSelect(qual, name, denot)
11441145
1145- def readSelectIn (): Select =
1146- var sname = readName()
1147- val qual = readTerm()
1148- val ownerTpe = readType()
1149- val owner = ownerTpe.typeSymbol
1150- val SignedName (name, sig, target) = sname : @ unchecked // only methods with params use SELECTin
1151- val qualType = qual.tpe.widenIfUnstable
1152- val prefix = ctx.typeAssigner.maybeSkolemizePrefix(qualType, name)
1153-
1154- /** Tasty should still be able to resolve a method from another root class,
1155- * even if it has been moved to a super type,
1156- * or an override has been removed.
1157- *
1158- * This is tested in
1159- * - sbt-test/tasty-compat/remove-override
1160- * - sbt-test/tasty-compat/move-method
1161- */
1162- def lookupInSuper =
1163- val cls = ownerTpe.classSymbol
1164- if cls.exists then
1165- cls.asClass.classDenot
1166- .findMember(name, cls.thisType, EmptyFlags , excluded= Private )
1167- .atSignature(sig, target)
1168- else
1169- NoDenotation
1170-
1171- val denot =
1172- val d = ownerTpe.decl(name).atSignature(sig, target)
1173- (if ! d.exists then lookupInSuper else d).asSeenFrom(prefix)
1174-
1175- makeSelect(qual, name, denot)
1176-
1177- def readSelectInPoly (): Select =
1178- val tree = readSelectIn()
1179- val info = readType()
1180- tree.withType(tree.symbol.copy(info = info).termRef)
1181-
11821146 def readQualId (): (untpd.Ident , TypeRef ) =
11831147 val qual = readTerm().asInstanceOf [untpd.Ident ]
11841148 (untpd.Ident (qual.name).withSpan(qual.span), qual.tpe.asInstanceOf [TypeRef ])
@@ -1269,13 +1233,25 @@ class TreeUnpickler(reader: TastyReader,
12691233 val fn = readTerm()
12701234 val args = until(end)(readTerm())
12711235 if fn.symbol.isConstructor then constructorApply(fn, args)
1272- else tpd.Apply (fn, args)
1236+ else if defn.isPolymorphicSignature(fn.symbol) then
1237+ val info = MethodType (args.map(_.tpe.widen), defn.ObjectType )
1238+ val fun2 = fn.withType(fn.symbol.copy(info = info).termRef)
1239+ tpd.Apply (fun2, args)
1240+ else
1241+ tpd.Apply (fn, args)
12731242 case TYPEAPPLY =>
12741243 tpd.TypeApply (readTerm(), until(end)(readTpt()))
12751244 case TYPED =>
12761245 val expr = readTerm()
12771246 val tpt = readTpt()
1278- Typed (expr, tpt)
1247+ expr match
1248+ case Apply (fun, args) if defn.wasPolymorphicSignature(fun.symbol) =>
1249+ val info = MethodType (args.map(_.tpe.widen), tpt.tpe)
1250+ val fun2 = fun.withType(fun.symbol.copy(info = info).termRef)
1251+ val expr2 = tpd.cpy.Apply (expr)(fun2, args)
1252+ Typed (expr2, tpt)
1253+ case _ =>
1254+ Typed (expr, tpt)
12791255 case ASSIGN =>
12801256 Assign (readTerm(), readTerm())
12811257 case BLOCK =>
@@ -1328,8 +1304,37 @@ class TreeUnpickler(reader: TastyReader,
13281304 case SELECTouter =>
13291305 val levels = readNat()
13301306 readTerm().outerSelect(levels, SkolemType (readType()))
1331- case SELECTin => readSelectIn()
1332- case SELECTinPoly => readSelectInPoly()
1307+ case SELECTin =>
1308+ var sname = readName()
1309+ val qual = readTerm()
1310+ val ownerTpe = readType()
1311+ val owner = ownerTpe.typeSymbol
1312+ val SignedName (name, sig, target) = sname : @ unchecked // only methods with params use SELECTin
1313+ val qualType = qual.tpe.widenIfUnstable
1314+ val prefix = ctx.typeAssigner.maybeSkolemizePrefix(qualType, name)
1315+
1316+ /** Tasty should still be able to resolve a method from another root class,
1317+ * even if it has been moved to a super type,
1318+ * or an override has been removed.
1319+ *
1320+ * This is tested in
1321+ * - sbt-test/tasty-compat/remove-override
1322+ * - sbt-test/tasty-compat/move-method
1323+ */
1324+ def lookupInSuper =
1325+ val cls = ownerTpe.classSymbol
1326+ if cls.exists then
1327+ cls.asClass.classDenot
1328+ .findMember(name, cls.thisType, EmptyFlags , excluded= Private )
1329+ .atSignature(sig, target)
1330+ else
1331+ NoDenotation
1332+
1333+ val denot =
1334+ val d = ownerTpe.decl(name).atSignature(sig, target)
1335+ (if ! d.exists then lookupInSuper else d).asSeenFrom(prefix)
1336+
1337+ makeSelect(qual, name, denot)
13331338 case REPEATED =>
13341339 val elemtpt = readTpt()
13351340 SeqLiteral (until(end)(readTerm()), elemtpt)
0 commit comments