Allow the usage of virtual JVM content roots in kotlinc (#4645)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user