Use known jvm binary class for package part if possible

This commit is contained in:
Denis Zharkov
2017-07-19 16:38:25 +03:00
parent 99a10d8d63
commit 90e894b171
4 changed files with 22 additions and 6 deletions
@@ -50,6 +50,7 @@ import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolver
import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass
import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackagePartProvider
import org.jetbrains.kotlin.modules.TargetId
@@ -212,7 +213,8 @@ object TopDownAnalyzerFacadeForJVM {
targetIds?.mapTo(additionalProviders) { targetId ->
IncrementalPackageFragmentProvider(
files, module, storageManager, container.get<DeserializationComponentsForJava>().components,
incrementalComponents.getIncrementalCache(targetId), targetId
incrementalComponents.getIncrementalCache(targetId), targetId,
container.get<KotlinClassFinder>()
)
}
}
@@ -21,9 +21,11 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
import org.jetbrains.kotlin.modules.TargetId
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
@@ -42,7 +44,8 @@ class IncrementalPackageFragmentProvider(
val storageManager: StorageManager,
val deserializationComponents: DeserializationComponents,
val incrementalCache: IncrementalCache,
val target: TargetId
val target: TargetId,
private val kotlinClassFinder: KotlinClassFinder
) : PackageFragmentProvider {
val fqNameToPackageFragment =
PackagePartClassUtils.getFilesWithCallables(sourceFiles)
@@ -79,11 +82,17 @@ class IncrementalPackageFragmentProvider(
partsInternalNames.mapNotNull { internalName ->
incrementalCache.getPackagePartData(internalName)?.let { (data, strings) ->
val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(data, strings)
val jvmBinaryClass = kotlinClassFinder.findKotlinClass(
ClassId.topLevel(FqName(internalName.replace('/', '.')))
)
DeserializedPackageMemberScope(
this, packageProto, nameResolver,
JvmPackagePartSource(
JvmClassName.byInternalName(internalName),
JvmClassName.byFqNameWithoutInnerClasses(multifileClassFqName.asString())
JvmClassName.byFqNameWithoutInnerClasses(multifileClassFqName.asString()),
knownJvmBinaryClass = jvmBinaryClass
),
deserializationComponents, classNames = { emptyList() }
)
@@ -242,7 +242,10 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any,
}
}
if (container is ProtoContainer.Package && container.source is JvmPackagePartSource) {
return kotlinClassFinder.findKotlinClass((container.source as JvmPackagePartSource).classId)
val jvmPackagePartSource = container.source as JvmPackagePartSource
return jvmPackagePartSource.knownJvmBinaryClass
?: kotlinClassFinder.findKotlinClass(jvmPackagePartSource.classId)
}
return null
}
@@ -27,7 +27,8 @@ class JvmPackagePartSource(
val className: JvmClassName,
val facadeClassName: JvmClassName?,
override val incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>? = null,
override val isPreReleaseInvisible: Boolean = false
override val isPreReleaseInvisible: Boolean = false,
val knownJvmBinaryClass: KotlinJvmBinaryClass? = null
) : DeserializedContainerSource {
constructor(
kotlinClass: KotlinJvmBinaryClass,
@@ -39,7 +40,8 @@ class JvmPackagePartSource(
if (it.isNotEmpty()) JvmClassName.byInternalName(it) else null
},
incompatibility,
isPreReleaseInvisible
isPreReleaseInvisible,
kotlinClass
)
override val presentableString: String