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