Skip to content

Commit 0ccc76e

Browse files
committed
Add missing file
1 parent 0bb5bb3 commit 0ccc76e

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package dotty.tools.dotc
2+
package core
3+
4+
import Names._
5+
import NameOps._
6+
import StdNames._
7+
import util.DotClass
8+
9+
object NameExtractors {
10+
11+
abstract class NameInfo extends DotClass {
12+
def tag: Int
13+
def mkString(underlying: TermName): String
14+
def map(f: SimpleTermName => SimpleTermName): NameInfo = this
15+
}
16+
17+
val simpleTermNameInfo = new NameInfo {
18+
def tag = 0
19+
def mkString(underlying: TermName): String = unsupported("mkString")
20+
}
21+
22+
abstract class NameExtractor(val tag: Int) extends DotClass { self =>
23+
def mkString(underlying: TermName, info: ThisInfo): String
24+
def infoString: String
25+
type ThisInfo <: Info
26+
class Info extends NameInfo { this: ThisInfo =>
27+
def tag = self.tag
28+
def mkString(underlying: TermName) = self.mkString(underlying, this)
29+
override def toString = infoString
30+
}
31+
}
32+
33+
abstract class ClassifiedNameExtractor(tag: Int, val infoString: String) extends NameExtractor(tag) {
34+
type ThisInfo = Info
35+
val info = new Info
36+
def apply(qual: TermName) =
37+
qual.derived(info)
38+
def unapply(name: DerivedTermName): Option[TermName] = name match {
39+
case DerivedTermName(underlying, `info`) => Some(underlying)
40+
case _ => None
41+
}
42+
}
43+
44+
class PrefixNameExtractor(tag: Int, prefix: String, infoString: String) extends ClassifiedNameExtractor(tag, infoString) {
45+
def mkString(underlying: TermName, info: ThisInfo) = prefix ++ underlying
46+
}
47+
48+
class SuffixNameExtractor(tag: Int, suffix: String, infoString: String) extends ClassifiedNameExtractor(tag, infoString) {
49+
def mkString(underlying: TermName, info: ThisInfo) = underlying.toString ++ suffix
50+
}
51+
52+
trait QualifiedInfo extends NameInfo {
53+
val name: SimpleTermName
54+
}
55+
56+
abstract class QualifiedNameExtractor(tag: Int, val separator: String, val infoString: String) extends NameExtractor(tag) {
57+
type ThisInfo = QualInfo
58+
case class QualInfo(val name: SimpleTermName) extends Info with QualifiedInfo {
59+
override def map(f: SimpleTermName => SimpleTermName): NameInfo = new QualInfo(f(name))
60+
override def toString = s"$infoString $name"
61+
}
62+
def apply(qual: TermName, name: SimpleTermName) =
63+
qual.derived(new QualInfo(name))
64+
def unapply(name: DerivedTermName): Option[(TermName, SimpleTermName)] = name match {
65+
case DerivedTermName(qual, info: this.QualInfo) => Some((qual, info.name))
66+
case _ => None
67+
}
68+
def mkString(underlying: TermName, info: ThisInfo) =
69+
s"$underlying$separator${info.name}"
70+
}
71+
72+
object AnyQualifiedName {
73+
def unapply(name: DerivedTermName): Option[(TermName, QualifiedNameExtractor # QualInfo)] = name match {
74+
case DerivedTermName(qual, info: QualifiedNameExtractor # QualInfo) =>
75+
Some((name.underlying, info))
76+
case _ => None
77+
}
78+
}
79+
80+
trait NumberedInfo {
81+
def num: Int
82+
}
83+
84+
abstract class NumberedNameExtractor(tag: Int, val infoString: String) extends NameExtractor(tag) {
85+
type ThisInfo = NumberedInfo
86+
case class NumberedInfo(val num: Int) extends Info with NameExtractors.NumberedInfo {
87+
override def toString = s"$infoString $num"
88+
}
89+
def apply(qual: TermName, num: Int) =
90+
qual.derived(new NumberedInfo(num))
91+
def unapply(name: DerivedTermName): Option[(TermName, Int)] = name match {
92+
case DerivedTermName(underlying, info: this.NumberedInfo) => Some((underlying, info.num))
93+
case _ => None
94+
}
95+
}
96+
97+
object QualifiedName extends QualifiedNameExtractor(1, ".", "Qualified")
98+
object FlattenedName extends QualifiedNameExtractor(2, "$", "Flattened")
99+
object XpandedName extends QualifiedNameExtractor(3, str.EXPAND_SEPARATOR, "Expanded")
100+
object TraitSetterName extends QualifiedNameExtractor(4, str.TRAIT_SETTER_SEPARATOR, "TraitSetter")
101+
102+
object DefaultGetterName extends NumberedNameExtractor(5, "DefaultGetter") {
103+
def mkString(underlying: TermName, info: ThisInfo) = {
104+
val prefix = if (underlying.isConstructorName) nme.DEFAULT_GETTER_INIT else underlying
105+
prefix.toString + nme.DEFAULT_GETTER + (info.num + 1)
106+
}
107+
}
108+
109+
object VariantName extends NumberedNameExtractor(6, "Variant") {
110+
val varianceToPrefix = Map(-1 -> '-', 0 -> '=', 1 -> '+')
111+
val prefixToVariance = Map('-' -> -1, '=' -> 0, '+' -> 1)
112+
def mkString(underlying: TermName, info: ThisInfo) = {
113+
varianceToPrefix(info.num).toString + underlying
114+
}
115+
}
116+
117+
val SuperAccessorName = new PrefixNameExtractor(7, str.SUPER_PREFIX, "SuperAccessor")
118+
val InitializerName = new PrefixNameExtractor(8, str.INITIALIZER_PREFIX, "Initializer")
119+
val ShadowedName = new PrefixNameExtractor(9, str.SHADOWED_PREFIX, "Shadowed")
120+
val ModuleClassName = new SuffixNameExtractor(10, "$", "ModuleClass")
121+
122+
object SignedName extends NameExtractor(63) {
123+
124+
/** @param parts resultSig followed by paramsSig */
125+
case class SignedInfo(sig: Signature) extends Info {
126+
override def toString = s"$infoString $sig"
127+
}
128+
type ThisInfo = SignedInfo
129+
130+
def apply(qual: TermName, sig: Signature) =
131+
qual.derived(new SignedInfo(sig))
132+
def unapply(name: DerivedTermName): Option[(TermName, Signature)] = name match {
133+
case DerivedTermName(underlying, info: SignedInfo) => Some((underlying, info.sig))
134+
case _ => None
135+
}
136+
137+
def mkString(underlying: TermName, info: ThisInfo): String = unsupported("mkString")
138+
def infoString: String = "Signed"
139+
}
140+
141+
def definesNewName(tag: Int) = tag <= TraitSetterName.tag
142+
143+
val separatorToQualified: Map[String, QualifiedNameExtractor] =
144+
Map("." -> QualifiedName,
145+
"$" -> FlattenedName,
146+
str.EXPAND_SEPARATOR -> XpandedName,
147+
str.TRAIT_SETTER_SEPARATOR -> TraitSetterName)
148+
}

0 commit comments

Comments
 (0)