Skip to content

Commit 28cb6a7

Browse files
committed
escape FromJavaObject in TASTy, recover at unpickle
1 parent ec2a0c1 commit 28cb6a7

File tree

2 files changed

+18
-12
lines changed

2 files changed

+18
-12
lines changed

compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import ast.{untpd, tpd}
1313
import Contexts.*, Symbols.*, Types.*, Names.*, Constants.*, Decorators.*, Annotations.*, Flags.*
1414
import Comments.{Comment, docCtx}
1515
import NameKinds.*
16-
import StdNames.nme
16+
import StdNames.{nme, tpnme}
1717
import config.Config
1818
import collection.mutable
1919
import reporting.{Profile, NoProfile}
@@ -49,6 +49,9 @@ class TreePickler(pickler: TastyPickler, attributes: Attributes) {
4949

5050
private var profile: Profile = NoProfile
5151

52+
private val isOutlinePickle: Boolean = attributes.isOutline
53+
private val isJavaPickle: Boolean = attributes.isJava
54+
5255
def treeAnnots(tree: untpd.MemberDef): List[Tree] =
5356
val ts = annotTrees.lookup(tree)
5457
if ts == null then Nil else ts.toList
@@ -188,19 +191,19 @@ class TreePickler(pickler: TastyPickler, attributes: Attributes) {
188191
def pickleExternalRef(sym: Symbol) = {
189192
val isShadowedRef =
190193
sym.isClass && tpe.prefix.member(sym.name).symbol != sym
191-
if (sym.is(Flags.Private) || isShadowedRef) {
194+
if sym.is(Flags.Private) || isShadowedRef then
192195
writeByte(if (tpe.isType) TYPEREFin else TERMREFin)
193196
withLength {
194197
pickleNameAndSig(sym.name, sym.signature, sym.targetName)
195198
pickleType(tpe.prefix)
196199
pickleType(sym.owner.typeRef)
197200
}
198-
}
199-
else {
201+
else if isJavaPickle && sym == defn.FromJavaObjectSymbol then
202+
pickleType(defn.ObjectType) // when unpickling Java TASTy, replace by <FromJavaObject>
203+
else
200204
writeByte(if (tpe.isType) TYPEREF else TERMREF)
201205
pickleNameAndSig(sym.name, tpe.signature, sym.targetName)
202-
pickleType(tpe.prefix)
203-
}
206+
pickleType(tpe.prefix)
204207
}
205208
if (sym.is(Flags.Package)) {
206209
writeByte(if (tpe.isType) TYPEREFpkg else TERMREFpkg)
@@ -342,7 +345,7 @@ class TreePickler(pickler: TastyPickler, attributes: Attributes) {
342345
case _: Template | _: Hole => pickleTree(tpt)
343346
case _ if tpt.isType => pickleTpt(tpt)
344347
}
345-
if attributes.isOutline && sym.isTerm && attributes.isJava then
348+
if isOutlinePickle && sym.isTerm && isJavaPickle then
346349
// TODO: if we introduce outline typing for Scala definitions
347350
// then we will need to update the check here
348351
pickleElidedUnlessEmpty(rhs, tpt.tpe)

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,11 @@ class TreeUnpickler(reader: TastyReader,
441441
readPackageRef().termRef
442442
case TYPEREF =>
443443
val name = readName().toTypeName
444-
TypeRef(readType(), name)
444+
val pre = readType()
445+
if unpicklingJava && name == tpnme.Object && (pre.termSymbol eq defn.JavaLangPackageVal) then
446+
defn.FromJavaObjectType
447+
else
448+
TypeRef(pre, name)
445449
case TERMREF =>
446450
val sname = readName()
447451
val prefix = readType()
@@ -1202,12 +1206,11 @@ class TreeUnpickler(reader: TastyReader,
12021206

12031207
def completeSelect(name: Name, sig: Signature, target: Name): Select =
12041208
val qual = readTree()
1205-
val denot0 = accessibleDenot(qual.tpe.widenIfUnstable, name, sig, target)
12061209
val denot =
1207-
if unpicklingJava && name == tpnme.Object && denot0.symbol == defn.ObjectClass then
1208-
defn.FromJavaObjectType.denot
1210+
if unpicklingJava && name == tpnme.Object && qual.symbol == defn.JavaLangPackageVal then
1211+
defn.FromJavaObjectSymbol.denot
12091212
else
1210-
denot0
1213+
accessibleDenot(qual.tpe.widenIfUnstable, name, sig, target)
12111214
makeSelect(qual, name, denot)
12121215

12131216
def readQualId(): (untpd.Ident, TypeRef) =

0 commit comments

Comments
 (0)