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.JavaClass
import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass
import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava 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.IncrementalPackageFragmentProvider
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackagePartProvider import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackagePartProvider
import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.modules.TargetId
@@ -212,7 +213,8 @@ object TopDownAnalyzerFacadeForJVM {
targetIds?.mapTo(additionalProviders) { targetId -> targetIds?.mapTo(additionalProviders) { targetId ->
IncrementalPackageFragmentProvider( IncrementalPackageFragmentProvider(
files, module, storageManager, container.get<DeserializationComponentsForJava>().components, 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.PackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource 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.PackagePartClassUtils
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.modules.TargetId
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -42,7 +44,8 @@ class IncrementalPackageFragmentProvider(
val storageManager: StorageManager, val storageManager: StorageManager,
val deserializationComponents: DeserializationComponents, val deserializationComponents: DeserializationComponents,
val incrementalCache: IncrementalCache, val incrementalCache: IncrementalCache,
val target: TargetId val target: TargetId,
private val kotlinClassFinder: KotlinClassFinder
) : PackageFragmentProvider { ) : PackageFragmentProvider {
val fqNameToPackageFragment = val fqNameToPackageFragment =
PackagePartClassUtils.getFilesWithCallables(sourceFiles) PackagePartClassUtils.getFilesWithCallables(sourceFiles)
@@ -79,11 +82,17 @@ class IncrementalPackageFragmentProvider(
partsInternalNames.mapNotNull { internalName -> partsInternalNames.mapNotNull { internalName ->
incrementalCache.getPackagePartData(internalName)?.let { (data, strings) -> incrementalCache.getPackagePartData(internalName)?.let { (data, strings) ->
val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(data, strings) val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(data, strings)
val jvmBinaryClass = kotlinClassFinder.findKotlinClass(
ClassId.topLevel(FqName(internalName.replace('/', '.')))
)
DeserializedPackageMemberScope( DeserializedPackageMemberScope(
this, packageProto, nameResolver, this, packageProto, nameResolver,
JvmPackagePartSource( JvmPackagePartSource(
JvmClassName.byInternalName(internalName), JvmClassName.byInternalName(internalName),
JvmClassName.byFqNameWithoutInnerClasses(multifileClassFqName.asString()) JvmClassName.byFqNameWithoutInnerClasses(multifileClassFqName.asString()),
knownJvmBinaryClass = jvmBinaryClass
), ),
deserializationComponents, classNames = { emptyList() } deserializationComponents, classNames = { emptyList() }
) )
@@ -242,7 +242,10 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any,
} }
} }
if (container is ProtoContainer.Package && container.source is JvmPackagePartSource) { 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 return null
} }
@@ -27,7 +27,8 @@ class JvmPackagePartSource(
val className: JvmClassName, val className: JvmClassName,
val facadeClassName: JvmClassName?, val facadeClassName: JvmClassName?,
override val incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>? = null, override val incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>? = null,
override val isPreReleaseInvisible: Boolean = false override val isPreReleaseInvisible: Boolean = false,
val knownJvmBinaryClass: KotlinJvmBinaryClass? = null
) : DeserializedContainerSource { ) : DeserializedContainerSource {
constructor( constructor(
kotlinClass: KotlinJvmBinaryClass, kotlinClass: KotlinJvmBinaryClass,
@@ -39,7 +40,8 @@ class JvmPackagePartSource(
if (it.isNotEmpty()) JvmClassName.byInternalName(it) else null if (it.isNotEmpty()) JvmClassName.byInternalName(it) else null
}, },
incompatibility, incompatibility,
isPreReleaseInvisible isPreReleaseInvisible,
kotlinClass
) )
override val presentableString: String override val presentableString: String