Skip to content

Commit 559cd05

Browse files
authored
[IJ Plugin] Pass arguments to rover (#6303)
1 parent 3621352 commit 559cd05

File tree

18 files changed

+271
-86
lines changed

18 files changed

+271
-86
lines changed

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/GradleToolingModelService.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ import com.apollographql.ijplugin.settings.ProjectSettingsState
99
import com.apollographql.ijplugin.settings.projectSettingsState
1010
import com.apollographql.ijplugin.telemetry.telemetryService
1111
import com.apollographql.ijplugin.util.dispose
12+
import com.apollographql.ijplugin.util.executeOnPooledThread
1213
import com.apollographql.ijplugin.util.isNotDisposed
1314
import com.apollographql.ijplugin.util.logd
1415
import com.apollographql.ijplugin.util.logw
1516
import com.apollographql.ijplugin.util.newDisposable
1617
import com.intellij.openapi.Disposable
17-
import com.intellij.openapi.application.ApplicationManager
1818
import com.intellij.openapi.components.Service
1919
import com.intellij.openapi.components.service
2020
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId
@@ -144,7 +144,7 @@ class GradleToolingModelService(
144144
return
145145
}
146146

147-
fetchToolingModelsTask = FetchToolingModelsTask().also { ApplicationManager.getApplication().executeOnPooledThread(it) }
147+
fetchToolingModelsTask = FetchToolingModelsTask().also { executeOnPooledThread { it.run() } }
148148
}
149149

150150
private inner class FetchToolingModelsTask : Runnable {
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.apollographql.ijplugin.lsp
2+
3+
import com.apollographql.ijplugin.settings.AppSettingsListener
4+
import com.apollographql.ijplugin.settings.AppSettingsState
5+
import com.apollographql.ijplugin.settings.ProjectSettingsListener
6+
import com.apollographql.ijplugin.settings.ProjectSettingsState
7+
import com.apollographql.ijplugin.settings.appSettingsState
8+
import com.apollographql.ijplugin.settings.projectSettingsState
9+
import com.apollographql.ijplugin.util.logd
10+
import com.intellij.openapi.Disposable
11+
import com.intellij.openapi.application.runWriteAction
12+
import com.intellij.openapi.components.Service
13+
import com.intellij.openapi.fileTypes.ex.FileTypeManagerEx
14+
import com.intellij.openapi.project.Project
15+
import com.intellij.util.application
16+
17+
@Service(Service.Level.APP)
18+
class ApolloLspAppService : Disposable {
19+
init {
20+
logd()
21+
startObserveSettings()
22+
}
23+
24+
private fun startObserveSettings() {
25+
logd()
26+
application.messageBus.connect(this).subscribe(AppSettingsListener.TOPIC, object : AppSettingsListener {
27+
var lspModeEnabled = appSettingsState.lspModeEnabled
28+
override fun settingsChanged(appSettingsState: AppSettingsState) {
29+
val lspModeEnabledChanged = lspModeEnabled != appSettingsState.lspModeEnabled
30+
lspModeEnabled = appSettingsState.lspModeEnabled
31+
logd("lspModeEnabledChanged=$lspModeEnabledChanged")
32+
if (lspModeEnabledChanged) {
33+
runWriteAction {
34+
FileTypeManagerEx.getInstanceEx().makeFileTypesChange("Apollo GraphQL file type change", {})
35+
}
36+
restartApolloLsp()
37+
}
38+
}
39+
})
40+
}
41+
42+
override fun dispose() {
43+
logd()
44+
}
45+
}
46+
47+
@Service(Service.Level.PROJECT)
48+
class ApolloLspProjectService(private val project: Project) : Disposable {
49+
init {
50+
logd()
51+
startObserveSettings()
52+
}
53+
54+
private fun startObserveSettings() {
55+
logd()
56+
project.messageBus.connect(this).subscribe(ProjectSettingsListener.TOPIC, object : ProjectSettingsListener {
57+
var lspPassPathToSuperGraphYaml = project.projectSettingsState.lspPassPathToSuperGraphYaml
58+
var lspPathToSuperGraphYaml = project.projectSettingsState.lspPathToSuperGraphYaml
59+
var lspPassAdditionalArguments = project.projectSettingsState.lspPassAdditionalArguments
60+
var lspAdditionalArguments = project.projectSettingsState.lspAdditionalArguments
61+
62+
override fun settingsChanged(projectSettingsState: ProjectSettingsState) {
63+
val lspPassPathToSuperGraphYamlChanged = lspPassPathToSuperGraphYaml != projectSettingsState.lspPassPathToSuperGraphYaml
64+
val lspPathToSuperGraphYamlChanged = lspPathToSuperGraphYaml != projectSettingsState.lspPathToSuperGraphYaml
65+
val lspPassAdditionalArgumentsChanged = lspPassAdditionalArguments != projectSettingsState.lspPassAdditionalArguments
66+
val lspAdditionalArgumentsChanged = lspAdditionalArguments != projectSettingsState.lspAdditionalArguments
67+
lspPassPathToSuperGraphYaml = projectSettingsState.lspPassPathToSuperGraphYaml
68+
lspPathToSuperGraphYaml = projectSettingsState.lspPathToSuperGraphYaml
69+
lspPassAdditionalArguments = projectSettingsState.lspPassAdditionalArguments
70+
lspAdditionalArguments = projectSettingsState.lspAdditionalArguments
71+
logd("lspPassPathToSuperGraphYamlChanged=$lspPassPathToSuperGraphYamlChanged lspPathToSuperGraphYamlChanged=$lspPathToSuperGraphYamlChanged lspPassAdditionalArgumentsChanged=$lspPassAdditionalArgumentsChanged lspAdditionalArgumentsChanged=$lspAdditionalArgumentsChanged")
72+
if (lspPassPathToSuperGraphYamlChanged || lspPathToSuperGraphYamlChanged || lspPassAdditionalArgumentsChanged || lspAdditionalArgumentsChanged) {
73+
restartApolloLsp()
74+
}
75+
}
76+
})
77+
}
78+
79+
override fun dispose() {
80+
logd()
81+
}
82+
}

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/lsp/ApolloLspServerSupportProvider.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.apollographql.ijplugin.icons.ApolloIcons
77
import com.apollographql.ijplugin.rover.RoverHelper
88
import com.apollographql.ijplugin.settings.appSettingsState
99
import com.apollographql.ijplugin.settings.lsp.LspSettingsConfigurable
10-
import com.intellij.openapi.application.invokeLater
10+
import com.intellij.openapi.application.runInEdt
1111
import com.intellij.openapi.project.Project
1212
import com.intellij.openapi.project.ProjectManager
1313
import com.intellij.openapi.vfs.VirtualFile
@@ -36,16 +36,16 @@ internal class ApolloLspServerSupportProvider : LspServerSupportProvider {
3636

3737
private class ApolloLspServerDescriptor(project: Project) : ProjectWideLspServerDescriptor(project, "Apollo") {
3838
override fun isSupportedFile(file: VirtualFile) = file.extension in ApolloGraphQLFileType.SUPPORTED_EXTENSIONS
39-
override fun createCommandLine() = RoverHelper.getLspCommandLine()
39+
override fun createCommandLine() = RoverHelper.getLspCommandLine(project)
4040

4141
override fun getLanguageId(file: VirtualFile): String {
4242
return "graphql"
4343
}
4444
}
4545

4646
fun restartApolloLsp() {
47-
invokeLater {
48-
for (project in ProjectManager.getInstance().getOpenProjects()) {
47+
runInEdt {
48+
for (project in ProjectManager.getInstance().openProjects) {
4949
LspServerManager.getInstance(project).stopAndRestartIfNeeded(ApolloLspServerSupportProvider::class.java)
5050
}
5151
}

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/lsp/ApolloLspService.kt

Lines changed: 0 additions & 41 deletions
This file was deleted.

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/project/ApolloProjectManagerListener.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ package com.apollographql.ijplugin.project
33
import com.apollographql.ijplugin.codegen.ApolloCodegenService
44
import com.apollographql.ijplugin.gradle.GradleToolingModelService
55
import com.apollographql.ijplugin.graphql.GraphQLConfigService
6-
import com.apollographql.ijplugin.lsp.ApolloLspService
6+
import com.apollographql.ijplugin.lsp.ApolloLspAppService
7+
import com.apollographql.ijplugin.lsp.ApolloLspProjectService
78
import com.apollographql.ijplugin.lsp.isLspAvailable
89
import com.apollographql.ijplugin.settings.ProjectSettingsService
910
import com.apollographql.ijplugin.studio.fieldinsights.FieldInsightsService
@@ -32,7 +33,8 @@ internal class ApolloProjectManagerListener : ProjectManagerListener {
3233
project.service<FieldInsightsService>()
3334
project.service<TelemetryService>()
3435
if (isLspAvailable()) {
35-
application.service<ApolloLspService>()
36+
project.service<ApolloLspProjectService>()
37+
application.service<ApolloLspAppService>()
3638
}
3739

3840
project.apolloProjectService.isInitialized = true

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.apollographql.ijplugin.util.logd
1111
import com.apollographql.ijplugin.util.logw
1212
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
1313
import com.intellij.history.LocalHistory
14-
import com.intellij.openapi.application.ApplicationManager
1514
import com.intellij.openapi.application.WriteAction
1615
import com.intellij.openapi.externalSystem.service.execution.ProgressExecutionMode
1716
import com.intellij.openapi.externalSystem.util.ExternalSystemUtil
@@ -27,6 +26,7 @@ import com.intellij.psi.search.GlobalSearchScope
2726
import com.intellij.refactoring.BaseRefactoringProcessor
2827
import com.intellij.refactoring.ui.UsageViewDescriptorAdapter
2928
import com.intellij.usageView.UsageInfo
29+
import com.intellij.util.application
3030
import org.jetbrains.kotlin.idea.util.application.isUnitTestMode
3131
import org.jetbrains.kotlin.psi.KtFile
3232
import org.jetbrains.kotlin.psi.KtPsiFactory
@@ -113,7 +113,7 @@ abstract class ApolloMigrationRefactoringProcessor(project: Project) : BaseRefac
113113
}
114114
return usageInfos.toTypedArray()
115115
} finally {
116-
ApplicationManager.getApplication().invokeLater({ WriteAction.run<Throwable>(::finishMigration) }, myProject.disposed)
116+
application.invokeLater({ WriteAction.run<Throwable>(::finishMigration) }, myProject.disposed)
117117
}
118118
}
119119

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/rover/RoverHelper.kt

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,34 @@
11
package com.apollographql.ijplugin.rover
22

3+
import com.apollographql.ijplugin.settings.projectSettingsState
34
import com.intellij.execution.configurations.GeneralCommandLine
45
import com.intellij.execution.processTools.getResultStdoutStr
56
import com.intellij.execution.processTools.mapFlat
7+
import com.intellij.openapi.project.Project
68
import kotlinx.coroutines.runBlocking
79

810
object RoverHelper {
911
private fun getRoverBinDirectory() = "${System.getProperty("user.home")}/.rover/bin"
1012

1113
private fun getRoverExecutablePath() = "${getRoverBinDirectory()}/rover"
1214

13-
fun getLspCommandLine() = object : GeneralCommandLine("rover", "lsp") {
15+
fun getLspCommandLine(project: Project): GeneralCommandLine = RoverCommandLine(project)
16+
17+
private class RoverCommandLine(project: Project) : GeneralCommandLine() {
18+
init {
19+
setExePath(getRoverExecutablePath())
20+
setWorkDirectory(getRoverBinDirectory())
21+
getEnvironment().put("RUST_BACKTRACE", "full")
22+
addParameter("lsp")
23+
if (project.projectSettingsState.lspPassPathToSuperGraphYaml && project.projectSettingsState.lspPathToSuperGraphYaml.isNotBlank()) {
24+
addParameter("--supergraph-config")
25+
addParameter(project.projectSettingsState.lspPathToSuperGraphYaml)
26+
}
27+
if (project.projectSettingsState.lspPassAdditionalArguments && project.projectSettingsState.lspAdditionalArguments.isNotBlank()) {
28+
addParameters(project.projectSettingsState.lspAdditionalArguments.split(' '))
29+
}
30+
}
31+
1432
override fun createProcess(processBuilder: ProcessBuilder): Process {
1533
return try {
1634
super.createProcess(processBuilder)
@@ -23,9 +41,6 @@ object RoverHelper {
2341
}
2442
}
2543
}
26-
.withExePath(getRoverExecutablePath())
27-
.withWorkDirectory(getRoverBinDirectory())
28-
.withEnvironment("RUST_BACKTRACE", "full")
2944

3045
sealed interface RoverStatus {
3146
data object NotInstalled : RoverStatus

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/AppSettingsStateService.kt renamed to intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/AppSettingsService.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.apollographql.ijplugin.settings
22

3-
import com.intellij.openapi.application.ApplicationManager
43
import com.intellij.openapi.components.PersistentStateComponent
54
import com.intellij.openapi.components.Service
65
import com.intellij.openapi.components.State
76
import com.intellij.openapi.components.Storage
87
import com.intellij.openapi.components.service
8+
import com.intellij.util.application
99
import com.intellij.util.xmlb.XmlSerializerUtil
1010

1111
/**
@@ -16,7 +16,7 @@ import com.intellij.util.xmlb.XmlSerializerUtil
1616
name = "com.apollographql.ijplugin.settings.AppSettingsState",
1717
storages = [Storage("apollo.xml")]
1818
)
19-
class AppSettingsStateService : PersistentStateComponent<AppSettingsStateImpl>, AppSettingsState {
19+
class AppSettingsService : PersistentStateComponent<AppSettingsStateImpl>, AppSettingsState {
2020
private val _state = AppSettingsStateImpl()
2121

2222
override fun getState(): AppSettingsStateImpl {
@@ -53,7 +53,7 @@ class AppSettingsStateService : PersistentStateComponent<AppSettingsStateImpl>,
5353
private fun notifySettingsChanged() {
5454
if (lastNotifiedState != _state) {
5555
lastNotifiedState = _state.copy()
56-
ApplicationManager.getApplication().messageBus.syncPublisher(AppSettingsListener.TOPIC).settingsChanged(_state)
56+
application.messageBus.syncPublisher(AppSettingsListener.TOPIC).settingsChanged(_state)
5757
}
5858
}
5959
}
@@ -70,4 +70,4 @@ data class AppSettingsStateImpl(
7070
override var lspModeEnabled: Boolean = false,
7171
) : AppSettingsState
7272

73-
val appSettingsState get(): AppSettingsState = service<AppSettingsStateService>()
73+
val appSettingsState get(): AppSettingsState = service<AppSettingsService>()

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/ProjectSettingsService.kt

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.apollographql.ijplugin.settings
22

3+
import com.android.tools.idea.concurrency.executeOnPooledThread
34
import com.apollographql.ijplugin.gradle.ApolloKotlinService
45
import com.intellij.credentialStore.CredentialAttributes
56
import com.intellij.credentialStore.generateServiceName
@@ -12,6 +13,7 @@ import com.intellij.openapi.components.Storage
1213
import com.intellij.openapi.components.StoragePathMacros
1314
import com.intellij.openapi.components.service
1415
import com.intellij.openapi.project.Project
16+
import com.intellij.openapi.project.guessProjectDir
1517
import com.intellij.util.xmlb.XmlSerializerUtil
1618
import com.intellij.util.xmlb.annotations.Attribute
1719
import com.intellij.util.xmlb.annotations.Transient
@@ -77,6 +79,34 @@ class ProjectSettingsService(private val project: Project) : PersistentStateComp
7779
_state.apolloKotlinServices = value
7880
}
7981

82+
override var lspPassPathToSuperGraphYaml: Boolean
83+
get() = _state.lspPassPathToSuperGraphYaml
84+
set(value) {
85+
_state.lspPassPathToSuperGraphYaml = value
86+
notifySettingsChanged()
87+
}
88+
89+
override var lspPathToSuperGraphYaml: String
90+
get() = _state.lspPathToSuperGraphYaml
91+
set(value) {
92+
_state.lspPathToSuperGraphYaml = value
93+
notifySettingsChanged()
94+
}
95+
96+
override var lspPassAdditionalArguments: Boolean
97+
get() = _state.lspPassAdditionalArguments
98+
set(value) {
99+
_state.lspPassAdditionalArguments = value
100+
notifySettingsChanged()
101+
}
102+
103+
override var lspAdditionalArguments: String
104+
get() = _state.lspAdditionalArguments
105+
set(value) {
106+
_state.lspAdditionalArguments = value
107+
notifySettingsChanged()
108+
}
109+
80110
private var lastNotifiedState: ProjectSettingsState? = null
81111

82112
private fun notifySettingsChanged() {
@@ -96,6 +126,17 @@ class ProjectSettingsService(private val project: Project) : PersistentStateComp
96126
if (telemetryInstanceId.isEmpty()) {
97127
telemetryInstanceId = UUID.randomUUID().toString()
98128
}
129+
130+
if (lspPathToSuperGraphYaml.isEmpty()) {
131+
executeOnPooledThread {
132+
val superGraphYamlFilePath = project.guessProjectDir()?.findChild("supergraph.yaml")?.path
133+
if (superGraphYamlFilePath != null) {
134+
lspPathToSuperGraphYaml = superGraphYamlFilePath
135+
} else {
136+
lspPassPathToSuperGraphYaml = false
137+
}
138+
}
139+
}
99140
}
100141
}
101142

@@ -111,6 +152,10 @@ interface ProjectSettingsState {
111152
* @see com.apollographql.ijplugin.gradle.GradleToolingModelService
112153
*/
113154
var apolloKotlinServices: List<ApolloKotlinService>
155+
var lspPassPathToSuperGraphYaml: Boolean
156+
var lspPathToSuperGraphYaml: String
157+
var lspPassAdditionalArguments: Boolean
158+
var lspAdditionalArguments: String
114159
}
115160

116161
/**
@@ -150,6 +195,10 @@ data class ProjectSettingsStateImpl(
150195
override var apolloKotlinServiceConfigurations: List<ApolloKotlinServiceConfiguration> = emptyList(),
151196
override var telemetryInstanceId: String = "",
152197
override var apolloKotlinServices: List<ApolloKotlinService> = emptyList(),
198+
override var lspPassPathToSuperGraphYaml: Boolean = true,
199+
override var lspPathToSuperGraphYaml: String = "",
200+
override var lspPassAdditionalArguments: Boolean = false,
201+
override var lspAdditionalArguments: String = "",
153202
) : ProjectSettingsState
154203

155204

0 commit comments

Comments
 (0)