@@ -62,10 +62,13 @@ object Names {
6262 /** This name downcasted to a term name */
6363 def asTermName : TermName
6464
65- def toSimpleName : SimpleTermName = this .asInstanceOf [SimpleTermName ]
65+ def isSimple : Boolean
66+ def asSimpleName : SimpleTermName
67+ def toSimpleName : SimpleTermName
68+ def mapSimpleCore (f : SimpleTermName => Name ): ThisName
6669
6770 /** A name of the same kind as this name and with same characters as given `name` */
68- def fromName (name : Name ): ThisName
71+ def likeKinded (name : Name ): ThisName
6972
7073 def derived (info : NameInfo ): ThisName
7174 def without (kind : NameInfo .Kind ): ThisName
@@ -84,10 +87,14 @@ object Names {
8487 def ++ (other : Name ): ThisName = ++ (other.toString)
8588 def ++ (other : String ): ThisName
8689
87- def replace (from : Char , to : Char ): ThisName = fromName(toSimpleName .replace(from, to))
90+ def replace (from : Char , to : Char ): ThisName = likeKinded(asSimpleName .replace(from, to))
8891
92+ def isEmpty : Boolean
8993 def startsWith (str : String ): Boolean
9094 def startsWith (name : Name ): Boolean = startsWith(name.toString)
95+ def endsWith (str : String ): Boolean
96+ def endsWith (name : Name ): Boolean = endsWith(name.toString)
97+
9198
9299 override def equals (that : Any ) = this eq that.asInstanceOf [AnyRef ]
93100 }
@@ -112,7 +119,7 @@ object Names {
112119 _typeName
113120 }
114121
115- def fromName (name : Name ): TermName = name.toTermName
122+ def likeKinded (name : Name ): TermName = name.toTermName
116123
117124 def info = NameInfo .TermName
118125 def underlying : TermName = unsupported(" underlying" )
@@ -178,6 +185,9 @@ object Names {
178185 ownKind == kind ||
179186 ! NameInfo .definesNewName(ownKind) && ownKind > kind && underlying.is(kind)
180187 }
188+
189+ override def hashCode = System .identityHashCode(this )
190+ override def equals (other : Any ) = this eq other.asInstanceOf [AnyRef ]
181191 }
182192
183193 class SimpleTermName (val start : Int , val length : Int , @ sharable private [Names ] var next : SimpleTermName ) extends TermName {
@@ -193,21 +203,34 @@ object Names {
193203 i < length
194204 }
195205
206+ def isEmpty = length == 0
207+
196208 def startsWith (str : String ): Boolean = {
197209 var i = 0
198210 while (i < str.length && i < length && apply(i) == str(i)) i += 1
199211 i == str.length
200212 }
201213
214+ def endsWith (str : String ): Boolean = {
215+ var i = 1
216+ while (i <= str.length && i <= length && apply(length - i) == str(str.length - i)) i += 1
217+ i > str.length
218+ }
219+
202220 override def replace (from : Char , to : Char ): ThisName = {
203221 val cs = new Array [Char ](length)
204222 Array .copy(chrs, start, cs, 0 , length)
205223 for (i <- 0 until length) {
206224 if (cs(i) == from) cs(i) = to
207225 }
208- fromName (termName(cs, 0 , length))
226+ likeKinded (termName(cs, 0 , length))
209227 }
210228
229+ def isSimple = true
230+ def asSimpleName = this
231+ def toSimpleName = this
232+ def mapSimpleCore (f : SimpleTermName => Name ): TermName = likeKinded(f(this ))
233+
211234 def encode : SimpleTermName =
212235 if (dontEncode(toTermName)) this else NameTransformer .encode(this )
213236
@@ -225,14 +248,14 @@ object Names {
225248
226249 class TypeName (val toTermName : TermName ) extends Name {
227250
228- override def toSimpleName : SimpleTermName = toTermName.toSimpleName
229-
230251 def ++ (other : String ): ThisName = toTermName.++ (other).toTypeName
231252
253+ def isEmpty = toTermName.isEmpty
232254 def startsWith (str : String ): Boolean = toTermName.startsWith(str)
255+ def endsWith (str : String ): Boolean = toTermName.endsWith(str)
233256
234- def encode : Name = toTermName.encode
235- def decode : Name = toTermName.decode
257+ def encode : Name = toTermName.encode.toTypeName
258+ def decode : Name = toTermName.decode.toTypeName
236259
237260 type ThisName = TypeName
238261 def isTypeName = true
@@ -241,7 +264,12 @@ object Names {
241264 def asTypeName = this
242265 def asTermName = throw new ClassCastException (this + " is not a term name" )
243266
244- def fromName (name : Name ): TypeName = name.toTypeName
267+ def isSimple = toTermName.isSimple
268+ def asSimpleName = toTermName.asSimpleName
269+ def toSimpleName = toTermName.toSimpleName
270+ def mapSimpleCore (f : SimpleTermName => Name ): TypeName = toTermName.mapSimpleCore(f).toTypeName
271+
272+ def likeKinded (name : Name ): TypeName = name.toTypeName
245273
246274 def derived (info : NameInfo ): TypeName = toTermName.derived(info).toTypeName
247275 def without (kind : NameInfo .Kind ): TypeName = toTermName.without(kind).toTypeName
@@ -254,14 +282,21 @@ object Names {
254282 /** A term name that's derived from an `underlying` name and that
255283 * adds `info` to it.
256284 */
257- class DerivedTermName (override val underlying : TermName , override val info : NameInfo )
285+ case class DerivedTermName (override val underlying : TermName , override val info : NameInfo )
258286 extends TermName {
259287 def ++ (other : String ): ThisName = derived(info ++ other)
288+ def isEmpty = false
260289 def startsWith (str : String ): Boolean = underlying.startsWith(str)
290+ def endsWith (str : String ): Boolean = info.satisfies(_.endsWith(str))
261291 def encode : Name = underlying.encode.derived(info.map(_.encode))
262292 def decode : Name = underlying.decode.derived(info.map(_.decode))
263293 override def toString = info.mkString(underlying)
264294 override def debugString = s " ${underlying.debugString}[ $info] "
295+
296+ def isSimple = false
297+ def asSimpleName = throw new UnsupportedOperationException (s " $debugString is not a simple name " )
298+ def toSimpleName = termName(toString)
299+ def mapSimpleCore (f : SimpleTermName => Name ) = underlying.mapSimpleCore(f).derived(info)
265300 }
266301
267302 // Nametable
@@ -413,8 +448,8 @@ object Names {
413448 StringBuilder .newBuilder.mapResult(termName(_).toTypeName)
414449
415450 implicit class nameToSeq (val name : Name ) extends IndexedSeqOptimized [Char , Name ] {
416- def length = name.toSimpleName .length
417- def apply (n : Int ) = name.toSimpleName .apply(n)
451+ def length = name.asSimpleName .length
452+ def apply (n : Int ) = name.asSimpleName .apply(n)
418453 override protected [this ] def newBuilder : Builder [Char , Name ] =
419454 if (name.isTypeName) typeNameBuilder else termNameBuilder
420455
0 commit comments