Add getExtensionOrNull utility for protobuf messages
This commit is contained in:
@@ -19,12 +19,16 @@ package org.jetbrains.kotlin.incremental
|
||||
import com.intellij.util.io.DataExternalizer
|
||||
import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumerImpl
|
||||
import org.jetbrains.kotlin.incremental.js.TranslationResultValue
|
||||
import org.jetbrains.kotlin.incremental.storage.*
|
||||
import org.jetbrains.kotlin.incremental.storage.BasicStringMap
|
||||
import org.jetbrains.kotlin.incremental.storage.DirtyClassesFqNameMap
|
||||
import org.jetbrains.kotlin.incremental.storage.SourceToFqNameMap
|
||||
import org.jetbrains.kotlin.incremental.storage.StringToLongMapExternalizer
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl
|
||||
import org.jetbrains.kotlin.serialization.deserialization.getExtensionOrNull
|
||||
import org.jetbrains.kotlin.serialization.js.JsProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
|
||||
import java.io.DataInput
|
||||
@@ -177,11 +181,7 @@ fun getProtoData(sourceFile: File, metadata: ByteArray): Map<ClassId, ProtoData>
|
||||
}
|
||||
|
||||
proto.`package`.apply {
|
||||
val packageFqName = if (hasExtension(JsProtoBuf.packageFqName)) {
|
||||
nameResolver.getPackageFqName(getExtension(JsProtoBuf.packageFqName))
|
||||
}
|
||||
else FqName.ROOT
|
||||
|
||||
val packageFqName = getExtensionOrNull(JsProtoBuf.packageFqName)?.let(nameResolver::getPackageFqName) ?: FqName.ROOT
|
||||
val packagePartClassId = ClassId(packageFqName, Name.identifier(sourceFile.nameWithoutExtension.capitalize() + "Kt"))
|
||||
classes[packagePartClassId] = PackagePartProtoData(this, nameResolver, packageFqName)
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.serialization.Flags
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
||||
import org.jetbrains.kotlin.serialization.deserialization.TypeTable
|
||||
import org.jetbrains.kotlin.serialization.deserialization.getExtensionOrNull
|
||||
import org.jetbrains.kotlin.serialization.jvm.BitEncoding
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.JvmMethodSignature
|
||||
@@ -62,8 +63,8 @@ private fun inlineAccessorsJvmNames(properties: List<ProtoBuf.Property>, nameRes
|
||||
}
|
||||
val inlineAccessors = arrayListOf<JvmMethodSignature>()
|
||||
propertiesWithInlineAccessors.forEach { proto ->
|
||||
if (proto.hasExtension(JvmProtoBuf.propertySignature)) {
|
||||
val signature = proto.getExtension(JvmProtoBuf.propertySignature)
|
||||
val signature = proto.getExtensionOrNull(JvmProtoBuf.propertySignature)
|
||||
if (signature != null) {
|
||||
if (proto.hasGetterFlags() && Flags.IS_INLINE_ACCESSOR.get(proto.getterFlags)) {
|
||||
inlineAccessors.add(signature.getter)
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.getExtensionOrNull
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||
|
||||
fun getJvmModuleNameForDeserializedDescriptor(descriptor: DeclarationDescriptor): String? {
|
||||
@@ -20,8 +21,7 @@ fun getJvmModuleNameForDeserializedDescriptor(descriptor: DeclarationDescriptor)
|
||||
parent is DeserializedClassDescriptor -> {
|
||||
val classProto = parent.classProto
|
||||
val nameResolver = parent.c.nameResolver
|
||||
return classProto.getExtension(JvmProtoBuf.classModuleName)
|
||||
?.takeIf { classProto.hasExtension(JvmProtoBuf.classModuleName) }
|
||||
return classProto.getExtensionOrNull(JvmProtoBuf.classModuleName)
|
||||
?.let(nameResolver::getString)
|
||||
?: JvmAbi.DEFAULT_MODULE_NAME
|
||||
}
|
||||
@@ -30,8 +30,7 @@ fun getJvmModuleNameForDeserializedDescriptor(descriptor: DeclarationDescriptor)
|
||||
if (source is JvmPackagePartSource) {
|
||||
val packageProto = source.packageProto
|
||||
val nameResolver = source.nameResolver
|
||||
return packageProto.getExtension(JvmProtoBuf.packageModuleName)
|
||||
?.takeIf { packageProto.hasExtension(JvmProtoBuf.packageModuleName) }
|
||||
return packageProto.getExtensionOrNull(JvmProtoBuf.packageModuleName)
|
||||
?.let(nameResolver::getString)
|
||||
?: JvmAbi.DEFAULT_MODULE_NAME
|
||||
}
|
||||
|
||||
+3
-5
@@ -311,9 +311,7 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any,
|
||||
field: Boolean = false,
|
||||
synthetic: Boolean = false
|
||||
): MemberSignature? {
|
||||
val signature =
|
||||
if (proto.hasExtension(propertySignature)) proto.getExtension(propertySignature)
|
||||
else return null
|
||||
val signature = proto.getExtensionOrNull(propertySignature) ?: return null
|
||||
|
||||
if (field) {
|
||||
val (name, desc) = JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver, typeTable) ?: return null
|
||||
@@ -339,8 +337,8 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any,
|
||||
proto is ProtoBuf.Function -> {
|
||||
MemberSignature.fromMethodNameAndDesc(JvmProtoBufUtil.getJvmMethodSignature(proto, nameResolver, typeTable) ?: return null)
|
||||
}
|
||||
proto is ProtoBuf.Property && proto.hasExtension(propertySignature) -> {
|
||||
val signature = proto.getExtension(propertySignature)
|
||||
proto is ProtoBuf.Property -> {
|
||||
val signature = proto.getExtensionOrNull(propertySignature) ?: return null
|
||||
when (kind) {
|
||||
AnnotatedCallableKind.PROPERTY_GETTER -> MemberSignature.fromMethod(nameResolver, signature.getter)
|
||||
AnnotatedCallableKind.PROPERTY_SETTER -> MemberSignature.fromMethod(nameResolver, signature.setter)
|
||||
|
||||
@@ -63,8 +63,7 @@ object JvmProtoBufUtil {
|
||||
nameResolver: NameResolver,
|
||||
typeTable: TypeTable
|
||||
): String? {
|
||||
val signature =
|
||||
if (proto.hasExtension(JvmProtoBuf.methodSignature)) proto.getExtension(JvmProtoBuf.methodSignature) else null
|
||||
val signature = proto.getExtensionOrNull(JvmProtoBuf.methodSignature)
|
||||
val name = if (signature != null && signature.hasName()) signature.name else proto.name
|
||||
val desc = if (signature != null && signature.hasDesc()) {
|
||||
nameResolver.getString(signature.desc)
|
||||
@@ -85,8 +84,7 @@ object JvmProtoBufUtil {
|
||||
nameResolver: NameResolver,
|
||||
typeTable: TypeTable
|
||||
): String? {
|
||||
val signature =
|
||||
if (proto.hasExtension(JvmProtoBuf.constructorSignature)) proto.getExtension(JvmProtoBuf.constructorSignature) else null
|
||||
val signature = proto.getExtensionOrNull(JvmProtoBuf.constructorSignature)
|
||||
val desc = if (signature != null && signature.hasDesc()) {
|
||||
nameResolver.getString(signature.desc)
|
||||
}
|
||||
@@ -103,8 +101,7 @@ object JvmProtoBufUtil {
|
||||
nameResolver: NameResolver,
|
||||
typeTable: TypeTable
|
||||
): PropertySignature? {
|
||||
val signature =
|
||||
if (proto.hasExtension(JvmProtoBuf.propertySignature)) proto.getExtension(JvmProtoBuf.propertySignature) else return null
|
||||
val signature = proto.getExtensionOrNull(JvmProtoBuf.propertySignature) ?: return null
|
||||
val field =
|
||||
if (signature.hasField()) signature.field else null
|
||||
|
||||
|
||||
+1
-2
@@ -90,8 +90,7 @@ class AnnotationAndConstantLoaderImpl(
|
||||
proto: ProtoBuf.Property,
|
||||
expectedType: KotlinType
|
||||
): ConstantValue<*>? {
|
||||
if (!proto.hasExtension(protocol.compileTimeValue)) return null
|
||||
val value = proto.getExtension(protocol.compileTimeValue)
|
||||
val value = proto.getExtensionOrNull(protocol.compileTimeValue) ?: return null
|
||||
return deserializer.resolveValue(expectedType, value, container.nameResolver)
|
||||
}
|
||||
}
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
/*
|
||||
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.serialization.deserialization
|
||||
|
||||
import org.jetbrains.kotlin.protobuf.GeneratedMessageLite
|
||||
|
||||
fun <M : GeneratedMessageLite.ExtendableMessage<M>, T> GeneratedMessageLite.ExtendableMessage<M>.getExtensionOrNull(
|
||||
extension: GeneratedMessageLite.GeneratedExtension<M, T>
|
||||
): T? = if (hasExtension(extension)) getExtension(extension) else null
|
||||
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.serialization.deserialization.TypeTable
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.getExtensionOrNull
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
|
||||
import java.lang.reflect.Constructor
|
||||
@@ -120,10 +121,8 @@ internal sealed class JvmPropertySignature {
|
||||
val containingDeclaration = descriptor.containingDeclaration
|
||||
if (descriptor.visibility == Visibilities.INTERNAL && containingDeclaration is DeserializedClassDescriptor) {
|
||||
val classProto = containingDeclaration.classProto
|
||||
val moduleName =
|
||||
if (classProto.hasExtension(JvmProtoBuf.classModuleName))
|
||||
nameResolver.getString(classProto.getExtension(JvmProtoBuf.classModuleName))
|
||||
else JvmAbi.DEFAULT_MODULE_NAME
|
||||
val moduleName = classProto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let(nameResolver::getString)
|
||||
?: JvmAbi.DEFAULT_MODULE_NAME
|
||||
return "$" + NameUtils.sanitizeAsJavaIdentifier(moduleName)
|
||||
}
|
||||
if (descriptor.visibility == Visibilities.PRIVATE && containingDeclaration is PackageFragmentDescriptor) {
|
||||
@@ -210,14 +209,12 @@ internal object RuntimeTypeMapper {
|
||||
return when (property) {
|
||||
is DeserializedPropertyDescriptor -> {
|
||||
val proto = property.proto
|
||||
if (!proto.hasExtension(JvmProtoBuf.propertySignature)) {
|
||||
// If this property has no JVM signature, it must be from built-ins
|
||||
throw KotlinReflectionInternalError("Reflection on built-in Kotlin types is not yet fully supported. " +
|
||||
"No metadata found for $property")
|
||||
}
|
||||
JvmPropertySignature.KotlinProperty(
|
||||
property, proto, proto.getExtension(JvmProtoBuf.propertySignature), property.nameResolver, property.typeTable
|
||||
)
|
||||
val signature = proto.getExtensionOrNull(JvmProtoBuf.propertySignature)
|
||||
?: // If this property has no JVM signature, it must be from built-ins
|
||||
throw KotlinReflectionInternalError(
|
||||
"Reflection on built-in Kotlin types is not yet fully supported. No metadata found for $property"
|
||||
)
|
||||
JvmPropertySignature.KotlinProperty(property, proto, signature, property.nameResolver, property.typeTable)
|
||||
}
|
||||
is JavaPropertyDescriptor -> {
|
||||
val element = (property.source as? JavaSourceElement)?.javaElement
|
||||
|
||||
@@ -28,10 +28,7 @@ import org.jetbrains.kotlin.protobuf.MessageLite
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializationContext
|
||||
import org.jetbrains.kotlin.serialization.deserialization.MemberDeserializer
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
||||
import org.jetbrains.kotlin.serialization.deserialization.TypeTable
|
||||
import org.jetbrains.kotlin.serialization.deserialization.*
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.VersionRequirementTable
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
|
||||
@@ -139,9 +136,7 @@ internal val ReflectKotlinClass.packageModuleName: String?
|
||||
val (nameResolver, proto) = JvmProtoBufUtil.readPackageDataFrom(header.data!!, header.strings!!)
|
||||
// If no packageModuleName extension is written, the name is assumed to be JvmAbi.DEFAULT_MODULE_NAME
|
||||
// (see JvmSerializerExtension.serializePackage)
|
||||
if (proto.hasExtension(JvmProtoBuf.packageModuleName))
|
||||
nameResolver.getString(proto.getExtension(JvmProtoBuf.packageModuleName))
|
||||
else JvmAbi.DEFAULT_MODULE_NAME
|
||||
proto.getExtensionOrNull(JvmProtoBuf.packageModuleName)?.let(nameResolver::getString) ?: JvmAbi.DEFAULT_MODULE_NAME
|
||||
}
|
||||
KotlinClassHeader.Kind.MULTIFILE_CLASS -> {
|
||||
val partName = header.multifilePartNames.firstOrNull() ?: return null
|
||||
|
||||
+3
-2
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.getExtensionOrNull
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
|
||||
|
||||
@@ -164,8 +165,8 @@ private object ByJvmSignatureIndexer : DecompiledTextIndexer<ClassNameAndSignatu
|
||||
if (descriptor is DeserializedPropertyDescriptor) {
|
||||
val proto = descriptor.proto
|
||||
val className = (descriptor.containingDeclaration as? ClassDescriptor)?.relativeClassName().orEmpty()
|
||||
if (proto.hasExtension(JvmProtoBuf.propertySignature)) {
|
||||
val signature = proto.getExtension(JvmProtoBuf.propertySignature)
|
||||
val signature = proto.getExtensionOrNull(JvmProtoBuf.propertySignature)
|
||||
if (signature != null) {
|
||||
val fieldSignature = JvmProtoBufUtil.getJvmFieldSignature(proto, descriptor.nameResolver, descriptor.typeTable)
|
||||
if (fieldSignature != null) {
|
||||
save(className, MemberSignature.fromFieldNameAndDesc(fieldSignature.name, fieldSignature.desc))
|
||||
|
||||
+6
-9
@@ -18,19 +18,20 @@ package org.jetbrains.kotlin.jps.incremental
|
||||
|
||||
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
|
||||
import org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants
|
||||
import org.jetbrains.kotlin.cli.js.K2JSCompiler
|
||||
import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl
|
||||
import org.jetbrains.kotlin.config.Services
|
||||
import org.jetbrains.kotlin.incremental.ClassProtoData
|
||||
import org.jetbrains.kotlin.incremental.PackagePartProtoData
|
||||
import org.jetbrains.kotlin.incremental.ProtoData
|
||||
import org.jetbrains.kotlin.incremental.*
|
||||
import org.jetbrains.kotlin.incremental.utils.TestMessageCollector
|
||||
import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer
|
||||
import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumerImpl
|
||||
import org.jetbrains.kotlin.incremental.utils.TestMessageCollector
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl
|
||||
import org.jetbrains.kotlin.serialization.deserialization.getExtensionOrNull
|
||||
import org.jetbrains.kotlin.serialization.js.JsProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
|
||||
import org.junit.Assert
|
||||
@@ -89,13 +90,9 @@ fun getProtoData(sourceFile: File, metadata: ByteArray): Map<ClassId, ProtoData>
|
||||
}
|
||||
|
||||
proto.`package`.apply {
|
||||
val packageFqName = if (hasExtension(JsProtoBuf.packageFqName)) {
|
||||
nameResolver.getPackageFqName(getExtension(JsProtoBuf.packageFqName))
|
||||
}
|
||||
else FqName.ROOT
|
||||
|
||||
val packageFqName = getExtensionOrNull(JsProtoBuf.packageFqName)?.let(nameResolver::getPackageFqName) ?: FqName.ROOT
|
||||
val packagePartClassId = ClassId(packageFqName, Name.identifier(sourceFile.nameWithoutExtension.capitalize() + "Kt"))
|
||||
classes[packagePartClassId] = PackagePartProtoData(this, nameResolver, packageFqName)
|
||||
}
|
||||
return classes
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user