From dc657dfda5d1706aeb931596eb709da28764c0e9 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 22 Oct 2019 15:26:22 +0300 Subject: [PATCH] FIR Java refactoring: calculate JVM signatures directly by Java types --- .../jetbrains/kotlin/fir/java/JavaUtils.kt | 68 ++++++++++++++++++- .../java/scopes/JavaClassEnhancementScope.kt | 49 +------------ 2 files changed, 68 insertions(+), 49 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt index fad5cfcc8e5..1433ce12d67 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall @@ -16,10 +17,10 @@ import org.jetbrains.kotlin.fir.expressions.FirArrayOfCall import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement +import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod import org.jetbrains.kotlin.fir.java.declarations.FirJavaValueParameter import org.jetbrains.kotlin.fir.java.enhancement.readOnlyToMutable import org.jetbrains.kotlin.fir.java.types.FirJavaTypeRef -import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.impl.FirResolvedCallableReferenceImpl import org.jetbrains.kotlin.fir.resolve.constructClassType @@ -315,4 +316,69 @@ private fun JavaType.toFirResolvedTypeRef( ) } +internal fun FirFunction<*>.computeJvmDescriptor(): String = buildString { + if (this@computeJvmDescriptor is FirJavaMethod) { + append(name.asString()) + } else { + append("") + } + + append("(") + for (parameter in valueParameters) { + appendErasedType(parameter.returnTypeRef) + } + append(")") + + if (this@computeJvmDescriptor !is FirJavaMethod || (returnTypeRef as FirJavaTypeRef).isVoid()) { + append("V") + } else { + appendErasedType(returnTypeRef) + } +} + +// TODO: primitive types, arrays, etc. +private fun StringBuilder.appendErasedType(typeRef: FirTypeRef) { + when (typeRef) { + is FirResolvedTypeRef -> appendConeType(typeRef.type) + is FirJavaTypeRef -> { + when (val javaType = typeRef.type) { + is JavaClassifierType -> { + when (val classifier = javaType.classifier) { + is JavaClass -> classifier.fqName?.let { + append("L") + append(it.asString().replace(".", "/")) + } + is JavaTypeParameter -> { + append("L") + append(classifier.name) + } + else -> return + } + append(";") + } + } + } + } +} + +private fun StringBuilder.appendConeType(coneType: ConeKotlinType) { + if (coneType is ConeClassErrorType) return + append("L") + when (coneType) { + is ConeClassLikeType -> { + val classId = coneType.lookupTag.classId + append(classId.packageFqName.asString().replace(".", "/")) + append("/") + append(classId.relativeClassName) + } + is ConeTypeParameterType -> append(coneType.lookupTag.name) + } + append(";") +} + +private fun FirJavaTypeRef.isVoid(): Boolean { + return type is JavaPrimitiveType && type.type == null +} + + diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt index f4880fa023f..b52f978ce06 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt @@ -13,9 +13,9 @@ import org.jetbrains.kotlin.fir.declarations.impl.* import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.impl.FirConstExpressionImpl import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack +import org.jetbrains.kotlin.fir.java.computeJvmDescriptor import org.jetbrains.kotlin.fir.java.declarations.* import org.jetbrains.kotlin.fir.java.enhancement.* -import org.jetbrains.kotlin.fir.java.toNotNullConeKotlinType import org.jetbrains.kotlin.fir.java.types.FirJavaTypeRef import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.scopes.FirScope @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver import org.jetbrains.kotlin.load.java.descriptors.NullDefaultValue import org.jetbrains.kotlin.load.java.descriptors.StringDefaultValue -import org.jetbrains.kotlin.load.java.structure.JavaPrimitiveType import org.jetbrains.kotlin.load.java.typeEnhancement.PREDEFINED_FUNCTION_ENHANCEMENT_INFO_BY_SIGNATURE import org.jetbrains.kotlin.load.java.typeEnhancement.PredefinedFunctionEnhancementInfo import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents @@ -234,52 +233,6 @@ class JavaClassEnhancementScope( return function.symbol } - private fun FirFunction<*>.computeJvmDescriptor(): String = buildString { - if (this@computeJvmDescriptor is FirJavaMethod) { - append(name.asString()) - } else { - append("") - } - - append("(") - for (parameter in valueParameters) { - appendErasedType(parameter.returnTypeRef) - } - append(")") - - if (this@computeJvmDescriptor !is FirJavaMethod || (returnTypeRef as FirJavaTypeRef).isVoid()) { - append("V") - } else { - appendErasedType(returnTypeRef) - } - } - - private fun StringBuilder.appendErasedType(typeRef: FirTypeRef) { - when (typeRef) { - is FirResolvedTypeRef -> appendConeType(typeRef.type) - is FirJavaTypeRef -> appendConeType(typeRef.toNotNullConeKotlinType(session, javaTypeParameterStack)) - } - } - - private fun StringBuilder.appendConeType(coneType: ConeKotlinType) { - if (coneType is ConeClassErrorType) return - append("L") - when (coneType) { - is ConeClassLikeType -> { - val classId = coneType.lookupTag.classId - append(classId.packageFqName.asString().replace(".", "/")) - append("/") - append(classId.relativeClassName) - } - is ConeTypeParameterType -> append(coneType.lookupTag.name) - } - append(";") - } - - private fun FirJavaTypeRef.isVoid(): Boolean { - return type is JavaPrimitiveType && type.type == null - } - // ================================================================================================ private fun enhanceReceiverType(