@@ -4,10 +4,20 @@ import scala.annotation.tailrec
4
4
object Names {
5
5
6
6
object TastyName {
7
+
7
8
final case class SimpleName (raw : String ) extends TastyName
8
9
final case class ModuleName (base : TastyName ) extends TastyName
9
- final case class QualifiedName (qual : TastyName , name : SimpleName ) extends TastyName
10
+ final case class QualifiedName (qual : TastyName , sep : SimpleName , name : SimpleName ) extends TastyName
10
11
final case class SignedName (qual : TastyName , sig : Signature .MethodSignature [TastyName ]) extends TastyName
12
+ final case class UniqueName (qual : TastyName , sep : SimpleName , num : Int ) extends TastyName
13
+ final case class DefaultName (qual : TastyName , num : Int ) extends TastyName
14
+ final case class VariantName (qual : TastyName , contravariant : Boolean ) extends TastyName
15
+
16
+ val Empty : SimpleName = SimpleName (" " )
17
+ val PathSep : SimpleName = SimpleName (" ." )
18
+ val ExpandedSep : SimpleName = SimpleName (" $$" )
8000
19
+ val ExpandPrefixSep : SimpleName = SimpleName (" $" )
20
+
11
21
}
12
22
13
23
/** class to represent Names as defined in TASTy, with methods to extract scala identifiers
@@ -23,24 +33,28 @@ object Names {
23
33
24
34
final def isModuleName : Boolean = self.isInstanceOf [ModuleName ]
25
35
26
- /** Get the part of this name that represents a Scala identifier
27
- */
28
- @ tailrec
29
- final def identifierPart : SimpleName = self match {
30
- case name : SimpleName => name
31
- case QualifiedName (_, name) => name
32
- case ModuleName (name) => name.identifierPart
33
- case SignedName (name,_) => name.identifierPart
36
+ final def asSimpleName : SimpleName = self match {
37
+ case self : SimpleName => self
38
+ case _ => throw new AssertionError (s " not simplename: ${self.show}" )
34
39
}
35
40
36
- /** Get the optional qualifier if this name forms a path
37
- */
38
- @ tailrec
39
- final def qualifierPart : Option [TastyName ] = self match {
40
- case name : SimpleName => None
41
- case QualifiedName (qual, _) => Some (qual)
42
- case ModuleName (name) => name.qualifierPart
43
- case SignedName (name,_) => name.qualifierPart
41
+ final def export : String = {
42
+ self match {
43
+ case SimpleName (raw) => raw
44
+ case _ =>
45
+ val sb = new StringBuilder (10 )
46
+ def inner (name : TastyName ): Unit = name match {
47
+ case SimpleName (raw) => sb.append(raw)
48
+ case QualifiedName (qual, sep, name) => inner(qual); inner(sep); inner(name)
49
+ case ModuleName (name) => inner(name)
50
+ case SignedName (name,_) => inner(name)
51
+ case UniqueName (qual, sep, num) => inner(qual); inner(sep); sb.append(num)
52
+ case DefaultName (qual, num) => inner(qual); sb.append(" $default$" ); sb.append(num + 1 )
53
+ case VariantName (qual, contra) => sb.append(if (contra) '-' else '+' ); inner(qual)
54
+ }
55
+ inner(self)
56
+ sb.toString
57
+ }
44
58
}
45
59
46
60
/** How to display the name in a TASTy file.
@@ -51,24 +65,41 @@ object Names {
51
65
case _ =>
52
66
val sb = new StringBuilder (10 )
53
67
def inner (name : TastyName ): Unit = name match {
54
- case name : SimpleName => sb.append(name.raw)
55
- case QualifiedName (qual, name) => inner(qual); sb.append(" [Qualified . " ); inner(name); sb.append(']' )
56
- case ModuleName (name) => inner(name); sb.append(" [ModuleClass]" )
57
- case SignedName (name,sig) => inner(name); sb.append(" [Signed " ); sb.append(sig.show); sb.append(']' )
68
+ case name : SimpleName => sb.append(name.raw)
69
+ case QualifiedName (qual, sep, name) => inner(qual); sb.append(" [Qualified " ); inner(sep); sb.append(' ' ); inner(name); sb.append(']' )
70
+ case ModuleName (name) => inner(name); sb.append(" [ModuleClass]" )
71
+ case SignedName (name,sig) => inner(name); sb.append(" [Signed " ); sig.mergeShow(sb).append(']' )
72
+ case UniqueName (qual, sep, num) => inner(qual); sb.append(" [Unique " ); inner(sep); sb.append(" " ).append(num).append(']' )
73
+ case DefaultName (qual, num) => inner(qual); sb.append(" [Default " ); sb.append(num + 1 ).append(']' )
74
+ case VariantName (qual, contra) => inner(qual); sb.append(" [Variant " ).append(if (contra) '-' else '+' ).append(']' )
58
75
}
59
76
inner(self)
60
77
sb.toString
61
78
}
62
79
}
63
80
64
81
final def stripModulePart : TastyName = self match {
65
- case ModuleName (name) => name
66
- case name @ (_:SimpleName | _:QualifiedName | _:SignedName ) => name
82
+ case ModuleName (name) => name
83
+ case name @ (
84
+ _:SimpleName
85
+ | _:QualifiedName
86
+ | _:SignedName
87
+ | _:UniqueName
88
+ | _:DefaultName
89
+ | _:VariantName
90
+ ) => name
67
91
}
68
92
69
93
final def signature : Signature [TastyName ] = self match {
70
- case SignedName (_, signature) => signature
71
- case _:SimpleName | _:QualifiedName | _:ModuleName => Signature .NotAMethod
94
+ case SignedName (_, signature) => signature
95
+ case (
96
+ _:SimpleName
97
+ | _:QualifiedName
98
+ | _:ModuleName
99
+ | _:UniqueName
100
+ | _:DefaultName
101
+ | _:VariantName
102
+ ) => Signature .NotAMethod
72
103
}
73
104
}
74
105
}
0 commit comments