Fix protobuf extension API usages
"getExtension" returns default value when the requested extension is not present, which is 0 for Int, which makes no sense for extensions like methodImplClassName that are storing the number in the string table
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fileClasses
|
package org.jetbrains.kotlin.fileClasses
|
||||||
|
|
||||||
|
import com.google.protobuf.MessageLite
|
||||||
import com.intellij.psi.util.CachedValueProvider
|
import com.intellij.psi.util.CachedValueProvider
|
||||||
import com.intellij.psi.util.CachedValuesManager
|
import com.intellij.psi.util.CachedValuesManager
|
||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
||||||
@@ -25,6 +26,7 @@ import org.jetbrains.kotlin.name.FqName
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||||
|
|
||||||
@@ -68,15 +70,24 @@ public object JvmFileClassUtil {
|
|||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
public fun getImplClassName(callable: DeserializedCallableMemberDescriptor): Name? =
|
public fun getImplClassName(callable: DeserializedCallableMemberDescriptor): Name? =
|
||||||
with(callable) {
|
getImplClassName(callable.proto, callable.nameResolver)
|
||||||
val proto = proto
|
|
||||||
when (proto) {
|
@JvmStatic
|
||||||
is ProtoBuf.Constructor -> null
|
public fun getImplClassName(proto: MessageLite, nameResolver: NameResolver): Name? =
|
||||||
is ProtoBuf.Function -> proto.getExtension(JvmProtoBuf.methodImplClassName)
|
when (proto) {
|
||||||
is ProtoBuf.Property -> proto.getExtension(JvmProtoBuf.propertyImplClassName)
|
is ProtoBuf.Constructor ->
|
||||||
else -> error("Unknown message: $proto")
|
null
|
||||||
}?.let { nameResolver.getName(it) }
|
is ProtoBuf.Function ->
|
||||||
}
|
if (proto.hasExtension(JvmProtoBuf.methodImplClassName))
|
||||||
|
proto.getExtension(JvmProtoBuf.methodImplClassName)
|
||||||
|
else null
|
||||||
|
is ProtoBuf.Property ->
|
||||||
|
if (proto.hasExtension(JvmProtoBuf.propertyImplClassName))
|
||||||
|
proto.getExtension(JvmProtoBuf.propertyImplClassName)
|
||||||
|
else null
|
||||||
|
else ->
|
||||||
|
error("Unknown message: $proto")
|
||||||
|
}?.let { nameResolver.getName(it) }
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
public fun getHiddenPartFqName(file: JetFile, jvmFileClassAnnotations: ParsedJmvFileClassAnnotations): FqName =
|
public fun getHiddenPartFqName(file: JetFile, jvmFileClassAnnotations: ParsedJmvFileClassAnnotations): FqName =
|
||||||
|
|||||||
+10
-16
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
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.fileClasses.JvmFileClassUtil
|
||||||
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
|
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
|
||||||
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
|
||||||
@@ -37,7 +38,6 @@ import org.jetbrains.kotlin.serialization.PackageData
|
|||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
|
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
|
||||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
|
||||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
|
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
|
||||||
import org.jetbrains.kotlin.storage.NotNullLazyValue
|
import org.jetbrains.kotlin.storage.NotNullLazyValue
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
@@ -167,28 +167,22 @@ public class IncrementalPackageFragmentProvider(
|
|||||||
this@IncrementalPackageFragment, packageData.packageProto, packageData.nameResolver, deserializationComponents,
|
this@IncrementalPackageFragment, packageData.packageProto, packageData.nameResolver, deserializationComponents,
|
||||||
{ listOf() }
|
{ listOf() }
|
||||||
) {
|
) {
|
||||||
override fun filteredFunctionProtos(protos: Collection<ProtoBuf.Function>): Collection<ProtoBuf.Function> {
|
override fun filteredFunctionProtos(protos: Collection<ProtoBuf.Function>): Collection<ProtoBuf.Function> =
|
||||||
return filteredMemberProtos(protos) {
|
filteredMemberProtos(protos)
|
||||||
it.getExtension(JvmProtoBuf.methodImplClassName)?.let { packageData.nameResolver.getName(it) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun filteredPropertyProtos(protos: Collection<ProtoBuf.Property>): Collection<ProtoBuf.Property> {
|
override fun filteredPropertyProtos(protos: Collection<ProtoBuf.Property>): Collection<ProtoBuf.Property> =
|
||||||
return filteredMemberProtos(protos) {
|
filteredMemberProtos(protos)
|
||||||
it.getExtension(JvmProtoBuf.propertyImplClassName)?.let { packageData.nameResolver.getName(it) }
|
|
||||||
}
|
private fun <M : MessageLite> filteredMemberProtos(allMemberProtos: Collection<M>): Collection<M> {
|
||||||
}
|
fun getPackagePart(callable: MessageLite): Name? =
|
||||||
|
JvmFileClassUtil.getImplClassName(callable, packageData.nameResolver)
|
||||||
|
|
||||||
private fun <M : MessageLite> filteredMemberProtos(
|
|
||||||
allMemberProtos: Collection<M>,
|
|
||||||
getPackagePart: (M) -> Name?
|
|
||||||
): Collection<M> {
|
|
||||||
fun shouldSkipPackagePart(name: Name) =
|
fun shouldSkipPackagePart(name: Name) =
|
||||||
JvmClassName.byFqNameWithoutInnerClasses(fqName.child(name)).internalName in obsoletePackageParts
|
JvmClassName.byFqNameWithoutInnerClasses(fqName.child(name)).internalName in obsoletePackageParts
|
||||||
|
|
||||||
if (LOG.isDebugEnabled) {
|
if (LOG.isDebugEnabled) {
|
||||||
val allPackageParts = allMemberProtos
|
val allPackageParts = allMemberProtos
|
||||||
.map(getPackagePart)
|
.map(::getPackagePart)
|
||||||
.filterNotNull()
|
.filterNotNull()
|
||||||
.toSet()
|
.toSet()
|
||||||
val skippedPackageParts = allPackageParts.filter { shouldSkipPackagePart(it) }
|
val skippedPackageParts = allPackageParts.filter { shouldSkipPackagePart(it) }
|
||||||
|
|||||||
+1
@@ -79,6 +79,7 @@ class BuiltInsAnnotationAndConstantLoader(
|
|||||||
proto: ProtoBuf.Property,
|
proto: ProtoBuf.Property,
|
||||||
expectedType: JetType
|
expectedType: JetType
|
||||||
): ConstantValue<*>? {
|
): ConstantValue<*>? {
|
||||||
|
if (!proto.hasExtension(BuiltInsProtoBuf.compileTimeValue)) return null
|
||||||
val value = proto.getExtension(BuiltInsProtoBuf.compileTimeValue)
|
val value = proto.getExtension(BuiltInsProtoBuf.compileTimeValue)
|
||||||
return deserializer.resolveValue(expectedType, value, container.nameResolver)
|
return deserializer.resolveValue(expectedType, value, container.nameResolver)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -79,6 +79,7 @@ class KotlinJavascriptAnnotationAndConstantLoader(
|
|||||||
proto: ProtoBuf.Property,
|
proto: ProtoBuf.Property,
|
||||||
expectedType: JetType
|
expectedType: JetType
|
||||||
): ConstantValue<*>? {
|
): ConstantValue<*>? {
|
||||||
|
if (!proto.hasExtension(JsProtoBuf.compileTimeValue)) return null
|
||||||
val value = proto.getExtension(JsProtoBuf.compileTimeValue)
|
val value = proto.getExtension(JsProtoBuf.compileTimeValue)
|
||||||
return deserializer.resolveValue(expectedType, value, container.nameResolver)
|
return deserializer.resolveValue(expectedType, value, container.nameResolver)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user