From 52e03ffc74551fbf2ffa2781583f28becba15674 Mon Sep 17 00:00:00 2001 From: Benoit Lubek Date: Wed, 2 Aug 2023 17:49:22 +0200 Subject: [PATCH] [IJ plugin] v3->v4 migration: add `useV3ExceptionHandling(true)` to `ApolloClient.Builder()`. (#5135) --- .../v3tov4/ApolloV3ToV4MigrationProcessor.kt | 6 +++ .../v3tov4/item/AddUseV3ExceptionHandling.kt | 27 +++++++++++ .../v3tov4/item/RemoveMethodInService.kt | 45 +++++++++++++++++++ .../ijplugin/ApolloV3ToV4MigrationTest.kt | 3 ++ .../v3-to-v4/gradleDeprecations.gradle.kts | 10 +++++ .../v3-to-v4/useV3ExceptionHandling.kt | 9 ++++ .../v3-to-v4/useV3ExceptionHandling_after.kt | 9 ++++ 7 files changed, 109 insertions(+) create mode 100644 intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/AddUseV3ExceptionHandling.kt create mode 100644 intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/RemoveMethodInService.kt create mode 100644 intellij-plugin/src/test/testData/migration/v3-to-v4/useV3ExceptionHandling.kt create mode 100644 intellij-plugin/src/test/testData/migration/v3-to-v4/useV3ExceptionHandling_after.kt 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 4db144861ef..2b08e02cbe3 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 @@ -13,8 +13,10 @@ import com.apollographql.ijplugin.refactoring.migration.item.UpdateGradleDepende import com.apollographql.ijplugin.refactoring.migration.item.UpdateGradlePluginInBuildKts import com.apollographql.ijplugin.refactoring.migration.item.UpdateMethodCall import com.apollographql.ijplugin.refactoring.migration.item.UpdateMethodName +import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.AddUseV3ExceptionHandling 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.RemoveMethodInService 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 @@ -77,6 +79,9 @@ class ApolloV3ToV4MigrationProcessor(project: Project) : ApolloMigrationRefactor UpdateEnumClassUpperCase, + // Exception handling + AddUseV3ExceptionHandling, + // Gradle UpdateGradlePluginInBuildKts(apollo3, apollo3, apollo4LatestVersion), UpdateGradleDependenciesInToml(apollo3, apollo3, apollo4LatestVersion), @@ -85,6 +90,7 @@ class ApolloV3ToV4MigrationProcessor(project: Project) : ApolloMigrationRefactor UpdateFieldNameInService("generateModelBuilder", "generateModelBuilders"), UpdateFieldNameInService("generateTestBuilders", "generateDataBuilders"), RemoveFieldInService("languageVersion"), + RemoveMethodInService("testDirConnection"), UpdateCustomTypeMappingInBuildKts, UpdateMultiModuleConfiguration, EncloseInService, diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/AddUseV3ExceptionHandling.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/AddUseV3ExceptionHandling.kt new file mode 100644 index 00000000000..d4e5f994484 --- /dev/null +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/AddUseV3ExceptionHandling.kt @@ -0,0 +1,27 @@ +package com.apollographql.ijplugin.refactoring.migration.v3tov4.item + +import com.apollographql.ijplugin.refactoring.findMethodReferences +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.intellij.openapi.project.Project +import com.intellij.psi.PsiMigration +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.psi.KtPsiFactory + +object AddUseV3ExceptionHandling : MigrationItem() { + override fun findUsages(project: Project, migration: PsiMigration, searchScope: GlobalSearchScope): List { + return findMethodReferences( + project = project, + className = "com.apollographql.apollo3.ApolloClient.Builder", + methodName = "Builder", + ) + .toMigrationItemUsageInfo() + } + + override fun performRefactoring(project: Project, migration: PsiMigration, usage: MigrationItemUsageInfo) { + val parentExpression = usage.element.parent?.parent ?: return + val replacedExpression = KtPsiFactory(project).createExpression(parentExpression.text.replace("Builder()", "Builder().useV3ExceptionHandling(true)")) + parentExpression.replace(replacedExpression) + } +} diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/RemoveMethodInService.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/RemoveMethodInService.kt new file mode 100644 index 00000000000..2f18ef56cce --- /dev/null +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/item/RemoveMethodInService.kt @@ -0,0 +1,45 @@ +package com.apollographql.ijplugin.refactoring.migration.v3tov4.item + +import com.apollographql.ijplugin.refactoring.migration.item.DeletesElements +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.findPsiFilesByName +import com.apollographql.ijplugin.util.getMethodName +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiMigration +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtTreeVisitorVoid + +class RemoveMethodInService( + val methodName: String, +) : MigrationItem(), DeletesElements { + override fun findUsages(project: Project, migration: PsiMigration, searchScope: GlobalSearchScope): List { + val usages = mutableListOf() + val buildGradleKtsFiles: List = project.findPsiFilesByName("build.gradle.kts", searchScope).filterIsInstance() + for (file in buildGradleKtsFiles) { + file.accept(object : KtTreeVisitorVoid() { + override fun visitCallExpression(expression: KtCallExpression) { + super.visitCallExpression(expression) + if (expression.getMethodName() == "apollo") { + expression.accept(object : KtTreeVisitorVoid() { + override fun visitCallExpression(expression: KtCallExpression) { + super.visitCallExpression(expression) + if (expression.getMethodName() == methodName) { + usages.add(expression.toMigrationItemUsageInfo()) + } + } + }) + } + } + }) + } + return usages + } + + override fun performRefactoring(project: Project, migration: PsiMigration, usage: MigrationItemUsageInfo) { + usage.element.delete() + } +} 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 567aef05d71..e896258e61d 100644 --- a/intellij-plugin/src/test/kotlin/com/apollographql/ijplugin/ApolloV3ToV4MigrationTest.kt +++ b/intellij-plugin/src/test/kotlin/com/apollographql/ijplugin/ApolloV3ToV4MigrationTest.kt @@ -48,6 +48,9 @@ class ApolloV3ToV4MigrationTest : ApolloTestCase() { @Test fun testUpdateEnumClassUpperCase() = runMigration() + @Test + fun testUseV3ExceptionHandling() = 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/gradleDeprecations.gradle.kts b/intellij-plugin/src/test/testData/migration/v3-to-v4/gradleDeprecations.gradle.kts index c6167e12a53..e9a299fa481 100644 --- a/intellij-plugin/src/test/testData/migration/v3-to-v4/gradleDeprecations.gradle.kts +++ b/intellij-plugin/src/test/testData/migration/v3-to-v4/gradleDeprecations.gradle.kts @@ -6,6 +6,11 @@ apollo { generateModelBuilder.set(true) generateTestBuilders.set(true) languageVersion.set("1.4") + + testDirConnection { + // Make test builders available to main (not just test or androidTest) to be used by our mock data + connectToAndroidSourceSet("main") + } } apollo { @@ -13,5 +18,10 @@ apollo { generateModelBuilder.set(true) generateTestBuilders.set(true) languageVersion.set("1.4") + + testDirConnection { + // Make test builders available to main (not just test or androidTest) to be used by our mock data + connectToAndroidSourceSet("main") + } } } diff --git a/intellij-plugin/src/test/testData/migration/v3-to-v4/useV3ExceptionHandling.kt b/intellij-plugin/src/test/testData/migration/v3-to-v4/useV3ExceptionHandling.kt new file mode 100644 index 00000000000..21fd09f9392 --- /dev/null +++ b/intellij-plugin/src/test/testData/migration/v3-to-v4/useV3ExceptionHandling.kt @@ -0,0 +1,9 @@ +package com.example.myapplication + +import com.apollographql.apollo3.ApolloClient + +suspend fun test() { + val apolloClient: ApolloClient? = ApolloClient.Builder() + .serverUrl("http://localhost") + .build() +} diff --git a/intellij-plugin/src/test/testData/migration/v3-to-v4/useV3ExceptionHandling_after.kt b/intellij-plugin/src/test/testData/migration/v3-to-v4/useV3ExceptionHandling_after.kt new file mode 100644 index 00000000000..56736980abb --- /dev/null +++ b/intellij-plugin/src/test/testData/migration/v3-to-v4/useV3ExceptionHandling_after.kt @@ -0,0 +1,9 @@ +package com.example.myapplication + +import com.apollographql.apollo3.ApolloClient + +suspend fun test() { + val apolloClient: ApolloClient? = ApolloClient.Builder().useV3ExceptionHandling(true) + .serverUrl("http://localhost") + .build() +}