Allow the usage of virtual JVM content roots in kotlinc (#4645)

This commit is contained in:
aragos
2021-11-15 20:20:40 -05:00
committed by GitHub
parent 6ec0d94f1d
commit 466acc6132
3 changed files with 32 additions and 8 deletions
@@ -30,8 +30,8 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*
import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.common.messages.MessageUtil import org.jetbrains.kotlin.cli.common.messages.MessageUtil
import org.jetbrains.kotlin.cli.jvm.config.JavaSourceRoot import org.jetbrains.kotlin.cli.jvm.config.JavaSourceRoot
import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRootBase
import org.jetbrains.kotlin.cli.jvm.config.JvmContentRoot import org.jetbrains.kotlin.cli.jvm.config.JvmContentRootBase
import org.jetbrains.kotlin.cli.jvm.config.JvmModulePathRoot import org.jetbrains.kotlin.cli.jvm.config.JvmModulePathRoot
import org.jetbrains.kotlin.cli.jvm.index.JavaRoot import org.jetbrains.kotlin.cli.jvm.index.JavaRoot
import org.jetbrains.kotlin.cli.jvm.modules.CliJavaModuleFinder import org.jetbrains.kotlin.cli.jvm.modules.CliJavaModuleFinder
@@ -51,7 +51,7 @@ class ClasspathRootsResolver(
private val psiManager: PsiManager, private val psiManager: PsiManager,
private val messageCollector: MessageCollector?, private val messageCollector: MessageCollector?,
private val additionalModules: List<String>, private val additionalModules: List<String>,
private val contentRootToVirtualFile: (JvmContentRoot) -> VirtualFile?, private val contentRootToVirtualFile: (JvmContentRootBase) -> VirtualFile?,
private val javaModuleFinder: CliJavaModuleFinder, private val javaModuleFinder: CliJavaModuleFinder,
private val requireStdlibModule: Boolean, private val requireStdlibModule: Boolean,
private val outputDirectory: VirtualFile?, private val outputDirectory: VirtualFile?,
@@ -71,11 +71,11 @@ class ClasspathRootsResolver(
val jvmModulePathRoots = mutableListOf<VirtualFile>() val jvmModulePathRoots = mutableListOf<VirtualFile>()
for (contentRoot in contentRoots) { for (contentRoot in contentRoots) {
if (contentRoot !is JvmContentRoot) continue if (contentRoot !is JvmContentRootBase) continue
val root = contentRootToVirtualFile(contentRoot) ?: continue val root = contentRootToVirtualFile(contentRoot) ?: continue
when (contentRoot) { when (contentRoot) {
is JavaSourceRoot -> javaSourceRoots += RootWithPrefix(root, contentRoot.packagePrefix) is JavaSourceRoot -> javaSourceRoots += RootWithPrefix(root, contentRoot.packagePrefix)
is JvmClasspathRoot -> jvmClasspathRoots += root is JvmClasspathRootBase -> jvmClasspathRoots += root
is JvmModulePathRoot -> jvmModulePathRoots += root is JvmModulePathRoot -> jvmModulePathRoots += root
else -> error("Unknown root type: $contentRoot") else -> error("Unknown root type: $contentRoot")
} }
@@ -404,7 +404,7 @@ class KotlinCoreEnvironment private constructor(
}.orEmpty() }.orEmpty()
} }
private fun contentRootToVirtualFile(root: JvmContentRoot): VirtualFile? = private fun contentRootToVirtualFile(root: JvmContentRootBase): VirtualFile? =
when (root) { when (root) {
is JvmClasspathRoot -> is JvmClasspathRoot ->
if (root.file.isFile) findJarRoot(root.file) else findExistingRoot(root, "Classpath entry") if (root.file.isFile) findJarRoot(root.file) else findExistingRoot(root, "Classpath entry")
@@ -412,6 +412,7 @@ class KotlinCoreEnvironment private constructor(
if (root.file.isFile) findJarRoot(root.file) else findExistingRoot(root, "Java module root") if (root.file.isFile) findJarRoot(root.file) else findExistingRoot(root, "Java module root")
is JavaSourceRoot -> is JavaSourceRoot ->
findExistingRoot(root, "Java source root") findExistingRoot(root, "Java source root")
is VirtualJvmClasspathRoot -> root.file
else -> else ->
throw IllegalStateException("Unexpected root: $root") throw IllegalStateException("Unexpected root: $root")
} }
@@ -16,20 +16,43 @@
package org.jetbrains.kotlin.cli.jvm.config package org.jetbrains.kotlin.cli.jvm.config
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.config.ContentRoot import org.jetbrains.kotlin.cli.common.config.ContentRoot
import org.jetbrains.kotlin.cli.common.config.KotlinSourceRoot import org.jetbrains.kotlin.cli.common.config.KotlinSourceRoot
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import java.io.File import java.io.File
interface JvmContentRoot : ContentRoot { interface JvmContentRootBase : ContentRoot
interface JvmClasspathRootBase : JvmContentRootBase {
val isSdkRoot: Boolean
}
/**
* JVM content root based on a physical file.
*/
interface JvmContentRoot : JvmContentRootBase {
val file: File val file: File
} }
data class JvmClasspathRoot(override val file: File, val isSdkRoot: Boolean) : JvmContentRoot { /**
* JVM content root containing class files in a physical file system (for example a JAR file).
*/
data class JvmClasspathRoot(override val file: File, override val isSdkRoot: Boolean) : JvmContentRoot, JvmClasspathRootBase {
constructor(file: File) : this(file, false) constructor(file: File) : this(file, false)
} }
/**
* JVM content root containing class files in a virutal file system.
*/
data class VirtualJvmClasspathRoot(val file: VirtualFile, override val isSdkRoot: Boolean) : JvmClasspathRootBase {
constructor(file: VirtualFile) : this(file, false)
}
/**
* JVM content root in a physical file system that contains source files.
*/
data class JavaSourceRoot(override val file: File, val packagePrefix: String?) : JvmContentRoot data class JavaSourceRoot(override val file: File, val packagePrefix: String?) : JvmContentRoot
data class JvmModulePathRoot(override val file: File) : JvmContentRoot data class JvmModulePathRoot(override val file: File) : JvmContentRoot