Skip to content

Commit f68b703

Browse files
DarkDimiusnicolasstucki
authored andcommitted
WIP on reading binds without changing the format.
Instead of pickling binds multiple times, I use Term\Type-RefDirrect This works. But it is still tricky to figure out if bind defines a type or a term.
1 parent 09a9726 commit f68b703

File tree

3 files changed

+35
-16
lines changed

3 files changed

+35
-16
lines changed

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -153,16 +153,17 @@ class TreePickler(pickler: TastyPickler) {
153153
pickleName(sym.fullName)
154154
}
155155
else if (tpe.prefix == NoPrefix)
156-
if (sym is Flags.BindDefinedType) {
157-
registerDef(sym)
158-
writeByte(BIND)
159-
withLength {
160-
pickleName(sym.name)
161-
pickleType(sym.info)
162-
pickleDirectRef()
163-
}
164-
}
165-
else pickleDirectRef()
156+
// if (sym is Flags.BindDefinedType) {
157+
// registerDef(sym)
158+
// writeByte(BIND)
159+
// withLength {
160+
// pickleName(sym.name)
161+
// pickleType(sym.info)
162+
// pickleDirectRef()
163+
// }
164+
// }
165+
// else
166+
pickleDirectRef()
166167
else if (isLocallyDefined(sym)) {
167168
writeByte(if (tpe.isType) TYPEREFsymbol else TERMREFsymbol)
168169
pickleSymRef(sym); pickleType(tpe.prefix)

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

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
109109
val start = currentAddr
110110
val tag = readByte()
111111
tag match {
112-
case VALDEF | DEFDEF | TYPEDEF | TYPEPARAM | PARAM | TEMPLATE =>
112+
case VALDEF | DEFDEF | TYPEDEF | TYPEPARAM | PARAM | TEMPLATE | BIND =>
113113
val end = readEnd()
114114
for (i <- 0 until numRefs(tag)) readNat()
115115
if (tag == TEMPLATE) scanTrees(buf, end, MemberDefsOnly)
@@ -254,6 +254,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
254254
case TYPEARGtype =>
255255
TypeArgRef(readType(), readType().asInstanceOf[TypeRef], readNat())
256256
case BIND =>
257+
ctx.error("Should never happen, should be in tree")
257258
val sym = ctx.newSymbol(ctx.owner, readName().toTypeName, BindDefinedType, readType())
258259
registerSym(start, sym)
259260
if (currentAddr != end) readType()
@@ -412,6 +413,15 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
412413
val localDummy = ctx.newLocalDummy(ctx.owner)
413414
registerSym(currentAddr, localDummy)
414415
localDummy
416+
case BIND =>
417+
val start = currentAddr
418+
val tag = readByte()
419+
val end = readEnd()
420+
val name = readName()
421+
val info = new Completer(ctx.owner, subReader(start, end))
422+
val sym = ctx.newSymbol(ctx.owner, name, EmptyFlags, info)
423+
registerSym(start, sym)
424+
sym
415425
case tag =>
416426
throw new Error(s"illegal createSymbol at $currentAddr, tag = $tag")
417427
}
@@ -982,9 +992,9 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
982992
SeqLiteral(until(end)(readTerm()), elemtpt)
983993
case BIND =>
984994
val name = readName()
985-
val info = readType()
986-
val sym = ctx.newSymbol(ctx.owner, name, EmptyFlags, info)
987-
registerSym(start, sym)
995+
val sym = symbolAt(start).asTerm
996+
skipTree()// skip type
997+
// symbol has to be created before reading the type, as the type may refer to the symbpl
988998
Bind(sym, readTerm())
989999
case ALTERNATIVE =>
9901000
Alternative(until(end)(readTerm()))
@@ -1042,7 +1052,15 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
10421052
}
10431053

10441054
def readTpt()(implicit ctx: Context) =
1045-
if (isTypeTreeTag(nextUnsharedTag)) readTerm()
1055+
if (isTypeTreeTag(nextUnsharedTag)) {
1056+
val isShared = nextByte == SHARED
1057+
val term = readTerm()
1058+
term match {
1059+
case a: DefTree if isShared =>
1060+
TypeTree(a.namedType)
1061+
case _ => term
1062+
}
1063+
}
10461064
else {
10471065
val start = currentAddr
10481066
val tp = readType()

tests/link/on-custom-lib/map2.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import strawman.collection._
1+
//import strawman.collection._
22

33
object Test {
44
def main(args: Array[String]): Unit = {

0 commit comments

Comments
 (0)