org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.cli.jvm.compiler
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
import java.io.EOFException
class JvmPackagePartProvider(val env: KotlinCoreEnvironment) : PackagePartProvider {
val roots by lazy {
env.configuration.getList(CommonConfigurationKeys.CONTENT_ROOTS).
filterIsInstance().
mapNotNull {
env.contentRootToVirtualFile(it);
}.filter { it.findChild("META-INF") != null }
}
override fun findPackageParts(packageFqName: String): List {
val pathParts = packageFqName.split('.')
val mappings = roots.filter {
//filter all roots by package path existing
pathParts.fold(it) {
parent, part ->
if (part.isEmpty()) parent
else parent.findChild(part) ?: return@filter false
}
true
}.mapNotNull {
it.findChild("META-INF")
}.flatMap {
it.children.filter { it.name.endsWith(ModuleMapping.MAPPING_FILE_EXT) }
}.map {
try {
ModuleMapping.create(it.contentsToByteArray())
} catch (e: EOFException) {
throw RuntimeException("Error on reading package parts for '$packageFqName' package in '$it', roots: $roots", e)
}
}
return mappings.mapNotNull { it.findPackageParts(packageFqName) }.flatMap { it.parts }.distinct()
}
}