diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 60113e053cb..1b4301c4b7f 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -178,7 +178,6 @@ class JavaSymbolProvider( javaTypeParameterStack.addStack(parentStack) } } - val methodMap = mutableMapOf() val firJavaClass = buildJavaClass { source = (javaClass as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement() session = this@JavaSymbolProvider.session @@ -201,7 +200,7 @@ class JavaSymbolProvider( } } - val dispatchReceiver = classId.defaultType(typeParameters.map { it.symbol } ) + val dispatchReceiver = classId.defaultType(typeParameters.map { it.symbol }) status = FirResolvedDeclarationStatusImpl( javaClass.visibility, @@ -230,9 +229,7 @@ class JavaSymbolProvider( classIsAnnotation, valueParametersForAnnotationConstructor, dispatchReceiver - ).apply { - methodMap[javaMethod] = this - } + ) } val javaClassDeclaredConstructors = javaClass.constructors val constructorId = CallableId(classId.packageFqName, classId.relativeClassName, classId.shortClassName) @@ -283,10 +280,6 @@ class JavaSymbolProvider( } ) firJavaClass.addAnnotationsFrom(this@JavaSymbolProvider.session, javaClass, javaTypeParameterStack) - // NB: this is done here to unbind possible annotation cycle - for ((javaMethod, firJavaMethod) in methodMap) { - firJavaMethod.annotations.addAnnotationsFrom(session, javaMethod, javaTypeParameterStack) - } return firJavaClass } @@ -340,7 +333,7 @@ class JavaSymbolProvider( returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack) isVar = !javaField.isFinal isStatic = javaField.isStatic - annotationBuilder = { javaField.annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) }} + annotationBuilder = { javaField.annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) } } initializer = convertJavaInitializerToFir(javaField.initializerValue) if (!javaField.isStatic) { @@ -386,6 +379,7 @@ class JavaSymbolProvider( this@JavaSymbolProvider.session, index, javaTypeParameterStack, ) } + annotationBuilder = { javaMethod.annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) } } status = FirResolvedDeclarationStatusImpl( javaMethod.visibility, javaMethod.modality diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt index bd8ec9a79aa..8c9b6390f51 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt @@ -10,17 +10,24 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.contracts.FirContractDescription import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder -import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl +import org.jetbrains.kotlin.fir.declarations.builder.FirFunctionBuilder +import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParametersOwnerBuilder import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirBlock +import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.FirVisitor +import org.jetbrains.kotlin.fir.visitors.transformInplace +import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.util.OperatorNameConventions.ASSIGNMENT_OPERATIONS @@ -40,51 +47,153 @@ import kotlin.properties.Delegates @OptIn(FirImplementationDetail::class) class FirJavaMethod @FirImplementationDetail constructor( - source: FirSourceElement?, - session: FirSession, - resolvePhase: FirResolvePhase, - attributes: FirDeclarationAttributes, - returnTypeRef: FirTypeRef, - receiverTypeRef: FirTypeRef?, - typeParameters: MutableList, - valueParameters: MutableList, - body: FirBlock?, - name: Name, - status: FirDeclarationStatus, - containerSource: DeserializedContainerSource?, - symbol: FirNamedFunctionSymbol, - annotations: MutableList, - dispatchReceiverType: ConeKotlinType?, -) : FirSimpleFunctionImpl( - source, - session, - resolvePhase, - FirDeclarationOrigin.Java, - attributes, - returnTypeRef, - receiverTypeRef, - valueParameters, - body, - status, - containerSource, - dispatchReceiverType = dispatchReceiverType, - contractDescription = FirEmptyContractDescription, - name, - symbol, - annotations, - typeParameters, -) + override val source: FirSourceElement?, + override val session: FirSession, + override var resolvePhase: FirResolvePhase, + override val attributes: FirDeclarationAttributes, + override var returnTypeRef: FirTypeRef, + override val typeParameters: MutableList, + override val valueParameters: MutableList, + override val name: Name, + override var status: FirDeclarationStatus, + override val symbol: FirNamedFunctionSymbol, + annotationBuilder: () -> List, + override val dispatchReceiverType: ConeKotlinType?, +) : FirSimpleFunction() { + init { + symbol.bind(this) + } + + override val receiverTypeRef: FirTypeRef? + get() = null + + override val body: FirBlock? + get() = null + + override val containerSource: DeserializedContainerSource? + get() = null + + override val origin: FirDeclarationOrigin + get() = FirDeclarationOrigin.Java + + override val contractDescription: FirContractDescription + get() = FirEmptyContractDescription + + override var controlFlowGraphReference: FirControlFlowGraphReference? = null + + override val annotations: List by lazy { annotationBuilder() } + + override fun acceptChildren(visitor: FirVisitor, data: D) { + returnTypeRef.accept(visitor, data) + receiverTypeRef?.accept(visitor, data) + controlFlowGraphReference?.accept(visitor, data) + valueParameters.forEach { it.accept(visitor, data) } + body?.accept(visitor, data) + status.accept(visitor, data) + contractDescription.accept(visitor, data) + annotations.forEach { it.accept(visitor, data) } + typeParameters.forEach { it.accept(visitor, data) } + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirSimpleFunction { + transformReturnTypeRef(transformer, data) + transformReceiverTypeRef(transformer, data) + controlFlowGraphReference = controlFlowGraphReference?.transformSingle(transformer, data) + transformValueParameters(transformer, data) + transformBody(transformer, data) + transformStatus(transformer, data) + transformContractDescription(transformer, data) + transformAnnotations(transformer, data) + transformTypeParameters(transformer, data) + return this + } + + override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirSimpleFunction { + returnTypeRef = returnTypeRef.transformSingle(transformer, data) + return this + } + + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirSimpleFunction { + return this + } + + override fun transformValueParameters(transformer: FirTransformer, data: D): FirSimpleFunction { + valueParameters.transformInplace(transformer, data) + return this + } + + override fun transformBody(transformer: FirTransformer, data: D): FirSimpleFunction { + return this + } + + override fun transformStatus(transformer: FirTransformer, data: D): FirSimpleFunction { + status = status.transformSingle(transformer, data) + return this + } + + override fun transformContractDescription(transformer: FirTransformer, data: D): FirSimpleFunction { + return this + } + + override fun transformAnnotations(transformer: FirTransformer, data: D): FirSimpleFunction { + return this + } + + override fun transformTypeParameters(transformer: FirTransformer, data: D): FirSimpleFunction { + typeParameters.transformInplace(transformer, data) + return this + } + + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { + resolvePhase = newResolvePhase + } + + override fun replaceReturnTypeRef(newReturnTypeRef: FirTypeRef) { + returnTypeRef = newReturnTypeRef + } + + override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) { + } + + override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { + controlFlowGraphReference = newControlFlowGraphReference + } + + override fun replaceValueParameters(newValueParameters: List) { + valueParameters.clear() + valueParameters.addAll(newValueParameters) + } + + override fun replaceBody(newBody: FirBlock?) { + } + + override fun replaceContractDescription(newContractDescription: FirContractDescription) { + } +} val ALL_JAVA_OPERATION_NAMES = UNARY_OPERATION_NAMES + BINARY_OPERATION_NAMES + ASSIGNMENT_OPERATIONS + DELEGATED_PROPERTY_OPERATORS + EQUALS + COMPARE_TO + CONTAINS + INVOKE + ITERATOR + GET + SET + NEXT + HAS_NEXT @FirBuilderDsl -class FirJavaMethodBuilder : FirSimpleFunctionBuilder() { +class FirJavaMethodBuilder : FirFunctionBuilder, FirTypeParametersOwnerBuilder, FirAnnotationContainerBuilder { + override var source: FirSourceElement? = null + override lateinit var session: FirSession + override var attributes: FirDeclarationAttributes = FirDeclarationAttributes() + override lateinit var returnTypeRef: FirTypeRef + override val valueParameters: MutableList = mutableListOf() + override var body: FirBlock? = null + lateinit var status: FirDeclarationStatus + var dispatchReceiverType: ConeKotlinType? = null + lateinit var name: Name + lateinit var symbol: FirNamedFunctionSymbol + override val annotations: MutableList = mutableListOf() + override val typeParameters: MutableList = mutableListOf() lateinit var visibility: Visibility var modality: Modality? = null var isStatic: Boolean by Delegates.notNull() - override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES + var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES + lateinit var annotationBuilder: () -> List @Deprecated("Modification of 'origin' has no impact for FirJavaFunctionBuilder", level = DeprecationLevel.HIDDEN) override var origin: FirDeclarationOrigin @@ -101,15 +210,12 @@ class FirJavaMethodBuilder : FirSimpleFunctionBuilder() { resolvePhase, attributes, returnTypeRef as FirJavaTypeRef, - receiverTypeRef = null, typeParameters, valueParameters, - body, name, status, - containerSource, symbol, - annotations, + annotationBuilder, dispatchReceiverType, ) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirSimpleFunctionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirSimpleFunctionBuilder.kt index dfdded038c9..6ecc87329da 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirSimpleFunctionBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirSimpleFunctionBuilder.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.fir.declarations.builder import kotlin.contracts.* -import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder @@ -58,7 +57,6 @@ open class FirSimpleFunctionBuilder : FirFunctionBuilder, FirTypeParametersOwner override val annotations: MutableList = mutableListOf() override val typeParameters: MutableList = mutableListOf() - @OptIn(FirImplementationDetail::class) override fun build(): FirSimpleFunction { return FirSimpleFunctionImpl( source, diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt index 849c0cc26b8..ed3d74f67d4 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.declarations.impl -import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.contracts.FirContractDescription @@ -31,7 +30,7 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -open class FirSimpleFunctionImpl @FirImplementationDetail constructor( +internal class FirSimpleFunctionImpl( override val source: FirSourceElement?, override val session: FirSession, override var resolvePhase: FirResolvePhase, diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 12becc42cf6..11dfd0a1501 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -449,9 +449,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() default("name", "Name.identifier(\"value\")") } - impl(simpleFunction) { - kind = OpenClass - } + impl(simpleFunction) impl(safeCallExpression) { useTypes(safeCallCheckedSubjectType)