FIR Java refactoring: calculate JVM signatures directly by Java types
This commit is contained in:
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
|||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
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.FirTypeParameter
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
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.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
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.declarations.FirJavaValueParameter
|
||||||
import org.jetbrains.kotlin.fir.java.enhancement.readOnlyToMutable
|
import org.jetbrains.kotlin.fir.java.enhancement.readOnlyToMutable
|
||||||
import org.jetbrains.kotlin.fir.java.types.FirJavaTypeRef
|
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.FirErrorNamedReferenceImpl
|
||||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedCallableReferenceImpl
|
import org.jetbrains.kotlin.fir.references.impl.FirResolvedCallableReferenceImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.constructClassType
|
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("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-48
@@ -13,9 +13,9 @@ import org.jetbrains.kotlin.fir.declarations.impl.*
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirConstExpressionImpl
|
import org.jetbrains.kotlin.fir.expressions.impl.FirConstExpressionImpl
|
||||||
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
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.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.java.enhancement.*
|
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.java.types.FirJavaTypeRef
|
||||||
import org.jetbrains.kotlin.fir.render
|
import org.jetbrains.kotlin.fir.render
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
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.AnnotationTypeQualifierResolver
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.NullDefaultValue
|
import org.jetbrains.kotlin.load.java.descriptors.NullDefaultValue
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.StringDefaultValue
|
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.PREDEFINED_FUNCTION_ENHANCEMENT_INFO_BY_SIGNATURE
|
||||||
import org.jetbrains.kotlin.load.java.typeEnhancement.PredefinedFunctionEnhancementInfo
|
import org.jetbrains.kotlin.load.java.typeEnhancement.PredefinedFunctionEnhancementInfo
|
||||||
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
|
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
|
||||||
@@ -234,52 +233,6 @@ class JavaClassEnhancementScope(
|
|||||||
return function.symbol
|
return function.symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirFunction<*>.computeJvmDescriptor(): String = buildString {
|
|
||||||
if (this@computeJvmDescriptor is FirJavaMethod) {
|
|
||||||
append(name.asString())
|
|
||||||
} else {
|
|
||||||
append("<init>")
|
|
||||||
}
|
|
||||||
|
|
||||||
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(
|
private fun enhanceReceiverType(
|
||||||
|
|||||||
Reference in New Issue
Block a user