AA: add JDK_HOME as dependent SDK module

This commit is contained in:
Jinseong Jeon
2022-05-03 23:24:47 -07:00
committed by Ilya Kirillov
parent af32a65c78
commit 3f05ba04a9
6 changed files with 92 additions and 19 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.analysis.api.impl.base.util
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.openapi.vfs.VirtualFile
@@ -13,7 +14,9 @@ import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.util.io.URLUtil.JAR_SEPARATOR
import java.nio.file.Files
import java.nio.file.Path
import java.util.Properties
object LibraryUtils {
/**
@@ -83,4 +86,46 @@ object LibraryUtils {
)
return files
}
// Copied (and adjusted) from JavaSdkImpl#readModulesFromReleaseFile
private fun readModulesFromReleaseFile(jrtBaseDir: Path): List<String?>? {
Files.newInputStream(jrtBaseDir.resolve("release")).use { stream ->
val p = Properties()
p.load(stream)
val modules = p.getProperty("MODULES")
if (modules != null) {
return StringUtil.split(StringUtil.unquoteString(modules), " ")
}
}
return null
}
// Copied from JdkUtil#isModularRuntime
private fun isModularRuntime(homePath: Path): Boolean {
return Files.isRegularFile(homePath.resolve("lib/jrt-fs.jar")) || isExplodedModularRuntime(homePath)
}
// Copied from JdkUtil#isExplodedModularRuntime
private fun isExplodedModularRuntime(homePath: Path): Boolean {
return Files.isDirectory(homePath.resolve("modules/java.base"))
}
// Copied (and adjusted) from JavaSdkImpl#findClasses
// Currently, handle modular runtime only
fun findClassesFromJdkHome(jdkHome: Path): List<String> {
val result = mutableListOf<String>()
if (isModularRuntime(jdkHome)) {
val jrtBaseUrl: String = StandardFileSystems.JRT_PROTOCOL_PREFIX + jdkHome.toString() + JAR_SEPARATOR
val modules = readModulesFromReleaseFile(jdkHome)
if (modules != null) {
for (module in modules) {
result.add(jrtBaseUrl + module)
}
}
}
result.sort()
return result
}
}