Skip to content

Commit a588271

Browse files
authored
Run apollo-compiler in the background (#83)
* Run apollo-compiler in background * Handle cancellation as much as possible
1 parent 67234ff commit a588271

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

plugin/src/main/kotlin/com/apollographql/ijplugin/codegen/ApolloCodegenService.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import com.intellij.openapi.util.CheckedDisposable
3838
import com.intellij.openapi.vfs.VfsUtil
3939
import com.intellij.psi.PsiDocumentManager
4040
import kotlinx.coroutines.CoroutineScope
41+
import kotlinx.coroutines.Job
4142
import kotlinx.coroutines.launch
4243
import org.gradle.tooling.CancellationTokenSource
4344
import org.gradle.tooling.GradleConnector
@@ -54,6 +55,7 @@ class ApolloCodegenService(
5455
private var dirtyGqlDocument: Document? = null
5556

5657
private var gradleCodegenCancellation: CancellationTokenSource? = null
58+
private var apolloCompilerCodegenJob: Job? = null
5759

5860
init {
5961
logd("project=${project.name}")
@@ -165,7 +167,10 @@ class ApolloCodegenService(
165167

166168
if (apolloKotlinService?.hasCompilerOptions == true) {
167169
// We can use the built-in Apollo compiler
168-
ApolloCompilerHelper(project).generateSources(apolloKotlinService)
170+
apolloCompilerCodegenJob?.cancel()
171+
apolloCompilerCodegenJob = coroutineScope.launch {
172+
ApolloCompilerHelper(project).generateSources(apolloKotlinService)
173+
}
169174
} else {
170175
// Fall back to the Gradle codegen task
171176
startGradleCodegen()
@@ -231,6 +236,8 @@ class ApolloCodegenService(
231236

232237
private fun stopCodegen() {
233238
logd()
239+
apolloCompilerCodegenJob?.cancel()
240+
apolloCompilerCodegenJob = null
234241
gradleCodegenCancellation?.cancel()
235242
gradleCodegenCancellation = null
236243
}
@@ -257,7 +264,9 @@ class ApolloCodegenService(
257264
private fun startCodegen() {
258265
if (project.apolloKotlinProjectModelService.getApolloKotlinServices().any { it.hasCompilerOptions }) {
259266
logd("Using Apollo compiler for codegen")
260-
ApolloCompilerHelper(project).generateAllSources()
267+
apolloCompilerCodegenJob = coroutineScope.launch {
268+
ApolloCompilerHelper(project).generateAllSources()
269+
}
261270
} else {
262271
logd("Using Gradle codegen task")
263272
startGradleCodegen()

plugin/src/main/kotlin/com/apollographql/ijplugin/codegen/ApolloCompilerHelper.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import com.apollographql.ijplugin.gradle.ApolloKotlinService.Id
1818
import com.apollographql.ijplugin.gradle.apolloKotlinProjectModelService
1919
import com.apollographql.ijplugin.util.logd
2020
import com.apollographql.ijplugin.util.logw
21+
import com.intellij.openapi.progress.ProcessCanceledException
22+
import com.intellij.openapi.progress.ProgressManager
2123
import com.intellij.openapi.project.Project
2224
import com.intellij.openapi.vfs.VfsUtil
2325
import java.io.File
@@ -63,7 +65,7 @@ class ApolloCompilerHelper(
6365
codegenSchemaOptionsFile = schemaService.codegenSchemaOptionsFile!!,
6466
codegenSchemaFile = codegenSchemaFile,
6567
)
66-
68+
ProgressManager.checkCanceled()
6769

6870
val allUpstreamServiceIds = service.allUpstreamServiceIds()
6971
if (allUpstreamServiceIds == null) {
@@ -91,6 +93,7 @@ class ApolloCompilerHelper(
9193
irOptionsFile = service.irOptionsFile!!,
9294
irOperationsFile = irOperationsFile,
9395
)
96+
ProgressManager.checkCanceled()
9497
irOperationsById[service.id] = irOperationsFile
9598
}
9699

@@ -132,6 +135,7 @@ class ApolloCompilerHelper(
132135
outputDirectory = service.codegenOutputDir!!,
133136
metadataOutput = metadataOutput,
134137
)
138+
ProgressManager.checkCanceled()
135139
upstreamMetadata.add(metadataOutput)
136140
outputDirs.add(service.codegenOutputDir)
137141
}
@@ -149,13 +153,18 @@ class ApolloCompilerHelper(
149153
codegenOptions = service.codegenOptionsFile!!,
150154
outputDirectory = service.dataBuildersOutputDir!!,
151155
)
156+
ProgressManager.checkCanceled()
152157
outputDirs.add(service.dataBuildersOutputDir)
153158
}
154159
}
155160

156161
logd("Apollo compiler sources generated for service ${service.id} at ${service.codegenOutputDir}")
157162
return outputDirs
158163
} catch (e: Exception) {
164+
if (e is ProcessCanceledException) {
165+
logd("Apollo compiler was canceled")
166+
throw e
167+
}
159168
logw(e, "Failed to generate sources for service ${service.id}")
160169
}
161170
return emptySet()

0 commit comments

Comments
 (0)