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