@@ -12,7 +12,13 @@ import javax.lang.model.SourceVersion
1212 * using [SourceVersion.isKeyword].
1313 */
1414object JavaTypeName: StringNotation by UpperCamelCase {
15- override fun print (word : Word ) = UpperCamelCase .print (word).makeValidJavaIdentifier()
15+ override fun print (word : Word ) = UpperCamelCase .print (
16+ Word (word.parts.mapIndexed { index, wordPart ->
17+ if (index == 0 ) wordPart.keepOnlyJavaIdentifierChars()
18+ else wordPart.keepOnlyJavaIdentifierContinuationChars()
19+ })
20+ )
21+ .neutralizeJavaReservedKeywords()
1622
1723 override fun toString () = this ::class .java.simpleName!!
1824}
@@ -28,11 +34,14 @@ object JavaMemberName: BaseStringNotation(camelCaseSplitRegex) {
2834 override fun transformPartAfterParse (index : Int , part : String ) = part.toLowerCase(Locale .ROOT )
2935
3036 override fun print (word : Word ) = word.parts
31- .foldIndexed(StringBuffer ()) { index, left, right ->
32- val rightPart =
33- if (left.contains(Regex (" [a-zA-Z]" ))) right.toFirstUpperOtherLowerCase()
34- else right.toLowerCase()
35- left.append(printBeforePart(index, rightPart)).append(rightPart)
37+ .foldIndexed(StringBuffer ()) { index, existing, part ->
38+ val filteredPart =
39+ if (index == 0 ) part.keepOnlyJavaIdentifierChars()
40+ else part.keepOnlyJavaIdentifierContinuationChars()
41+ val nextPart =
42+ if (existing.contains(Regex (" [a-zA-Z]" ))) filteredPart.toFirstUpperOtherLowerCase()
43+ else filteredPart.toLowerCase()
44+ existing.append(printBeforePart(index, nextPart)).append(nextPart)
3645 }.toString().makeValidJavaIdentifier()
3746}
3847
@@ -79,15 +88,24 @@ object JavaConstantName: StringNotation by ScreamingSnakeCase {
7988 override fun toString () = this ::class .java.simpleName!!
8089}
8190
82- private fun String.makeValidJavaIdentifier () = this .keepOnlyJavaIdentifierChars().neutralizeJavaReservedKeywords().ifEmpty { " __ " }
91+ private fun String.makeValidJavaIdentifier () = this .keepOnlyJavaIdentifierChars().neutralizeJavaReservedKeywords()
8392
8493private fun String.keepOnlyJavaIdentifierChars () = this .chars()
8594 .skipWhile { ! Character .isJavaIdentifierStart(it) }
86- .filter { Character .isJavaIdentifierPart(it) }
87- .collect({ StringBuilder () }, { left, right -> left.appendCodePoint(right) }, { left, right -> left.append(right) })
88- .toString()
89-
90- private fun String.neutralizeJavaReservedKeywords () = if (SourceVersion .isKeyword(this )) this + " _" else this
95+ .keepOnlyJavaIdentifierContinuationChars()
96+ .collectToString()
97+
98+ private fun String.keepOnlyJavaIdentifierContinuationChars () = this .chars().keepOnlyJavaIdentifierContinuationChars().collectToString()
99+ private fun IntStream.keepOnlyJavaIdentifierContinuationChars () = this .filter { Character .isJavaIdentifierPart(it) }
100+ private fun IntStream.collectToString () =
101+ this .collect({ StringBuilder () }, { left, right -> left.appendCodePoint(right) }, { left, right -> left.append(right) })
102+ .toString()
103+
104+ private fun String.neutralizeJavaReservedKeywords () = when {
105+ this == " " -> " __"
106+ SourceVersion .isKeyword(this ) -> this + " _"
107+ else -> this
108+ }
91109
92110private inline fun IntStream.skipWhile (crossinline condition : (Int ) -> Boolean ): IntStream {
93111 var found = false
0 commit comments