Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Escape "Companion" in enum value names #4558

Merged
merged 1 commit into from Dec 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -10,6 +10,10 @@ private val JAVA_RESERVED_WORDS = arrayOf(
"transient", "try", "true", "void", "volatile", "while"
)

private val TYPE_REGEX = "(?:type)_*".toRegex()
private val COMPANION_REGEX = "(?:Companion)_*".toRegex()
private val KOTLIN_ENUM_RESERVED_WORDS_REGEX = "(?:name|ordinal)_*".toRegex()

fun String.escapeJavaReservedWord() = if (this in JAVA_RESERVED_WORDS) "${this}_" else this

// Does nothing. KotlinPoet will add the backticks
Expand All @@ -19,21 +23,29 @@ internal fun String.escapeTypeReservedWord(): String? {
return when {
// type is forbidden because we use it as a companion property to hold the CompiledType
// See https://github.com/apollographql/apollo-kotlin/issues/4293
"(?:type)_*".toRegex().matches(this) -> "${this}_"
TYPE_REGEX.matches(this) -> "${this}_"
else -> null
}
}

private fun String.escapeCompanionReservedWord(): String? {
return when {
// Companion is forbidden because a Companion class is generated in enum and sealed classes
// See https://github.com/apollographql/apollo-kotlin/issues/4557
COMPANION_REGEX.matches(this) -> "${this}_"
else -> null
}
}

fun String.escapeKotlinReservedWordInEnum(): String {
return when {
// name and ordinal are forbidden because already used in Kotlin
// See https://kotlinlang.org/docs/enum-classes.html#working-with-enum-constants:~:text=properties%20for%20obtaining%20its%20name%20and%20position
"(?:name|ordinal)_*".toRegex().matches(this) -> "${this}_"
else -> escapeTypeReservedWord() ?: escapeKotlinReservedWord()
KOTLIN_ENUM_RESERVED_WORDS_REGEX.matches(this) -> "${this}_"
else -> escapeTypeReservedWord() ?: escapeCompanionReservedWord() ?: escapeKotlinReservedWord()
}
}

fun String.escapeKotlinReservedWordInSealedClass(): String {
return escapeTypeReservedWord() ?: escapeKotlinReservedWord()
return escapeTypeReservedWord() ?: escapeCompanionReservedWord() ?: escapeKotlinReservedWord()
}
4 changes: 4 additions & 0 deletions tests/enums/src/main/graphql/schema.graphqls
Expand Up @@ -20,6 +20,7 @@ enum Direction {
# Value names should be escaped with _ suffixes when generating enums
name,
ordinal,
Companion,
}

enum Gravity {
Expand All @@ -32,6 +33,9 @@ enum Gravity {
LEFT,
RIGHT,

# Value names should be escaped with _ suffixes when generating sealed classes
Companion,

# Value names should not be escaped when generating sealed classes
name,
ordinal,
Expand Down
5 changes: 5 additions & 0 deletions tests/enums/src/test/kotlin/test/EnumsTest.kt
Expand Up @@ -17,6 +17,7 @@ class EnumsTest {
assertEquals(Direction.name_, Direction.safeValueOf("name"))
assertEquals(Direction.ordinal_, Direction.safeValueOf("ordinal"))
assertEquals(Direction.type__, Direction.safeValueOf("type"))
assertEquals(Direction.Companion_, Direction.safeValueOf("Companion"))
}

@Test
Expand All @@ -27,6 +28,7 @@ class EnumsTest {
assertEquals(Gravity.name, Gravity.safeValueOf("name"))
assertEquals(Gravity.ordinal, Gravity.safeValueOf("ordinal"))
assertEquals(Gravity.type__, Gravity.safeValueOf("type"))
assertEquals(Gravity.Companion_, Gravity.safeValueOf("Companion"))
}

@Test
Expand All @@ -37,6 +39,7 @@ class EnumsTest {
assertEquals(enums.java.type.Direction.name, enums.java.type.Direction.safeValueOf("name"))
assertEquals(enums.java.type.Direction.ordinal, enums.java.type.Direction.safeValueOf("ordinal"))
assertEquals(enums.java.type.Direction.type__, enums.java.type.Direction.safeValueOf("type"))
assertEquals(enums.java.type.Direction.Companion, enums.java.type.Direction.safeValueOf("Companion"))
}

@Test
Expand All @@ -47,6 +50,7 @@ class EnumsTest {
assertEquals(enums.java.type.Gravity.name, enums.java.type.Gravity.safeValueOf("name"))
assertEquals(enums.java.type.Gravity.ordinal, enums.java.type.Gravity.safeValueOf("ordinal"))
assertEquals(enums.java.type.Gravity.type__, enums.java.type.Gravity.safeValueOf("type"))
assertEquals(enums.java.type.Gravity.Companion, enums.java.type.Gravity.safeValueOf("Companion"))
}


Expand Down Expand Up @@ -76,6 +80,7 @@ class EnumsTest {
Gravity.BOTTOM,
Gravity.LEFT,
Gravity.RIGHT,
Gravity.Companion_,
Gravity.name,
Gravity.ordinal,
Gravity.type__,
Expand Down