@@ -8,33 +8,38 @@ import StdNames._
88import util .DotClass
99import tasty .TastyFormat ._
1010import Decorators ._
11+ import Contexts .Context
1112import collection .mutable
1213
1314object NameExtractors {
1415
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 ]
1619
1720 abstract class NameInfo extends DotClass {
18- def tag : Int
19- def definesNewName : Boolean = false
21+ def extractor : NameExtractor
2022 def mkString (underlying : TermName ): String
2123 def map (f : SimpleTermName => SimpleTermName ): NameInfo = this
2224 }
2325
24- val simpleTermNameInfo = new NameInfo {
25- def tag = UTF8
26- def mkString (underlying : TermName ): String = unsupported(" mkString" )
27- }
28-
2926 abstract class NameExtractor (val tag : Int ) extends DotClass { self =>
30- def mkString (underlying : TermName , info : ThisInfo ): String
31- def infoString : String
3227 type ThisInfo <: Info
3328 class Info extends NameInfo { this : ThisInfo =>
34- def tag = self.tag
29+ def extractor = self
3530 def mkString (underlying : TermName ) = self.mkString(underlying, this )
3631 override def toString = infoString
3732 }
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" )
3843 }
3944
4045 abstract class ClassifiedNameExtractor (tag : Int , val infoString : String ) extends NameExtractor (tag) {
@@ -46,26 +51,28 @@ object NameExtractors {
4651 case DerivedTermName (underlying, `info`) => Some (underlying)
4752 case _ => None
4853 }
49- extractors (tag) = this
54+ simpleExtractors (tag) = this
5055 }
5156
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) {
5359 def mkString (underlying : TermName , info : ThisInfo ) =
5460 underlying.mapLast(n => termName(prefix + n.toString)).toString
5561 }
5662
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) {
5865 def mkString (underlying : TermName , info : ThisInfo ) = underlying.toString ++ suffix
5966 }
6067
6168 trait QualifiedInfo extends NameInfo {
6269 val name : SimpleTermName
6370 }
6471
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) {
6674 type ThisInfo = QualInfo
6775 case class QualInfo (val name : SimpleTermName ) extends Info with QualifiedInfo {
68- override def definesNewName = true
6976 override def map (f : SimpleTermName => SimpleTermName ): NameInfo = new QualInfo (f(name))
7077 override def toString = s " $infoString $name"
7178 }
@@ -75,26 +82,32 @@ object NameExtractors {
7582 case DerivedTermName (qual, info : this .QualInfo ) => Some ((qual, info.name))
7683 case _ => None
7784 }
85+
86+ override def definesNewName = true
87+
7888 def mkString (underlying : TermName , info : ThisInfo ) =
7989 s " $underlying$separator${info.name}"
90+ def infoString = s " Qualified $separator"
91+
92+ qualifiedExtractors(separator) = this
8093 }
8194
8295 object AnyQualifiedName {
83- def unapply (name : DerivedTermName ): Option [(TermName , QualifiedInfo )] = name match {
96+ def unapply (name : DerivedTermName ): Option [(TermName , SimpleTermName )] = name match {
8497 case DerivedTermName (qual, info : QualifiedInfo ) =>
85- Some ((name.underlying, info))
98+ Some ((name.underlying, info.name ))
8699 case _ => None
87100 }
88101 }
89102
90103 trait NumberedInfo {
91104 def num : Int
105+ def extractor : NameExtractor
92106 }
93107
94108 abstract class NumberedNameExtractor (tag : Int , val infoString : String ) extends NameExtractor (tag) { self =>
95109 type ThisInfo = NumberedInfo
96110 case class NumberedInfo (val num : Int ) extends Info with NameExtractors .NumberedInfo {
97- override def definesNewName = self.definesNewName
98111 override def toString = s " $infoString $num"
99112 }
100113 def apply (qual : TermName , num : Int ) =
@@ -103,20 +116,66 @@ object NameExtractors {
103116 case DerivedTermName (underlying, info : this .NumberedInfo ) => Some ((underlying, info.num))
104117 case _ => None
105118 }
106- def definesNewName = false
107119 }
108120
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+ }
114144 }
115145
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" )
120179
121180 object DefaultGetterName extends NumberedNameExtractor (DEFAULTGETTER , " DefaultGetter" ) {
122181 def mkString (underlying : TermName , info : ThisInfo ) = {
@@ -133,12 +192,11 @@ object NameExtractors {
133192 }
134193 }
135194
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" )
142200
143201 object SignedName extends NameExtractor (63 ) {
144202
@@ -159,11 +217,7 @@ object NameExtractors {
159217 def infoString : String = " Signed"
160218 }
161219
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
169223}
0 commit comments