From 39f7fef223bb682707878eeb42c118a91301e61d Mon Sep 17 00:00:00 2001 From: BoD Date: Wed, 26 Jul 2023 09:23:11 +0200 Subject: [PATCH] Update enum classes to upper case --- .../ijplugin/refactoring/Refactoring.kt | 5 +++ .../v3tov4/ApolloV3ToV4MigrationProcessor.kt | 3 ++ .../v3tov4/item/UpdateEnumClassUpperCase.kt | 37 +++++++++++++++++++ .../ijplugin/ApolloV3ToV4MigrationTest.kt | 5 ++- .../v3-to-v4/updateEnumClassUpperCase.kt | 33 +++++++++++++++++ .../updateEnumClassUpperCase_after.kt | 33 +++++++++++++++++ 6 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/UpdateEnumClassUpperCase.kt create mode 100644 intellij-plugin/src/test/testData/migration/v3-to-v4/updateEnumClassUpperCase.kt create mode 100644 intellij-plugin/src/test/testData/migration/v3-to-v4/updateEnumClassUpperCase_after.kt diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/Refactoring.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/Refactoring.kt index bfc2fb4b69b..7d4f5dee15b 100644 --- a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/Refactoring.kt +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/Refactoring.kt @@ -12,6 +12,7 @@ import com.intellij.psi.PsiMigration import com.intellij.psi.PsiPackage import com.intellij.psi.PsiReference import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.search.searches.AllClassesSearch import com.intellij.psi.search.searches.ClassInheritorsSearch import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.refactoring.rename.RenamePsiElementProcessor @@ -96,3 +97,7 @@ fun findInheritorsOfClass(project: Project, className: String): Collection { + return AllClassesSearch.search(GlobalSearchScope.projectScope(project), project).findAll() +} diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/ApolloV3ToV4MigrationProcessor.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/ApolloV3ToV4MigrationProcessor.kt index bfe605fbf30..4db144861ef 100644 --- a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/ApolloV3ToV4MigrationProcessor.kt +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/ApolloV3ToV4MigrationProcessor.kt @@ -16,6 +16,7 @@ import com.apollographql.ijplugin.refactoring.migration.item.UpdateMethodName import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.EncloseInService import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.RemoveFieldInService import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.RemoveWatchMethodArguments +import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.UpdateEnumClassUpperCase import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.UpdateFieldNameInService import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.UpdateMultiModuleConfiguration import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.UpdateWebSocketReconnectWhen @@ -74,6 +75,8 @@ class ApolloV3ToV4MigrationProcessor(project: Project) : ApolloMigrationRefactor ConstructorInsteadOfBuilder("$apollo3.cache.normalized.api.CacheKey.Companion", "from"), UpdateWebSocketReconnectWhen, + UpdateEnumClassUpperCase, + // Gradle UpdateGradlePluginInBuildKts(apollo3, apollo3, apollo4LatestVersion), UpdateGradleDependenciesInToml(apollo3, apollo3, apollo4LatestVersion), diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/UpdateEnumClassUpperCase.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/UpdateEnumClassUpperCase.kt new file mode 100644 index 00000000000..796c97a45eb --- /dev/null +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/UpdateEnumClassUpperCase.kt @@ -0,0 +1,37 @@ +package com.apollographql.ijplugin.refactoring.migration.v3tov4.item + +import com.apollographql.ijplugin.navigation.isApolloEnumClass +import com.apollographql.ijplugin.refactoring.findAllClasses +import com.apollographql.ijplugin.refactoring.findClassReferences +import com.apollographql.ijplugin.refactoring.migration.item.MigrationItem +import com.apollographql.ijplugin.refactoring.migration.item.MigrationItemUsageInfo +import com.apollographql.ijplugin.refactoring.migration.item.toMigrationItemUsageInfo +import com.apollographql.ijplugin.util.capitalizeFirstLetter +import com.apollographql.ijplugin.util.cast +import com.apollographql.ijplugin.util.isGenerated +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiMigration +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.asJava.classes.KtUltraLightClass +import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.psi.KtPsiFactory + +object UpdateEnumClassUpperCase : MigrationItem() { + override fun findUsages(project: Project, migration: PsiMigration, searchScope: GlobalSearchScope): List { + val allClasses = findAllClasses(project) + val allApolloGeneratedEnums: List = allClasses + .filter { it.isEnum } + .mapNotNull { it.cast()?.kotlinOrigin?.cast() } + .filter { it.isApolloEnumClass() && it.name!![0].isLowerCase() } + return allApolloGeneratedEnums.flatMap { + findClassReferences(project, it.fqName!!.asString()) + // Exclude references in generated code + .filterNot { it.element.containingFile?.virtualFile?.isGenerated(project) == true } + + }.toMigrationItemUsageInfo() + } + + override fun performRefactoring(project: Project, migration: PsiMigration, usage: MigrationItemUsageInfo) { + usage.element.replace(KtPsiFactory(project).createExpression(usage.element.text.capitalizeFirstLetter())) + } +} diff --git a/intellij-plugin/src/test/kotlin/com/apollographql/ijplugin/ApolloV3ToV4MigrationTest.kt b/intellij-plugin/src/test/kotlin/com/apollographql/ijplugin/ApolloV3ToV4MigrationTest.kt index 0bcf19ad3d9..567aef05d71 100644 --- a/intellij-plugin/src/test/kotlin/com/apollographql/ijplugin/ApolloV3ToV4MigrationTest.kt +++ b/intellij-plugin/src/test/kotlin/com/apollographql/ijplugin/ApolloV3ToV4MigrationTest.kt @@ -31,7 +31,7 @@ class ApolloV3ToV4MigrationTest : ApolloTestCase() { fun testUpdateGradleDependenciesInLibsVersionsToml() = runMigration(extension = "versions.toml", fileNameInProject = "libs.versions.toml") @Test - fun deprecations() = runMigration() + fun testDeprecations() = runMigration() @Test fun testEncloseInService() = runMigration(extension = "gradle.kts", fileNameInProject = "build.gradle.kts") @@ -45,6 +45,9 @@ class ApolloV3ToV4MigrationTest : ApolloTestCase() { @Test fun testMultiModule() = runMigration(extension = "gradle.kts", fileNameInProject = "build.gradle.kts") + @Test + fun testUpdateEnumClassUpperCase() = runMigration() + private fun runMigration(extension: String = "kt", fileNameInProject: String? = null) { val fileBaseName = getTestName(true) if (fileNameInProject != null) { diff --git a/intellij-plugin/src/test/testData/migration/v3-to-v4/updateEnumClassUpperCase.kt b/intellij-plugin/src/test/testData/migration/v3-to-v4/updateEnumClassUpperCase.kt new file mode 100644 index 00000000000..f6b19d87fab --- /dev/null +++ b/intellij-plugin/src/test/testData/migration/v3-to-v4/updateEnumClassUpperCase.kt @@ -0,0 +1,33 @@ +package com.example + +import com.apollographql.apollo3.api.EnumType + +public enum class myEnum( + public val rawValue: String, +) { + VALUE_A("VALUE_A"), + VALUE_B("VALUE_B"), + + /** + * Auto generated constant for unknown enum values + */ + UNKNOWN__("UNKNOWN__"), + ; + + public companion object { + public val type: EnumType = EnumType("myEnum", listOf("VALUE_A", "VALUE_B")) + + public fun safeValueOf(rawValue: String): myEnum = values().find { it.rawValue == rawValue } ?: UNKNOWN__ + + /** + * Returns all [myEnum] known at compile time + */ + public fun knownValues(): Array = arrayOf( + VALUE_A, + VALUE_B) + } +} + +fun main() { + val myEnum: myEnum = myEnum.VALUE_A +} diff --git a/intellij-plugin/src/test/testData/migration/v3-to-v4/updateEnumClassUpperCase_after.kt b/intellij-plugin/src/test/testData/migration/v3-to-v4/updateEnumClassUpperCase_after.kt new file mode 100644 index 00000000000..a38d867faa9 --- /dev/null +++ b/intellij-plugin/src/test/testData/migration/v3-to-v4/updateEnumClassUpperCase_after.kt @@ -0,0 +1,33 @@ +package com.example + +import com.apollographql.apollo3.api.EnumType + +public enum class myEnum( + public val rawValue: String, +) { + VALUE_A("VALUE_A"), + VALUE_B("VALUE_B"), + + /** + * Auto generated constant for unknown enum values + */ + UNKNOWN__("UNKNOWN__"), + ; + + public companion object { + public val type: EnumType = EnumType("myEnum", listOf("VALUE_A", "VALUE_B")) + + public fun safeValueOf(rawValue: String): MyEnum = values().find { it.rawValue == rawValue } ?: UNKNOWN__ + + /** + * Returns all [MyEnum] known at compile time + */ + public fun knownValues(): Array = arrayOf( + VALUE_A, + VALUE_B) + } +} + +fun main() { + val myEnum: MyEnum = MyEnum.VALUE_A +}