1
1
package com.squareup.cash.hermit.idea
2
2
3
+ import com.intellij.openapi.application.ApplicationManager
4
+ import com.intellij.openapi.diagnostic.Logger
5
+ import com.intellij.openapi.project.Project
6
+ import com.squareup.cash.hermit.*
7
+
3
8
/* *
4
- * JDK Updater for IntelliJ IDEA - TEMPORARILY DISABLED for GoLand compatibility
5
- *
6
- * The IntelliJ IDEA specific classes (ProjectJdkTable, ProjectJdkImpl)
7
- * don't exist in GoLand, causing verification failures.
8
- *
9
- * This functionality is disabled until we can implement platform-specific loading.
9
+ * JDK Updater for IntelliJ IDEA - Uses runtime class loading for GoLand compatibility
10
10
*/
11
+ class HermitJdkUpdater : HermitPropertyHandler {
12
+ private val log: Logger = Logger .getInstance(this .javaClass)
13
+
14
+ override fun handle (hermitPackage : HermitPackage , project : Project ) {
15
+ if (hermitPackage.type == PackageType .JDK ) {
16
+ try {
17
+ updateJdkSafely(hermitPackage, project)
18
+ } catch (e: ClassNotFoundException ) {
19
+ log.debug(" JDK management not available in this IDE (likely GoLand): ${e.message} " )
20
+ } catch (e: Exception ) {
21
+ log.warn(" Failed to update JDK: ${e.message} " )
22
+ }
23
+ }
24
+ }
25
+
26
+ private fun updateJdkSafely (hermitPackage : HermitPackage , project : Project ) {
27
+ // Use reflection to avoid direct references to IDEA-specific classes
28
+ val projectSdk = getProjectSdk(project)
29
+ val currentSdkName = getSdkName(projectSdk)
30
+ if (hermitPackage.sdkName() != currentSdkName) {
31
+ log.debug(" setting project (${project.name} ) SDK to ${hermitPackage.logString()} " )
32
+ ApplicationManager .getApplication()?.runWriteAction {
33
+ val installed = findInstalledSdkSafely(hermitPackage)
34
+ val sdk = installed ? : createAndRegisterSdk(hermitPackage)
35
+ setProjectSdk(project, sdk)
36
+ }
37
+ }
38
+ }
39
+
40
+ private fun getProjectSdk (project : Project ): Any? {
41
+ return try {
42
+ val projectRootManager = Class .forName(" com.intellij.openapi.roots.ProjectRootManager" )
43
+ val getInstance = projectRootManager.getMethod(" getInstance" , Project ::class .java)
44
+ val instance = getInstance.invoke(null , project)
45
+ val getProjectSdk = projectRootManager.getMethod(" getProjectSdk" )
46
+ getProjectSdk.invoke(instance)
47
+ } catch (e: Exception ) {
48
+ null
49
+ }
50
+ }
51
+
52
+ private fun getSdkName (sdk : Any? ): String? {
53
+ return try {
54
+ if (sdk == null ) null
55
+ else {
56
+ val getName = sdk.javaClass.getMethod(" getName" )
57
+ getName.invoke(sdk) as ? String
58
+ }
59
+ } catch (e: Exception ) {
60
+ null
61
+ }
62
+ }
63
+
64
+ private fun findInstalledSdkSafely (hermitPackage : HermitPackage ): Any? {
65
+ return try {
66
+ val projectJdkTable = Class .forName(" com.intellij.openapi.projectRoots.ProjectJdkTable" )
67
+ val getInstance = projectJdkTable.getMethod(" getInstance" )
68
+ val instance = getInstance.invoke(null )
69
+ val findJdk = projectJdkTable.getMethod(" findJdk" , String ::class .java)
70
+ findJdk.invoke(instance, hermitPackage.sdkName())
71
+ } catch (e: Exception ) {
72
+ null
73
+ }
74
+ }
75
+
76
+ private fun createAndRegisterSdk (hermitPackage : HermitPackage ): Any {
77
+ val javaSdk = Class .forName(" com.intellij.openapi.projectRoots.JavaSdk" )
78
+ val getInstance = javaSdk.getMethod(" getInstance" )
79
+ val sdkInstance = getInstance.invoke(null )
80
+ val createJdk = javaSdk.getMethod(" createJdk" , String ::class .java, String ::class .java)
81
+ val sdk = createJdk.invoke(sdkInstance, hermitPackage.sdkName(), hermitPackage.path)
82
+
83
+ // Register the SDK
84
+ val projectJdkTable = Class .forName(" com.intellij.openapi.projectRoots.ProjectJdkTable" )
85
+ val getTableInstance = projectJdkTable.getMethod(" getInstance" )
86
+ val tableInstance = getTableInstance.invoke(null )
87
+ val addJdk = projectJdkTable.getMethod(" addJdk" , Class .forName(" com.intellij.openapi.projectRoots.Sdk" ))
88
+ addJdk.invoke(tableInstance, sdk)
89
+
90
+ return sdk
91
+ }
11
92
12
- // Disabled implementation - would implement HermitPropertyHandler in IDEA-only environment
13
- // Original functionality: Updates project JDK when Hermit JDK packages are detected
14
- class HermitJdkUpdater {
15
- // Placeholder class to prevent compilation errors
93
+ private fun setProjectSdk (project : Project , sdk : Any ) {
94
+ val projectRootManager = Class .forName(" com.intellij.openapi.roots.ProjectRootManager" )
95
+ val getInstance = projectRootManager.getMethod(" getInstance" , Project ::class .java)
96
+ val instance = getInstance.invoke(null , project)
97
+ val setProjectSdk = projectRootManager.getMethod(" setProjectSdk" , Class .forName(" com.intellij.openapi.projectRoots.Sdk" ))
98
+ setProjectSdk.invoke(instance, sdk)
99
+ }
16
100
}
0 commit comments