Report error instead of throwing exception in JvmPackagePartProvider

This commit is contained in:
Alexander Udalov
2018-08-17 18:14:02 +02:00
parent a71c66a82f
commit 4f11812668
2 changed files with 22 additions and 8 deletions
@@ -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 ->