Skip to content

Commit

Permalink
[IJ plugin] v3->v4 migration: add useV3ExceptionHandling(true) to `…
Browse files Browse the repository at this point in the history
…ApolloClient.Builder()`. (#5135)
  • Loading branch information
BoD authored Aug 2, 2023
1 parent 6a51c63 commit 52e03ff
Show file tree
Hide file tree
Showing 7 changed files with 109 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -77,6 +79,9 @@ class ApolloV3ToV4MigrationProcessor(project: Project) : ApolloMigrationRefactor

UpdateEnumClassUpperCase,

// Exception handling
AddUseV3ExceptionHandling,

// Gradle
UpdateGradlePluginInBuildKts(apollo3, apollo3, apollo4LatestVersion),
UpdateGradleDependenciesInToml(apollo3, apollo3, apollo4LatestVersion),
Expand All @@ -85,6 +90,7 @@ class ApolloV3ToV4MigrationProcessor(project: Project) : ApolloMigrationRefactor
UpdateFieldNameInService("generateModelBuilder", "generateModelBuilders"),
UpdateFieldNameInService("generateTestBuilders", "generateDataBuilders"),
RemoveFieldInService("languageVersion"),
RemoveMethodInService("testDirConnection"),
UpdateCustomTypeMappingInBuildKts,
UpdateMultiModuleConfiguration,
EncloseInService,
Expand Down
Original file line number Diff line number Diff line change
@@ -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<MigrationItemUsageInfo> {
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)
}
}
Original file line number Diff line number Diff line change
@@ -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<MigrationItemUsageInfo> {
val usages = mutableListOf<MigrationItemUsageInfo>()
val buildGradleKtsFiles: List<KtFile> = project.findPsiFilesByName("build.gradle.kts", searchScope).filterIsInstance<KtFile>()
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()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,22 @@ 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 {
service("xxx") {
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")
}
}
}
Original file line number Diff line number Diff line change
@@ -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()
}
Original file line number Diff line number Diff line change
@@ -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()
}

0 comments on commit 52e03ff

Please sign in to comment.