Skip to content

Commit a2e58af

Browse files
committed
Eliminate TastyNames
1 parent a1a6f2f commit a2e58af

File tree

11 files changed

+107
-219
lines changed

11 files changed

+107
-219
lines changed

compiler/src/dotty/tools/dotc/core/StdNames.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ object StdNames {
2020
val TRAIT_SETTER_SEPARATOR = "$_setter_$"
2121
val SUPER_PREFIX = "super$"
2222
val INITIALIZER_PREFIX = "initial$"
23+
val SHADOWED_PREFIX = "(shadowed)"
2324
}
2425

2526
abstract class DefinedNames[N <: Name] {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ object DottyUnpickler {
1919

2020
class TreeSectionUnpickler(posUnpickler: Option[PositionUnpickler])
2121
extends SectionUnpickler[TreeUnpickler]("ASTs") {
22-
def unpickle(reader: TastyReader, tastyName: TastyName.Table) =
23-
new TreeUnpickler(reader, tastyName, posUnpickler)
22+
def unpickle(reader: TastyReader, nameAtRef: NameTable) =
23+
new TreeUnpickler(reader, nameAtRef, posUnpickler)
2424
}
2525

2626
class PositionsSectionUnpickler extends SectionUnpickler[PositionUnpickler]("Positions") {
27-
def unpickle(reader: TastyReader, tastyName: TastyName.Table) =
27+
def unpickle(reader: TastyReader, nameAtRef: NameTable) =
2828
new PositionUnpickler(reader)
2929
}
3030
}

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

Lines changed: 35 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,63 +4,38 @@ package core
44
package tasty
55

66
import collection.mutable
7-
import Names.{Name, chrs, SimpleTermName}
7+
import Names.{Name, chrs, SimpleTermName, DerivedTermName}
88
import NameOps.NameDecorator
99
import NameExtractors._
1010
import Decorators._
1111
import TastyBuffer._
1212
import scala.io.Codec
13-
import TastyName._
1413
import TastyFormat._
1514

1615
class NameBuffer extends TastyBuffer(10000) {
1716
import NameBuffer._
1817

19-
private val nameRefs = new mutable.LinkedHashMap[TastyName, NameRef]
18+
private val nameRefs = new mutable.LinkedHashMap[Name, NameRef]
2019

21-
def nameIndex(name: TastyName): NameRef = nameRefs.get(name) match {
22-
case Some(ref) =>
23-
ref
24-
case None =>
25-
val ref = NameRef(nameRefs.size)
26-
nameRefs(name) = ref
27-
ref
28-
}
29-
30-
def nameIndex(name: Name, toTasty: SimpleTermName => TastyName): NameRef = {
31-
val tname = name.toTermName match {
32-
case ModuleClassName(name1) =>
33-
ModuleClass(nameIndex(name1, toTasty))
34-
case SuperAccessorName(name1) =>
35-
SuperAccessor(nameIndex(name1, toTasty))
36-
case QualifiedName(prefix, selector) =>
37-
Qualified(nameIndex(prefix, toTasty), nameIndex(selector))
38-
case FlattenedName(prefix, selector) =>
39-
Flattened(nameIndex(prefix, toTasty), nameIndex(selector))
40-
case XpandedName(prefix, selector) =>
41-
Expanded(nameIndex(prefix, toTasty), nameIndex(selector))
42-
case DefaultGetterName(prefix, num) =>
43-
DefaultGetter(nameIndex(prefix, toTasty), num)
44-
case VariantName(prefix, sign) =>
45-
Variant(nameIndex(prefix, toTasty), sign)
46-
case name1 =>
47-
if (name1.isShadowedName) Shadowed(nameIndex(name1.revertShadowed, toTasty))
48-
else toTasty(name1.asSimpleName)
49-
}
50-
nameIndex(tname)
51-
}
52-
53-
def nameIndex(name: Name): NameRef = nameIndex(name, Simple)
54-
55-
def nameIndex(str: String): NameRef = nameIndex(str.toTermName)
56-
57-
def fullNameIndex(name: Name): NameRef = {
58-
def split(name: SimpleTermName): TastyName = {
59-
val pos = name.lastIndexOf('.')
60-
if (pos <= 0) Simple(name)
61-
else Qualified(fullNameIndex(name.take(pos)), nameIndex(name.drop(pos + 1)))
62-
}
63-
nameIndex(name, split)
20+
def nameIndex(name: Name): NameRef = {
21+
val name1 = name.toTermName
22+
nameRefs.get(name1) match {
23+
case Some(ref) =>
24+
ref
25+
case None =>
26+
name1 match {
27+
case SignedName(original, Signature(params, result)) =>
28+
nameIndex(original); nameIndex(result); params.foreach(nameIndex)
29+
case AnyQualifiedName(prefix, info) =>
30+
nameIndex(prefix); nameIndex(info.name)
31+
case DerivedTermName(prefix, _) =>
32+
nameIndex(prefix)
33+
case _ =>
34+
}
35+
val ref = NameRef(nameRefs.size)
36+
nameRefs(name1) = ref
37+
ref
38+
}
6439
}
6540

6641
private def withLength(op: => Unit, lengthWidth: Int = 1): Unit = {
@@ -71,43 +46,44 @@ class NameBuffer extends TastyBuffer(10000) {
7146
putNat(lengthAddr, length, lengthWidth)
7247
}
7348

74-
def writeNameRef(ref: NameRef) = writeNat(ref.index)
49+
def writeNameRef(ref: NameRef): Unit = writeNat(ref.index)
50+
def writeNameRef(name: Name): Unit = writeNameRef(nameRefs(name.toTermName))
7551

76-
def pickleName(name: TastyName): Unit = name match {
77-
case Simple(name) =>
52+
def pickleNameContents(name: Name): Unit = name.toTermName match {
53+
case name: SimpleTermName =>
7854
val bytes =
7955
if (name.length == 0) new Array[Byte](0)
8056
else Codec.toUTF8(chrs, name.start, name.length)
8157
writeByte(UTF8)
8258
writeNat(bytes.length)
8359
writeBytes(bytes, bytes.length)
84-
case Qualified(qualified, selector) =>
60+
case QualifiedName(qualified, selector) =>
8561
writeByte(QUALIFIED)
8662
withLength { writeNameRef(qualified); writeNameRef(selector) }
87-
case Flattened(qualified, selector) =>
63+
case FlattenedName(qualified, selector) =>
8864
writeByte(FLATTENED)
8965
withLength { writeNameRef(qualified); writeNameRef(selector) }
90-
case Expanded(prefix, original) =>
66+
case XpandedName(prefix, original) =>
9167
writeByte(EXPANDED)
9268
withLength { writeNameRef(prefix); writeNameRef(original) }
93-
case Signed(original, params, result) =>
69+
case SignedName(original, Signature(params, result)) =>
9470
writeByte(SIGNED)
9571
withLength(
9672
{ writeNameRef(original); writeNameRef(result); params.foreach(writeNameRef) },
9773
if ((params.length + 2) * maxIndexWidth <= maxNumInByte) 1 else 2)
98-
case ModuleClass(module) =>
74+
case ModuleClassName(module) =>
9975
writeByte(OBJECTCLASS)
10076
withLength { writeNameRef(module) }
101-
case SuperAccessor(accessed) =>
77+
case SuperAccessorName(accessed) =>
10278
writeByte(SUPERACCESSOR)
10379
withLength { writeNameRef(accessed) }
104-
case DefaultGetter(method, paramNumber) =>
80+
case DefaultGetterName(method, paramNumber) =>
10581
writeByte(DEFAULTGETTER)
10682
withLength { writeNameRef(method); writeNat(paramNumber) }
107-
case Shadowed(original) =>
83+
case ShadowedName(original) =>
10884
writeByte(SHADOWED)
10985
withLength { writeNameRef(original) }
110-
case Variant(original, sign) =>
86+
case VariantName(original, sign) =>
11187
writeByte(VARIANT)
11288
withLength { writeNameRef(original); writeNat(sign + 1) }
11389
}
@@ -117,7 +93,7 @@ class NameBuffer extends TastyBuffer(10000) {
11793
for ((name, ref) <- nameRefs) {
11894
assert(ref.index == i)
11995
i += 1
120-
pickleName(name)
96+
pickleNameContents(name)
12197
}
12298
}
12399
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ object TastyBuffer {
2626
* the value of 4 gives a maximal array size of 256M.
2727
*/
2828
final val AddrWidth = 4
29+
30+
/** An address referring to a serialized name */
31+
case class NameRef(index: Int) extends AnyVal
2932
}
3033
import TastyBuffer._
3134

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

Lines changed: 0 additions & 32 deletions
This file was deleted.

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ import TastyBuffer._
99
import java.util.UUID
1010
import core.Symbols.Symbol
1111
import ast.tpd
12+
import Decorators._
1213

1314
class TastyPickler {
1415

15-
private val sections = new mutable.ArrayBuffer[(TastyName.NameRef, TastyBuffer)]
16+
private val sections = new mutable.ArrayBuffer[(NameRef, TastyBuffer)]
1617
val uuid = UUID.randomUUID()
1718

1819
private val headerBuffer = {
@@ -28,7 +29,7 @@ class TastyPickler {
2829
val nameBuffer = new NameBuffer
2930

3031
def newSection(name: String, buf: TastyBuffer) =
31-
sections += ((nameBuffer.nameIndex(name), buf))
32+
sections += ((nameBuffer.nameIndex(name.toTermName), buf))
3233

3334
def assembleParts(): Array[Byte] = {
3435
def lengthWithLength(buf: TastyBuffer) = {

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

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,24 @@ package tasty
44

55
import Contexts._, Decorators._
66
import printing.Texts._
7-
import TastyName._
7+
import Names.Name
88
import StdNames._
99
import TastyUnpickler._
10-
import TastyBuffer.Addr
10+
import TastyBuffer.{Addr, NameRef}
1111
import util.Positions.{Position, offsetToInt}
1212
import collection.mutable
1313

1414
class TastyPrinter(bytes: Array[Byte])(implicit ctx: Context) {
1515

1616
val unpickler = new TastyUnpickler(bytes)
17-
import unpickler.{tastyName, unpickle}
17+
import unpickler.{nameAtRef, unpickle}
1818

19-
def nameToString(name: TastyName): String = name match {
20-
case Simple(name) => name.toString
21-
case Qualified(qual, name) => nameRefToString(qual) + "." + nameRefToString(name)
22-
case Signed(original, params, result) =>
23-
i"${nameRefToString(original)}@${params.map(nameRefToString)}%,%:${nameRefToString(result)}"
24-
case Expanded(prefix, original) => s"$prefix${nme.EXPAND_SEPARATOR}$original"
25-
case ModuleClass(original) => nameRefToString(original) + "/MODULECLASS"
26-
case SuperAccessor(accessed) => nameRefToString(accessed) + "/SUPERACCESSOR"
27-
case DefaultGetter(meth, num) => nameRefToString(meth) + "/DEFAULTGETTER" + num
28-
case Shadowed(original) => nameRefToString(original) + "/SHADOWED"
29-
}
19+
def nameToString(name: Name): String = name.debugString
3020

31-
def nameRefToString(ref: NameRef): String = nameToString(tastyName(ref))
21+
def nameRefToString(ref: NameRef): String = nameToString(nameAtRef(ref))
3222

3323
def printNames() =
34-
for ((name, idx) <- tastyName.contents.zipWithIndex) {
24+
for ((name, idx) <- nameAtRef.contents.zipWithIndex) {
3525
val index = "%4d: ".format(idx)
3626
println(index + nameToString(name))
3727
}
@@ -46,7 +36,7 @@ class TastyPrinter(bytes: Array[Byte])(implicit ctx: Context) {
4636

4737
class TreeSectionUnpickler extends SectionUnpickler[Unit]("ASTs") {
4838
import TastyFormat._
49-
def unpickle(reader: TastyReader, tastyName: TastyName.Table): Unit = {
39+
def unpickle(reader: TastyReader, tastyName: NameTable): Unit = {
5040
import reader._
5141
var indent = 0
5242
def newLine() = {
@@ -116,7 +106,7 @@ class TastyPrinter(bytes: Array[Byte])(implicit ctx: Context) {
116106
}
117107

118108
class PositionSectionUnpickler extends SectionUnpickler[Unit]("Positions") {
119-
def unpickle(reader: TastyReader, tastyName: TastyName.Table): Unit = {
109+
def unpickle(reader: TastyReader, tastyName: NameTable): Unit = {
120110
print(s"${reader.endAddr.index - reader.currentAddr.index}")
121111
val positions = new PositionUnpickler(reader).positions
122112
println(s" position bytes:")

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ package core
44
package tasty
55

66
import TastyBuffer._
7-
import TastyName.NameRef
87
import collection.mutable
98

109
/** A byte array buffer that can be filled with bytes or natural numbers in TASTY format,

0 commit comments

Comments
 (0)