Skip to content

Commit 52e03ff

Browse files
authored
[IJ plugin] v3->v4 migration: add useV3ExceptionHandling(true) to ApolloClient.Builder(). (#5135)
1 parent 6a51c63 commit 52e03ff

File tree

7 files changed

+109
-0
lines changed

7 files changed

+109
-0
lines changed

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/refactoring/migration/v3tov4/ApolloV3ToV4MigrationProcessor.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ import com.apollographql.ijplugin.refactoring.migration.item.UpdateGradleDepende
1313
import com.apollographql.ijplugin.refactoring.migration.item.UpdateGradlePluginInBuildKts
1414
import com.apollographql.ijplugin.refactoring.migration.item.UpdateMethodCall
1515
import com.apollographql.ijplugin.refactoring.migration.item.UpdateMethodName
16+
import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.AddUseV3ExceptionHandling
1617
import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.EncloseInService
1718
import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.RemoveFieldInService
19+
import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.RemoveMethodInService
1820
import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.RemoveWatchMethodArguments
1921
import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.UpdateEnumClassUpperCase
2022
import com.apollographql.ijplugin.refactoring.migration.v3tov4.item.UpdateFieldNameInService
@@ -77,6 +79,9 @@ class ApolloV3ToV4MigrationProcessor(project: Project) : ApolloMigrationRefactor
7779

7880
UpdateEnumClassUpperCase,
7981

82+
// Exception handling
83+
AddUseV3ExceptionHandling,
84+
8085
// Gradle
8186
UpdateGradlePluginInBuildKts(apollo3, apollo3, apollo4LatestVersion),
8287
UpdateGradleDependenciesInToml(apollo3, apollo3, apollo4LatestVersion),
@@ -85,6 +90,7 @@ class ApolloV3ToV4MigrationProcessor(project: Project) : ApolloMigrationRefactor
8590
UpdateFieldNameInService("generateModelBuilder", "generateModelBuilders"),
8691
UpdateFieldNameInService("generateTestBuilders", "generateDataBuilders"),
8792
RemoveFieldInService("languageVersion"),
93+
RemoveMethodInService("testDirConnection"),
8894
UpdateCustomTypeMappingInBuildKts,
8995
UpdateMultiModuleConfiguration,
9096
EncloseInService,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.apollographql.ijplugin.refactoring.migration.v3tov4.item
2+
3+
import com.apollographql.ijplugin.refactoring.findMethodReferences
4+
import com.apollographql.ijplugin.refactoring.migration.item.MigrationItem
5+
import com.apollographql.ijplugin.refactoring.migration.item.MigrationItemUsageInfo
6+
import com.apollographql.ijplugin.refactoring.migration.item.toMigrationItemUsageInfo
7+
import com.intellij.openapi.project.Project
8+
import com.intellij.psi.PsiMigration
9+
import com.intellij.psi.search.GlobalSearchScope
10+
import org.jetbrains.kotlin.psi.KtPsiFactory
11+
12+
object AddUseV3ExceptionHandling : MigrationItem() {
13+
override fun findUsages(project: Project, migration: PsiMigration, searchScope: GlobalSearchScope): List<MigrationItemUsageInfo> {
14+
return findMethodReferences(
15+
project = project,
16+
className = "com.apollographql.apollo3.ApolloClient.Builder",
17+
methodName = "Builder",
18+
)
19+
.toMigrationItemUsageInfo()
20+
}
21+
22+
override fun performRefactoring(project: Project, migration: PsiMigration, usage: MigrationItemUsageInfo) {
23+
val parentExpression = usage.element.parent?.parent ?: return
24+
val replacedExpression = KtPsiFactory(project).createExpression(parentExpression.text.replace("Builder()", "Builder().useV3ExceptionHandling(true)"))
25+
parentExpression.replace(replacedExpression)
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.apollographql.ijplugin.refactoring.migration.v3tov4.item
2+
3+
import com.apollographql.ijplugin.refactoring.migration.item.DeletesElements
4+
import com.apollographql.ijplugin.refactoring.migration.item.MigrationItem
5+
import com.apollographql.ijplugin.refactoring.migration.item.MigrationItemUsageInfo
6+
import com.apollographql.ijplugin.refactoring.migration.item.toMigrationItemUsageInfo
7+
import com.apollographql.ijplugin.util.findPsiFilesByName
8+
import com.apollographql.ijplugin.util.getMethodName
9+
import com.intellij.openapi.project.Project
10+
import com.intellij.psi.PsiMigration
11+
import com.intellij.psi.search.GlobalSearchScope
12+
import org.jetbrains.kotlin.psi.KtCallExpression
13+
import org.jetbrains.kotlin.psi.KtFile
14+
import org.jetbrains.kotlin.psi.KtTreeVisitorVoid
15+
16+
class RemoveMethodInService(
17+
val methodName: String,
18+
) : MigrationItem(), DeletesElements {
19+
override fun findUsages(project: Project, migration: PsiMigration, searchScope: GlobalSearchScope): List<MigrationItemUsageInfo> {
20+
val usages = mutableListOf<MigrationItemUsageInfo>()
21+
val buildGradleKtsFiles: List<KtFile> = project.findPsiFilesByName("build.gradle.kts", searchScope).filterIsInstance<KtFile>()
22+
for (file in buildGradleKtsFiles) {
23+
file.accept(object : KtTreeVisitorVoid() {
24+
override fun visitCallExpression(expression: KtCallExpression) {
25+
super.visitCallExpression(expression)
26+
if (expression.getMethodName() == "apollo") {
27+
expression.accept(object : KtTreeVisitorVoid() {
28+
override fun visitCallExpression(expression: KtCallExpression) {
29+
super.visitCallExpression(expression)
30+
if (expression.getMethodName() == methodName) {
31+
usages.add(expression.toMigrationItemUsageInfo())
32+
}
33+
}
34+
})
35+
}
36+
}
37+
})
38+
}
39+
return usages
40+
}
41+
42+
override fun performRefactoring(project: Project, migration: PsiMigration, usage: MigrationItemUsageInfo) {
43+
usage.element.delete()
44+
}
45+
}

intellij-plugin/src/test/kotlin/com/apollographql/ijplugin/ApolloV3ToV4MigrationTest.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ class ApolloV3ToV4MigrationTest : ApolloTestCase() {
4848
@Test
4949
fun testUpdateEnumClassUpperCase() = runMigration()
5050

51+
@Test
52+
fun testUseV3ExceptionHandling() = runMigration()
53+
5154
private fun runMigration(extension: String = "kt", fileNameInProject: String? = null) {
5255
val fileBaseName = getTestName(true)
5356
if (fileNameInProject != null) {

intellij-plugin/src/test/testData/migration/v3-to-v4/gradleDeprecations.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,22 @@ apollo {
66
generateModelBuilder.set(true)
77
generateTestBuilders.set(true)
88
languageVersion.set("1.4")
9+
10+
testDirConnection {
11+
// Make test builders available to main (not just test or androidTest) to be used by our mock data
12+
connectToAndroidSourceSet("main")
13+
}
914
}
1015

1116
apollo {
1217
service("xxx") {
1318
generateModelBuilder.set(true)
1419
generateTestBuilders.set(true)
1520
languageVersion.set("1.4")
21+
22+
testDirConnection {
23+
// Make test builders available to main (not just test or androidTest) to be used by our mock data
24+
connectToAndroidSourceSet("main")
25+
}
1626
}
1727
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.example.myapplication
2+
3+
import com.apollographql.apollo3.ApolloClient
4+
5+
suspend fun test() {
6+
val apolloClient: ApolloClient? = ApolloClient.Builder()
7+
.serverUrl("http://localhost")
8+
.build()
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.example.myapplication
2+
3+
import com.apollographql.apollo3.ApolloClient
4+
5+
suspend fun test() {
6+
val apolloClient: ApolloClient? = ApolloClient.Builder().useV3ExceptionHandling(true)
7+
.serverUrl("http://localhost")
8+
.build()
9+
}

0 commit comments

Comments
 (0)