@@ -12,15 +12,19 @@ import com.intellij.openapi.project.ModuleListener
12
12
import com.intellij.openapi.project.Project
13
13
import com.intellij.openapi.projectRoots.ProjectJdkTable
14
14
import com.intellij.openapi.projectRoots.Sdk
15
+ import com.intellij.openapi.projectRoots.SdkType
16
+ import com.intellij.openapi.projectRoots.impl.JavaHomeFinder
17
+ import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil
15
18
import com.intellij.openapi.roots.ModuleRootModificationUtil
16
19
import com.intellij.openapi.roots.ProjectRootManager
20
+ import com.intellij.openapi.util.registry.Registry
17
21
import com.intellij.util.application
18
22
import kotlinx.coroutines.GlobalScope
19
23
import kotlinx.coroutines.future.await
20
24
import kotlinx.coroutines.launch
21
25
import java.util.concurrent.CompletableFuture
22
26
23
-
27
+ @Suppress( " UnstableApiUsage " , " OPT_IN_USAGE " )
24
28
class GitpodProjectManager (
25
29
private val project : Project
26
30
) {
@@ -33,23 +37,33 @@ class GitpodProjectManager(
33
37
* It is a workaround for https://youtrack.jetbrains.com/issue/GTW-88
34
38
*/
35
39
private fun configureSdks () {
36
- if (application.isHeadlessEnvironment) {
40
+ if (application.isHeadlessEnvironment || Registry .get( " gitpod.autoJdk.disabled " ).asBoolean() ) {
37
41
return
38
42
}
39
43
val pendingSdk = CompletableFuture <Sdk >()
40
44
application.invokeLaterOnWriteThread {
41
45
application.runWriteAction {
42
46
try {
43
- ProjectJdkTable .getInstance().preconfigure()
44
- pendingSdk.complete(ProjectJdkTable .getInstance().allJdks.firstOrNull())
47
+ val jdkTable = ProjectJdkTable .getInstance()
48
+ jdkTable.preconfigure()
49
+ val preferredJdkHomePath = JavaHomeFinder .getFinder().findExistingJdks().firstOrNull()
50
+ if (preferredJdkHomePath != null ) {
51
+ val sdk = SdkConfigurationUtil .createAndAddSDK(
52
+ preferredJdkHomePath,
53
+ SdkType .findByName(jdkTable.defaultSdkType.name)!!
54
+ )
55
+ pendingSdk.complete(sdk)
56
+ } else {
57
+ pendingSdk.complete(jdkTable.allJdks.firstOrNull())
58
+ }
45
59
} catch (t: Throwable ) {
46
60
pendingSdk.completeExceptionally(t)
47
61
}
48
62
}
49
63
}
50
64
GlobalScope .launch {
51
65
val sdk = pendingSdk.await() ? : return @launch
52
- thisLogger().warn(" gitpod: '${project.name} ' project: SDK detected: $sdk " )
66
+ thisLogger().warn(" gitpod: '${project.name} ' project: preferred SDK detected: $sdk " )
53
67
project.messageBus.connect().subscribe(ProjectTopics .MODULES , object : ModuleListener {
54
68
override fun moduleAdded (project : Project , module : Module ) {
55
69
configureSdk(sdk)
@@ -65,17 +79,15 @@ class GitpodProjectManager(
65
79
val projectRootManager = ProjectRootManager .getInstance(project)
66
80
if (projectRootManager.projectSdk == null ) {
67
81
projectRootManager.projectSdk = sdk
68
- thisLogger().warn(" gitpod: '${project.name} ' project: SDK was auto preconfigured: $sdk " )
69
82
}
70
83
}
71
84
}
72
85
for (module in ModuleManager .getInstance(project).modules) {
73
86
ModuleRootModificationUtil .updateModel(module) { m ->
74
87
if (m.sdk == null ) {
75
88
m.sdk = sdk
76
- thisLogger().warn(" gitpod: '${module.name} ' module: SDK was auto preconfigured: $sdk " )
77
89
}
78
90
}
79
91
}
80
92
}
81
- }
93
+ }
0 commit comments