@@ -10,17 +10,20 @@ import com.intellij.openapi.module.Module
10
10
import com.intellij.openapi.module.ModuleManager
11
11
import com.intellij.openapi.project.ModuleListener
12
12
import com.intellij.openapi.project.Project
13
- import com.intellij.openapi.projectRoots.ProjectJdkTable
14
- import com.intellij.openapi.projectRoots.Sdk
13
+ import com.intellij.openapi.projectRoots.*
14
+ import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil
15
15
import com.intellij.openapi.roots.ModuleRootModificationUtil
16
16
import com.intellij.openapi.roots.ProjectRootManager
17
+ import com.intellij.openapi.vfs.VirtualFileManager
17
18
import com.intellij.util.application
18
19
import kotlinx.coroutines.GlobalScope
19
20
import kotlinx.coroutines.future.await
20
21
import kotlinx.coroutines.launch
22
+ import java.nio.file.Path
21
23
import java.util.concurrent.CompletableFuture
22
24
23
25
26
+ @Suppress(" UnstableApiUsage" , " OPT_IN_USAGE" )
24
27
class GitpodProjectManager (
25
28
private val project : Project
26
29
) {
@@ -29,20 +32,39 @@ class GitpodProjectManager(
29
32
configureSdks()
30
33
}
31
34
32
- /* *
33
- * It is a workaround for https://youtrack.jetbrains.com/issue/GTW-88
34
- */
35
35
private fun configureSdks () {
36
36
if (application.isHeadlessEnvironment) {
37
37
return
38
38
}
39
39
val pendingSdk = CompletableFuture <Sdk >()
40
40
application.invokeLaterOnWriteThread {
41
+ application.invokeAndWait { ProjectJdkTable .getInstance().preconfigure() }
42
+
41
43
application.runWriteAction {
44
+ val jdkTable = ProjectJdkTable .getInstance()
45
+
42
46
try {
43
- ProjectJdkTable .getInstance().preconfigure()
44
- pendingSdk.complete(ProjectJdkTable .getInstance().allJdks.firstOrNull())
47
+ var sdk: Sdk ? = null
48
+ val javaHome = System .getenv(" JAVA_HOME" )
49
+ val sdkType = SdkType .findByName(jdkTable.defaultSdkType.name)
50
+
51
+ if (javaHome != = null && sdkType != null && JdkUtil .checkForJdk(javaHome)) {
52
+ val javaHomeVirtualFile = VirtualFileManager .getInstance().findFileByNioPath(Path .of(javaHome))
53
+
54
+ if (javaHomeVirtualFile != null ) {
55
+ sdk = SdkConfigurationUtil .setupSdk(jdkTable.allJdks, javaHomeVirtualFile, sdkType, false , null , null )
56
+ }
57
+ }
58
+
59
+ if (sdk != null && jdkTable.findJdk(sdk.name) == null ) {
60
+ jdkTable.addJdk(sdk)
61
+ pendingSdk.complete(sdk)
62
+ } else {
63
+ jdkTable.preconfigure()
64
+ pendingSdk.complete(jdkTable.allJdks.firstOrNull())
65
+ }
45
66
} catch (t: Throwable ) {
67
+ jdkTable.preconfigure()
46
68
pendingSdk.completeExceptionally(t)
47
69
}
48
70
}
@@ -58,24 +80,23 @@ class GitpodProjectManager(
58
80
configureSdk(sdk)
59
81
}
60
82
}
61
-
62
83
private fun configureSdk (sdk : Sdk ) {
63
84
application.invokeLaterOnWriteThread {
64
85
application.runWriteAction {
65
86
val projectRootManager = ProjectRootManager .getInstance(project)
66
- if (projectRootManager.projectSdk == null ) {
87
+ if (projectRootManager.projectSdk != sdk ) {
67
88
projectRootManager.projectSdk = sdk
68
89
thisLogger().warn(" gitpod: '${project.name} ' project: SDK was auto preconfigured: $sdk " )
69
90
}
70
91
}
71
92
}
72
93
for (module in ModuleManager .getInstance(project).modules) {
73
94
ModuleRootModificationUtil .updateModel(module) { m ->
74
- if (m.sdk == null ) {
95
+ if (m.sdk != sdk ) {
75
96
m.sdk = sdk
76
97
thisLogger().warn(" gitpod: '${module.name} ' module: SDK was auto preconfigured: $sdk " )
77
98
}
78
99
}
79
100
}
80
101
}
81
- }
102
+ }
0 commit comments