@@ -8,33 +8,38 @@ import StdNames._
8
8
import util .DotClass
9
9
import tasty .TastyFormat ._
10
10
import Decorators ._
11
+ import Contexts .Context
11
12
import collection .mutable
12
13
13
14
object NameExtractors {
14
15
15
- @ sharable private val extractors = new mutable.HashMap [Int , ClassifiedNameExtractor ]
16
+ @ sharable private val simpleExtractors = new mutable.HashMap [Int , ClassifiedNameExtractor ]
17
+ @ sharable private val uniqueExtractors = new mutable.HashMap [String , UniqueNameExtractor ]
18
+ @ sharable private val qualifiedExtractors = new mutable.HashMap [String , QualifiedNameExtractor ]
16
19
17
20
abstract class NameInfo extends DotClass {
18
- def tag : Int
19
- def definesNewName : Boolean = false
21
+ def extractor : NameExtractor
20
22
def mkString (underlying : TermName ): String
21
23
def map (f : SimpleTermName => SimpleTermName ): NameInfo = this
22
24
}
23
25
24
- val simpleTermNameInfo = new NameInfo {
25
- def tag = UTF8
26
- def mkString (underlying : TermName ): String = unsupported(" mkString" )
27
- }
28
-
29
26
abstract class NameExtractor (val tag : Int ) extends DotClass { self =>
30
- def mkString (underlying : TermName , info : ThisInfo ): String
31
- def infoString : String
32
27
type ThisInfo <: Info
33
28
class Info extends NameInfo { this : ThisInfo =>
34
- def tag = self.tag
29
+ def extractor = self
35
30
def mkString (underlying : TermName ) = self.mkString(underlying, this )
36
31
override def toString = infoString
37
32
}
33
+ def definesNewName = false
34
+ def mkString (underlying : TermName , info : ThisInfo ): String
35
+ def infoString : String
36
+ }
37
+
38
+ object SimpleTermNameExtractor extends NameExtractor (UTF8 ) { self =>
39
+ type ThisInfo = Info
40
+ val info = new Info
41
+ def mkString (underlying : TermName , info : ThisInfo ) = unsupported(" mkString" )
42
+ def infoString = unsupported(" infoString" )
38
43
}
39
44
40
45
abstract class ClassifiedNameExtractor (tag : Int , val infoString : String ) extends NameExtractor (tag) {
@@ -46,26 +51,28 @@ object NameExtractors {
46
51
case DerivedTermName (underlying, `info`) => Some (underlying)
47
52
case _ => None
48
53
}
49
- extractors (tag) = this
54
+ simpleExtractors (tag) = this
50
55
}
51
56
52
- class PrefixNameExtractor (tag : Int , prefix : String , infoString : String ) extends ClassifiedNameExtractor (tag, infoString) {
57
+ class PrefixNameExtractor (tag : Int , prefix : String , optInfoString : String = " " )
58
+ extends ClassifiedNameExtractor (tag, if (optInfoString.isEmpty) s " Prefix $prefix" else optInfoString) {
53
59
def mkString (underlying : TermName , info : ThisInfo ) =
54
60
underlying.mapLast(n => termName(prefix + n.toString)).toString
55
61
}
56
62
57
- class SuffixNameExtractor (tag : Int , suffix : String , infoString : String ) extends ClassifiedNameExtractor (tag, infoString) {
63
+ class SuffixNameExtractor (tag : Int , suffix : String , optInfoString : String = " " )
64
+ extends ClassifiedNameExtractor (tag, if (optInfoString.isEmpty) s " Suffix $suffix" else optInfoString) {
58
65
def mkString (underlying : TermName , info : ThisInfo ) = underlying.toString ++ suffix
59
66
}
60
67
61
68
trait QualifiedInfo extends NameInfo {
62
69
val name : SimpleTermName
63
70
}
64
71
65
- abstract class QualifiedNameExtractor (tag : Int , val separator : String , val infoString : String ) extends NameExtractor (tag) {
72
+ class QualifiedNameExtractor (tag : Int , val separator : String )
73
+ extends NameExtractor (tag) {
66
74
type ThisInfo = QualInfo
67
75
case class QualInfo (val name : SimpleTermName ) extends Info with QualifiedInfo {
68
- override def definesNewName = true
69
76
override def map (f : SimpleTermName => SimpleTermName ): NameInfo = new QualInfo (f(name))
70
77
override def toString = s " $infoString $name"
71
78
}
@@ -75,26 +82,32 @@ object NameExtractors {
75
82
case DerivedTermName (qual, info : this .QualInfo ) => Some ((qual, info.name))
76
83
case _ => None
77
84
}
85
+
86
+ override def definesNewName = true
87
+
78
88
def mkString (underlying : TermName , info : ThisInfo ) =
79
89
s " $underlying$separator${info.name}"
90
+ def infoString = s " Qualified $separator"
91
+
92
+ qualifiedExtractors(separator) = this
80
93
}
81
94
82
95
object AnyQualifiedName {
83
- def unapply (name : DerivedTermName ): Option [(TermName , QualifiedInfo )] = name match {
96
+ def unapply (name : DerivedTermName ): Option [(TermName , SimpleTermName )] = name match {
84
97
case DerivedTermName (qual, info : QualifiedInfo ) =>
85
- Some ((name.underlying, info))
98
+ Some ((name.underlying, info.name ))
86
99
case _ => None
87
100
}
88
101
}
89
102
90
103
trait NumberedInfo {
91
104
def num : Int
105
+ def extractor : NameExtractor
92
106
}
93
107
94
108
abstract class NumberedNameExtractor (tag : Int , val infoString : String ) extends NameExtractor (tag) { self =>
95
109
type ThisInfo = NumberedInfo
96
110
case class NumberedInfo (val num : Int ) extends Info with NameExtractors .NumberedInfo {
97
- override def definesNewName = self.definesNewName
98
111
override def toString = s " $infoString $num"
99
112
}
100
113
def apply (qual : TermName , num : Int ) =
@@ -103,20 +116,66 @@ object NameExtractors {
103
116
case DerivedTermName (underlying, info : this .NumberedInfo ) => Some ((underlying, info.num))
104
117
case _ => None
105
118
}
106
- def definesNewName = false
107
119
}
108
120
109
- class UniqueNameExtractor (sep : String ) extends NumberedNameExtractor (UNIQUE , " Unique" ) {
110
- val separator = if (sep.isEmpty) " $" else sep
111
- override def definesNewName = ! sep.isEmpty
112
- def mkString (underlying : TermName , info : ThisInfo ) =
113
- underlying.toString + separator + info.num
121
+ case class UniqueNameExtractor (val separator : String )
122
+ extends NumberedNameExtractor (UNIQUE , s " Unique $separator" ) {
123
+ override def definesNewName = true
124
+ def mkString (underlying : TermName , info : ThisInfo ) = {
125
+ val safePrefix = str.sanitize(underlying.toString + separator)
126
+ safePrefix + info.num
127
+ }
128
+
129
+ def fresh (prefix : TermName = EmptyTermName )(implicit ctx : Context ): TermName =
130
+ ctx.freshNames.newName(prefix, this )
131
+
132
+ uniqueExtractors(separator) = this
133
+ }
134
+
135
+ object AnyUniqueName {
136
+ def unapply (name : DerivedTermName ): Option [(TermName , String , Int )] = name match {
137
+ case DerivedTermName (qual, info : NumberedInfo ) =>
138
+ info.extractor match {
139
+ case unique : UniqueNameExtractor => Some ((qual, unique.separator, info.num))
140
+ case _ => None
141
+ }
142
+ case _ => None
143
+ }
114
144
}
115
145
116
- object QualifiedName extends QualifiedNameExtractor (QUALIFIED , " ." , " Qualified" )
117
- object FlattenedName extends QualifiedNameExtractor (FLATTENED , " $" , " Flattened" )
118
- object ExpandedName extends QualifiedNameExtractor (EXPANDED , str.EXPAND_SEPARATOR , " Expanded" )
119
- object TraitSetterName extends QualifiedNameExtractor (TRAITSETTER , str.TRAIT_SETTER_SEPARATOR , " TraitSetter" )
146
+ val QualifiedName = new QualifiedNameExtractor (QUALIFIED , " ." )
147
+ val FlattenedName = new QualifiedNameExtractor (FLATTENED , " $" )
148
+ val ExpandedName = new QualifiedNameExtractor (EXPANDED , str.EXPAND_SEPARATOR )
149
+ val TraitSetterName = new QualifiedNameExtractor (TRAITSETTER , str.TRAIT_SETTER_SEPARATOR )
150
+
151
+ val UniqueName = new UniqueNameExtractor (" $" ) {
152
+ override def mkString (underlying : TermName , info : ThisInfo ) =
153
+ if (underlying.isEmpty) " $" + info.num + " $" else super .mkString(underlying, info)
154
+ }
155
+
156
+ val InlineAccessorName = new UniqueNameExtractor (" $_inlineAccessor_$" )
157
+ val TempResultName = new UniqueNameExtractor (" ev$" )
158
+ val EvidenceParamName = new UniqueNameExtractor (" evidence$" )
159
+ val DepParamName = new UniqueNameExtractor (" <param>" )
160
+ val LazyImplicitName = new UniqueNameExtractor (" $_lazy_implicit_$" )
161
+ val LazyLocalName = new UniqueNameExtractor (" $lzy" )
162
+ val LazyLocalInitName = new UniqueNameExtractor (" $lzyINIT" )
163
+ val LazyFieldOffsetName = new UniqueNameExtractor (" $OFFSET" )
164
+ val LazyBitMapName = new UniqueNameExtractor (nme.BITMAP_PREFIX .toString)
165
+ val NonLocalReturnKeyName = new UniqueNameExtractor (" nonLocalReturnKey" )
166
+ val WildcardParamName = new UniqueNameExtractor (" _$" )
167
+ val TailLabelName = new UniqueNameExtractor (" tailLabel" )
168
+ val ExceptionBinderName = new UniqueNameExtractor (" ex" )
169
+ val SkolemName = new UniqueNameExtractor (" ?" )
170
+ val LiftedTreeName = new UniqueNameExtractor (" liftedTree" )
171
+
172
+ val PatMatStdBinderName = new UniqueNameExtractor (" x" )
173
+ val PatMatPiName = new UniqueNameExtractor (" pi" ) // FIXME: explain what this is
174
+ val PatMatPName = new UniqueNameExtractor (" p" ) // FIXME: explain what this is
175
+ val PatMatOName = new UniqueNameExtractor (" o" ) // FIXME: explain what this is
176
+ val PatMatCaseName = new UniqueNameExtractor (" case" )
177
+ val PatMatMatchFailName = new UniqueNameExtractor (" matchFail" )
178
+ val PatMatSelectorName = new UniqueNameExtractor (" selector" )
120
179
121
180
object DefaultGetterName extends NumberedNameExtractor (DEFAULTGETTER , " DefaultGetter" ) {
122
181
def mkString (underlying : TermName , info : ThisInfo ) = {
@@ -133,12 +192,11 @@ object NameExtractors {
133
192
}
134
193
}
135
194
136
- val SuperAccessorName = new PrefixNameExtractor (SUPERACCESSOR , str.SUPER_PREFIX , " SuperAccessor" )
137
- val InitializerName = new PrefixNameExtractor (INITIALIZER , str.INITIALIZER_PREFIX , " Initializer" )
138
- val ShadowedName = new PrefixNameExtractor (SHADOWED , str.SHADOWED_PREFIX , " Shadowed" )
139
- val LocalDummyName = new PrefixNameExtractor (LOCALDUMMY , str.LOCAL_DUMMY_PREFIX , " LocalDummy" )
140
- val AvoidClashName = new SuffixNameExtractor (AVOIDCLASH , str.AVOID_CLASH_SUFFIX , " AvoidClash" )
141
- val ModuleClassName = new SuffixNameExtractor (OBJECTCLASS , " $" , " ModuleClass" )
195
+ val SuperAccessorName = new PrefixNameExtractor (SUPERACCESSOR , " super$" )
196
+ val InitializerName = new PrefixNameExtractor (INITIALIZER , " initial$" )
197
+ val ShadowedName = new PrefixNameExtractor (SHADOWED , " (shadowed)" )
198
+ val AvoidClashName = new SuffixNameExtractor (AVOIDCLASH , " $_avoid_name_clash_$" )
199
+ val ModuleClassName = new SuffixNameExtractor (OBJECTCLASS , " $" , optInfoString = " ModuleClass" )
142
200
143
201
object SignedName extends NameExtractor (63 ) {
144
202
@@ -159,11 +217,7 @@ object NameExtractors {
159
217
def infoString : String = " Signed"
160
218
}
161
219
162
- def extractorOfTag (tag : Int ) = extractors(tag)
163
-
164
- val separatorToQualified : Map [String , QualifiedNameExtractor ] =
165
- Map (" ." -> QualifiedName ,
166
- " $" -> FlattenedName ,
167
- str.EXPAND_SEPARATOR -> ExpandedName ,
168
- str.TRAIT_SETTER_SEPARATOR -> TraitSetterName )
220
+ def simpleExtractorOfTag : collection.Map [Int , ClassifiedNameExtractor ] = simpleExtractors
221
+ def qualifiedExtractorOfSeparator : collection.Map [String , QualifiedNameExtractor ] = qualifiedExtractors
222
+ def uniqueExtractorOfSeparator : collection.Map [String , UniqueNameExtractor ] = uniqueExtractors
169
223
}
0 commit comments