Report error instead of throwing exception in JvmPackagePartProvider
This commit is contained in:
@@ -19,16 +19,21 @@ package org.jetbrains.kotlin.cli.jvm.compiler
|
|||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import com.intellij.util.SmartList
|
import com.intellij.util.SmartList
|
||||||
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
|
||||||
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.ERROR
|
||||||
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.LOGGING
|
||||||
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||||
import org.jetbrains.kotlin.cli.jvm.index.JavaRoot
|
import org.jetbrains.kotlin.cli.jvm.index.JavaRoot
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
|
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
|
||||||
import org.jetbrains.kotlin.load.kotlin.loadModuleMapping
|
|
||||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping
|
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping
|
||||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.PackageParts
|
import org.jetbrains.kotlin.metadata.jvm.deserialization.PackageParts
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
|
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.MetadataPartProvider
|
import org.jetbrains.kotlin.serialization.deserialization.MetadataPartProvider
|
||||||
|
import java.io.ByteArrayOutputStream
|
||||||
import java.io.EOFException
|
import java.io.EOFException
|
||||||
|
import java.io.PrintStream
|
||||||
|
|
||||||
class JvmPackagePartProvider(
|
class JvmPackagePartProvider(
|
||||||
languageVersionSettings: LanguageVersionSettings,
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
@@ -77,7 +82,7 @@ class JvmPackagePartProvider(
|
|||||||
}.flatten()
|
}.flatten()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addRoots(roots: List<JavaRoot>) {
|
fun addRoots(roots: List<JavaRoot>, messageCollector: MessageCollector) {
|
||||||
for ((root, type) in roots) {
|
for ((root, type) in roots) {
|
||||||
if (type != JavaRoot.RootType.BINARY) continue
|
if (type != JavaRoot.RootType.BINARY) continue
|
||||||
if (root !in scope) continue
|
if (root !in scope) continue
|
||||||
@@ -86,12 +91,21 @@ class JvmPackagePartProvider(
|
|||||||
for (moduleFile in metaInf.children) {
|
for (moduleFile in metaInf.children) {
|
||||||
if (!moduleFile.name.endsWith(ModuleMapping.MAPPING_FILE_EXT)) continue
|
if (!moduleFile.name.endsWith(ModuleMapping.MAPPING_FILE_EXT)) continue
|
||||||
|
|
||||||
val mapping = try {
|
try {
|
||||||
ModuleMapping.loadModuleMapping(moduleFile.contentsToByteArray(), moduleFile.toString(), deserializationConfiguration)
|
val mapping = ModuleMapping.loadModuleMapping(
|
||||||
|
moduleFile.contentsToByteArray(), moduleFile.toString(), deserializationConfiguration
|
||||||
|
)
|
||||||
|
loadedModules.add(ModuleMappingInfo(root, mapping, moduleFile.nameWithoutExtension))
|
||||||
} catch (e: EOFException) {
|
} catch (e: EOFException) {
|
||||||
throw RuntimeException("Error on reading package parts from $moduleFile in $root", e)
|
messageCollector.report(
|
||||||
|
ERROR, "Error occurred when reading the module: ${e.message}", CompilerMessageLocation.create(moduleFile.path)
|
||||||
|
)
|
||||||
|
messageCollector.report(
|
||||||
|
LOGGING,
|
||||||
|
String(ByteArrayOutputStream().also { e.printStackTrace(PrintStream(it)) }.toByteArray()),
|
||||||
|
CompilerMessageLocation.create(moduleFile.path)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
loadedModules.add(ModuleMappingInfo(root, mapping, moduleFile.nameWithoutExtension))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ class KotlinCoreEnvironment private constructor(
|
|||||||
|
|
||||||
fun createPackagePartProvider(scope: GlobalSearchScope): JvmPackagePartProvider {
|
fun createPackagePartProvider(scope: GlobalSearchScope): JvmPackagePartProvider {
|
||||||
return JvmPackagePartProvider(configuration.languageVersionSettings, scope).apply {
|
return JvmPackagePartProvider(configuration.languageVersionSettings, scope).apply {
|
||||||
addRoots(initialRoots)
|
addRoots(initialRoots, configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY))
|
||||||
packagePartProviders += this
|
packagePartProviders += this
|
||||||
(ModuleAnnotationsResolver.getInstance(project) as CliModuleAnnotationsResolver).addPackagePartProvider(this)
|
(ModuleAnnotationsResolver.getInstance(project) as CliModuleAnnotationsResolver).addPackagePartProvider(this)
|
||||||
}
|
}
|
||||||
@@ -365,7 +365,7 @@ class KotlinCoreEnvironment private constructor(
|
|||||||
val newRoots = classpathRootsResolver.convertClasspathRoots(contentRoots).roots
|
val newRoots = classpathRootsResolver.convertClasspathRoots(contentRoots).roots
|
||||||
|
|
||||||
for (packagePartProvider in packagePartProviders) {
|
for (packagePartProvider in packagePartProviders) {
|
||||||
packagePartProvider.addRoots(newRoots)
|
packagePartProvider.addRoots(newRoots, configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY))
|
||||||
}
|
}
|
||||||
|
|
||||||
return rootsIndex.addNewIndexForRoots(newRoots)?.let { newIndex ->
|
return rootsIndex.addNewIndexForRoots(newRoots)?.let { newIndex ->
|
||||||
|
|||||||
Reference in New Issue
Block a user