Add packageProto/nameResolver to JvmPackagePartSource

May be useful for loading platform-specific protobuf extensions (such as
package_module_name on JVM) when analyzing deserialized top level
members
This commit is contained in:
Alexander Udalov
2018-01-22 18:03:36 +01:00
parent ec6b49b8b8
commit b4ac852392
5 changed files with 21 additions and 6 deletions
@@ -90,7 +90,9 @@ class IncrementalPackageFragmentProvider(
DeserializedPackageMemberScope( DeserializedPackageMemberScope(
this, packageProto, nameResolver, this, packageProto, nameResolver,
JvmPackagePartSource(partName, facadeName, knownJvmBinaryClass = jvmBinaryClass), JvmPackagePartSource(
partName, facadeName, packageProto, nameResolver, knownJvmBinaryClass = jvmBinaryClass
),
deserializationComponents, classNames = { emptyList() } deserializationComponents, classNames = { emptyList() }
) )
} }
@@ -61,7 +61,9 @@ class DeserializedDescriptorResolver {
val (nameResolver, packageProto) = parseProto(kotlinClass) { val (nameResolver, packageProto) = parseProto(kotlinClass) {
JvmProtoBufUtil.readPackageDataFrom(data, strings) JvmProtoBufUtil.readPackageDataFrom(data, strings)
} ?: return null } ?: return null
val source = JvmPackagePartSource(kotlinClass, kotlinClass.incompatibility, kotlinClass.isPreReleaseInvisible) val source = JvmPackagePartSource(
kotlinClass, packageProto, nameResolver, kotlinClass.incompatibility, kotlinClass.isPreReleaseInvisible
)
return DeserializedPackageMemberScope(descriptor, packageProto, nameResolver, source, components) { return DeserializedPackageMemberScope(descriptor, packageProto, nameResolver, source, components) {
// All classes are included into Java scope // All classes are included into Java scope
emptyList() emptyList()
@@ -20,18 +20,24 @@ import org.jetbrains.kotlin.descriptors.SourceFile
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
class JvmPackagePartSource( class JvmPackagePartSource(
val className: JvmClassName, val className: JvmClassName,
val facadeClassName: JvmClassName?, val facadeClassName: JvmClassName?,
val packageProto: ProtoBuf.Package,
val nameResolver: NameResolver,
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 val knownJvmBinaryClass: KotlinJvmBinaryClass? = null
) : DeserializedContainerSource { ) : DeserializedContainerSource {
constructor( constructor(
kotlinClass: KotlinJvmBinaryClass, kotlinClass: KotlinJvmBinaryClass,
packageProto: ProtoBuf.Package,
nameResolver: NameResolver,
incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>? = null, incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>? = null,
isPreReleaseInvisible: Boolean = false isPreReleaseInvisible: Boolean = false
) : this( ) : this(
@@ -39,6 +45,8 @@ class JvmPackagePartSource(
kotlinClass.classHeader.multifileClassName?.let { kotlinClass.classHeader.multifileClassName?.let {
if (it.isNotEmpty()) JvmClassName.byInternalName(it) else null if (it.isNotEmpty()) JvmClassName.byInternalName(it) else null
}, },
packageProto,
nameResolver,
incompatibility, incompatibility,
isPreReleaseInvisible, isPreReleaseInvisible,
kotlinClass kotlinClass
@@ -92,7 +92,7 @@ class DeserializerForClassfileDecompiler(
val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(annotationData, strings) val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(annotationData, strings)
val membersScope = DeserializedPackageMemberScope( val membersScope = DeserializedPackageMemberScope(
createDummyPackageFragment(header.packageName?.let(::FqName) ?: facadeFqName.parent()), packageProto, nameResolver, createDummyPackageFragment(header.packageName?.let(::FqName) ?: facadeFqName.parent()), packageProto, nameResolver,
JvmPackagePartSource(binaryClassForPackageClass), deserializationComponents JvmPackagePartSource(binaryClassForPackageClass, packageProto, nameResolver), deserializationComponents
) { emptyList() } ) { emptyList() }
return membersScope.getContributedDescriptors().toList() return membersScope.getContributedDescriptors().toList()
} }
@@ -75,7 +75,8 @@ fun createFileFacadeStub(
val fileStub = KotlinFileStubForIde.forFileFacadeStub(facadeFqName) val fileStub = KotlinFileStubForIde.forFileFacadeStub(facadeFqName)
setupFileStub(fileStub, packageFqName) setupFileStub(fileStub, packageFqName)
val container = ProtoContainer.Package( val container = ProtoContainer.Package(
packageFqName, c.nameResolver, c.typeTable, JvmPackagePartSource(JvmClassName.byClassId(ClassId.topLevel(facadeFqName)), null) packageFqName, c.nameResolver, c.typeTable,
JvmPackagePartSource(JvmClassName.byClassId(ClassId.topLevel(facadeFqName)), null, packageProto, c.nameResolver)
) )
createDeclarationsStubs(fileStub, c, container, packageProto) createDeclarationsStubs(fileStub, c, container, packageProto)
return fileStub return fileStub
@@ -95,8 +96,10 @@ fun createMultifileClassStub(
val partHeader = partFile.classHeader val partHeader = partFile.classHeader
val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(partHeader.data!!, partHeader.strings!!) val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(partHeader.data!!, partHeader.strings!!)
val partContext = components.createContext(nameResolver, packageFqName, TypeTable(packageProto.typeTable)) val partContext = components.createContext(nameResolver, packageFqName, TypeTable(packageProto.typeTable))
val container = ProtoContainer.Package(packageFqName, partContext.nameResolver, partContext.typeTable, val container = ProtoContainer.Package(
JvmPackagePartSource(partFile)) packageFqName, partContext.nameResolver, partContext.typeTable,
JvmPackagePartSource(partFile, packageProto, nameResolver)
)
createDeclarationsStubs(fileStub, partContext, container, packageProto) createDeclarationsStubs(fileStub, partContext, container, packageProto)
} }
return fileStub return fileStub