8000 Merge pull request #5 from scalacenter/tasty_reader_use_new_names · bishabosha/scala@0741a89 · GitHub
[go: up one dir, main page]

8000
Skip to content

Commit 0741a89

Browse files
authored
Merge pull request scala#5 from scalacenter/tasty_reader_use_new_names
Reify Tasty Names, which allows to reduce coupling
2 parents c79c3fd + 268977b commit 0741a89

File tree

8 files changed

+146
-132
lines changed

8 files changed

+146
-132
lines changed

src/compiler/scala/tools/nsc/tasty/Names.scala

Lines changed: 56 additions & 25 deletions
8000
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,20 @@ import scala.annotation.tailrec
44
object Names {
55

66
object TastyName {
7+
78
final case class SimpleName(raw: String) extends TastyName
89
final case class ModuleName(base: TastyName) extends TastyName
9-
final case class QualifiedName(qual: TastyName, name: SimpleName) extends TastyName
10+
final case class QualifiedName(qual: TastyName, sep: SimpleName, name: SimpleName) extends TastyName
1011
final case class SignedName(qual: TastyName, sig: Signature.MethodSignature[TastyName]) extends TastyName
12+
final case class UniqueName(qual: TastyName, sep: SimpleName, num: Int) extends TastyName
13+
final case class DefaultName(qual: TastyName, num: Int) extends TastyName
14+
final case class VariantName(qual: TastyName, contravariant: Boolean) extends TastyName
15+
16+
val Empty: SimpleName = SimpleName("")
17+
val PathSep: SimpleName = SimpleName(".")
18+
val ExpandedSep: SimpleName = SimpleName("$$")
19+
val ExpandPrefixSep: SimpleName = SimpleName("$")
20+
1121
}
1222

1323
/** class to represent Names as defined in TASTy, with methods to extract scala identifiers
@@ -23,24 +33,28 @@ object Names {
2333

2434
final def isModuleName: Boolean = self.isInstanceOf[ModuleName]
2535

26-
/** Get the part of this name that represents a Scala identifier
27-
*/
28-
@tailrec
29-
final def identifierPart: SimpleName = self match {
30-
case name: SimpleName => name
31-
case QualifiedName(_, name) => name
32-
case ModuleName(name) => name.identifierPart
33-
case SignedName(name,_) => name.identifierPart
36+
final def asSimpleName: SimpleName = self match {
37+
case self: SimpleName => self
38+
case _ => throw new AssertionError(s"not simplename: ${self.show}")
3439
}
3540

36-
/** Get the optional qualifier if this name forms a path
37-
*/
38-
@tailrec
39-
final def qualifierPart: Option[TastyName] = self match {
40-
case name: SimpleName => None
41-
case QualifiedName(qual, _) => Some(qual)
42-
case ModuleName(name) => name.qualifierPart
43-
case SignedName(name,_) => name.qualifierPart
41+
final def export: String = {
42+
self match {
43+
case SimpleName(raw) => raw
44+
case _ =>
45+
val sb = new StringBuilder(10)
46+
def inner(name: TastyName): Unit = name match {
47+
case SimpleName(raw) => sb.append(raw)
48+
case QualifiedName(qual, sep, name) => inner(qual); inner(sep); inner(name)
49+
case ModuleName(name) => inner(name)
50+
case SignedName(name,_) => inner(name)
51+
case UniqueName(qual, sep, num) => inner(qual); inner(sep); sb.append(num)
52+
case DefaultName(qual, num) => inner(qual); sb.append("$default$"); sb.append(num + 1)
53+
case VariantName(qual, contra) => sb.append(if (contra) '-' else '+'); inner(qual)
54+
}
55+
inner(self)
56+
sb.toString
57+
}
4458
}
4559

4660
/** How to display the name in a TASTy file.
@@ -51,24 +65,41 @@ object Names {
5165
case _ =>
5266
val sb = new StringBuilder(10)
5367
def inner(name: TastyName): Unit = name match {
54-
case name: SimpleName => sb.append(name.raw)
55-
case QualifiedName(qual, name) => inner(qual); sb.append("[Qualified . "); inner(name); sb.append(']')
56-
case ModuleName(name) => inner(name); sb.append("[ModuleClass]")
57-
case SignedName(name,sig) => inner(name); sb.append("[Signed "); sb.append(sig.show); sb.append(']')
68+
case name: SimpleName => sb.append(name.raw)
69+
case QualifiedName(qual, sep, name) => inner(qual); sb.append("[Qualified "); inner(sep); sb.append(' '); inner(name); sb.append(']')
70+
case ModuleName(name) => inner(name); sb.append("[ModuleClass]")
71+
case SignedName(name,sig) => inner(name); sb.append("[Signed "); sig.mergeShow(sb).append(']')
72+
case UniqueName(qual, sep, num) => inner(qual); sb.append("[Unique "); inner(sep); sb.append(" ").append(num).append(']')
73+
case DefaultName(qual, num) => inner(qual); sb.append("[Default "); sb.append(num + 1).append(']')
74+
case VariantName(qual, contra) => inner(qual); sb.append("[Variant ").append(if (contra) '-' else '+').append(']')
5875
}
5976
inner(self)
6077
sb.toString
6178
}
6279
}
6380

6481
final def stripModulePart: TastyName = self match {
65-
case ModuleName(name) => name
66-
case name @ (_:SimpleName | _:QualifiedName | _:SignedName) => name
82+
case ModuleName(name) => name
83+
case name @ (
84+
_:SimpleName
85+
| _:QualifiedName
86+
| _:SignedName
87+
| _:UniqueName
88+
| _:DefaultName
89+
| _:VariantName
90+
) => name
6791
}
6892

6993
final def signature: Signature[TastyName] = self match {
70-
case SignedName(_, signature) => signature
71-
case _:SimpleName | _:QualifiedName | _:ModuleName => Signature.NotAMethod
94+
case SignedName(_, signature) => signature
95+
case (
96+
_:SimpleName
97+
| _:QualifiedName
98+
| _:ModuleName
99+
| _:UniqueName
100+
| _:DefaultName
101+
| _:VariantName
102+
) => Signature.NotAMethod
72103
}
73104
}
74105
}

src/compiler/scala/tools/nsc/tasty/ScalacUnpickler.scala

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,15 @@ import scala.reflect.io.AbstractFile
55
import TastyRefs.NameRef
66
import scala.util.control.NonFatal
77
import scala.reflect.internal.SymbolTable
8+
import scala.tools.nsc.tasty.Names.TastyName
89

910
object ScalacUnpickler {
1011

1112
final class TreeSectionUnpickler[SymbolTable <: reflect.internal.SymbolTable](implicit symbolTable: SymbolTable)
1213
extends SectionUnpickler[TreeUnpickler { val symbolTable: SymbolTable }]("ASTs") { self =>
13-
def unpickle(reader: TastyReader, nameTable: TastyNameTable with TastyUniverse): TreeUnpickler { val symbolTable: SymbolTable } =
14-
new TreeUnpickler(reader, None, None, Seq.empty) {
15-
16-
assert(nameTable.symbolTable `eq` self.symbolTable, "Unsafe creation of name ref mapper without shared underlying symbol table")
17-
18-
final val symbolTable: SymbolTable =
19-
self.symbolTable
20-
21-
final val nameAtRef: NameRef => symbolTable.TermName =
22-
nameTable.nameAtRef.asInstanceOf[NameRef => symbolTable.TermName]
23-
24-
final val signedNameAtRef: NameRef => Either[SigName, symbolTable.TermName] =
25-
nameTable.signedNameAtRef.asInstanceOf[NameRef => Either[SigName, symbolTable.TermName]]
26-
27-
final val moduleRefs: NameRef => Boolean =
28-
nameTable.moduleRefs.asInstanceOf[NameRef => Boolean]
29-
14+
def unpickle(reader: TastyReader, nameAtRef: NameRef => TastyName ): TreeUnpickler { val symbolTable: SymbolTable } =
15+
new TreeUnpickler(reader, nameAtRef, None, None, Seq.empty) {
16+
final val symbolTable: SymbolTable = self.symbolTable
3017
}
3118
}
3219
}

src/compiler/scala/tools/nsc/tasty/Signature.scala

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,33 @@ package scala.tools.nsc.tasty
22

33
import scala.reflect.internal.SymbolTable
44
import scala.tools.nsc.tasty.Signature.ParamSig
5+
import scala.tools.nsc.tasty.Signature.MethodSignature
6+
import scala.tools.nsc.tasty.Signature.NotAMethod
7+
8+
sealed trait Signature[+T] { self =>
9+
10+
final def show: String = mergeShow(new StringBuilder(30)).toString
11+
12+
final def mergeShow(sb: StringBuilder): StringBuilder = self match {
13+
case MethodSignature(paramsSig, resSig) =>
14+
paramsSig.map(_.merge).addString(sb, "(", ",", ")").append(resSig)
15+
16+
case NotAMethod => sb.append("<nosig>")
17+
}
18+
19+
final def map[U](f: T => U): Signature[U] = self match {
20+
case MethodSignature(paramsSig, resSig) => MethodSignature(paramsSig.map(_.map(f)), f(resSig))
21+
case NotAMethod => NotAMethod
22+
}
523

6-
sealed trait Signature[+T] {
7-
def show: String
824
}
925

1026
object Signature {
27+
1128
type ParamSig[T] = Either[Int, T]
1229

1330
def apply[T](paramsSig: List[ParamSig[T]], resSig: T): MethodSignature[T] = new MethodSignature(paramsSig, resSig)
1431

15-
case object NotAMethod extends Signature[Nothing] {
16-
def show: String = "<no F987 sig>"
17-
}
18-
case class MethodSignature[T](paramsSig: List[ParamSig[T]], resSig: T) extends Signature[T] {
19-
def show: String = s"""${paramsSig.map(_.merge).mkString("(", ", ", ")")}$resSig"""
20-
}
32+
case object NotAMethod extends Signature[Nothing]
33+
case class MethodSignature[T] private[Signature] (paramsSig: List[ParamSig[T]], resSig: T) extends Signature[T]
2134
}

src/compiler/scala/tools/nsc/tasty/SignedName.scala

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

src/compiler/scala/tools/nsc/tasty/TastyNameTable.scala

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

src/compiler/scala/tools/nsc/tasty/TastyUniverse.scala

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package scala.tools.nsc.tasty
33
import scala.reflect.internal._
44
import scala.reflect.io.AbstractFile
55
import scala.annotation.tailrec
6+
import scala.tools.nsc.tasty.Names.TastyName
7+
import scala.tools.nsc.tasty.Names.TastyName.SimpleName
68

79
trait TastyUniverse { self =>
810
val symbolTable: SymbolTable
@@ -12,19 +14,13 @@ trait TastyUniverse { self =>
1214
import FlagSets._
1315
import Contexts._
1416

17+
final implicit val thisUniverse: self.type = self
1518
final implicit val symbolTablePrecise: self.symbolTable.type = self.symbolTable
1619

1720
final def logTasty(str: => String): Unit = {
18-
import symbolTable._
1921
if (settings.debugTasty) reporter.echo(NoPosition, str)
2022
}
2123

22-
type ParamSig = Signature.ParamSig[TypeName]
23-
type Sig = Signature[TypeName]
24-
val Sig = Signature
25-
type SigName = SignedName[TermName, TypeName]
26-
val SigName = SignedName
27-
2824
object FlagSets {
2925
import scala.reflect.internal.{Flags, ModifierFlags}
3026

@@ -463,4 +459,11 @@ trait TastyUniverse { self =>
463459
case Open => "Open"
464460
}
465461
} mkString(" | ")
462+
463+
implicit class TastyNameDecorator(private val tastyName: TastyName) {
464+
def toTermName: TermName = tastyName.export match {
465+
case "" => termNames.EMPTY
466+
case raw => raw
467+
}
468+
}
466469
}

0 commit comments

Comments
 (0)
0