Skip to content

Commit

Permalink
Update enum classes to upper case
Browse files Browse the repository at this point in the history
  • Loading branch information
BoD committed Jul 26, 2023
1 parent bcb38ab commit 39f7fef
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -96,3 +97,7 @@ fun findInheritorsOfClass(project: Project, className: String): Collection<PsiCl
// Using allScope for the search so all inheritors are found even if some of them are not in the project
return ClassInheritorsSearch.search(psiLookupClass, GlobalSearchScope.allScope(project), true).toList()
}

fun findAllClasses(project: Project): Collection<PsiClass> {
return AllClassesSearch.search(GlobalSearchScope.projectScope(project), project).findAll()
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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),
Expand Down
Original file line number Diff line number Diff line change
@@ -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<MigrationItemUsageInfo> {
val allClasses = findAllClasses(project)
val allApolloGeneratedEnums: List<KtClass> = allClasses
.filter { it.isEnum }
.mapNotNull { it.cast<KtUltraLightClass>()?.kotlinOrigin?.cast<KtClass>() }
.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()))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<myEnum> = arrayOf(
VALUE_A,
VALUE_B)
}
}

fun main() {
val myEnum: myEnum = myEnum.VALUE_A
}
Original file line number Diff line number Diff line change
@@ -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<MyEnum> = arrayOf(
VALUE_A,
VALUE_B)
}
}

fun main() {
val myEnum: MyEnum = MyEnum.VALUE_A
}

0 comments on commit 39f7fef

Please sign in to comment.