From 2476c0299f5ed5279bcfc9eb7f0172461dc0e42f Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 16 Apr 2019 16:26:07 +0300 Subject: [PATCH] FIR Java: fix constructor enhancements Before this commit, we generated regular member functions as constructor enhancement. Now, we generate constructors as constructor enhancement. --- .../java/scopes/JavaClassEnhancementScope.kt | 43 ++++++++++------- .../declarations/impl/FirConstructorImpl.kt | 47 ++++++++++++------- .../loadJava/compiledJava/MyException.fir.txt | 2 +- .../PackageLocalVisibility.fir.txt | 2 +- .../compiledJava/PrivateMembers.fir.txt | 2 +- .../loadJava/compiledJava/Simple.fir.txt | 2 +- .../annotations/AnnotatedConstructor.fir.txt | 2 +- .../EnumConstructorParameter.fir.txt | 4 +- .../ConstructorGenericDeep.fir.txt | 2 +- .../ConstructorGenericSimple.fir.txt | 2 +- .../ConstructorGenericUpperBound.fir.txt | 2 +- .../compiledJava/enum/EnumMembers.fir.txt | 2 +- .../ConstructorWithNewTypeParams.fir.txt | 2 +- .../ConstructorWithParentTypeParams.fir.txt | 2 +- .../ConstructorWithSeveralParams.fir.txt | 2 +- .../ConstructorWithoutParams.fir.txt | 2 +- .../sam/adapters/Constructor.fir.txt | 2 +- .../ConstructorWithAnnotations.fir.txt | 2 +- 18 files changed, 75 insertions(+), 49 deletions(-) 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 418712f4c3b..ccc6c366f03 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 @@ -170,25 +170,36 @@ class JavaClassEnhancementScope( } val symbol = if (!isAccessor) FirFunctionSymbol(methodId) else FirAccessorSymbol(callableId = propertyId!!, accessorId = methodId) - FirMemberFunctionImpl( - this@JavaClassEnhancementScope.session, null, symbol, name, - newReceiverTypeRef, newReturnTypeRef - ).apply { - status = firMethod.status as FirDeclarationStatusImpl - annotations += firMethod.annotations - valueParameters += firMethod.valueParameters.zip(newValueParameterInfo) { valueParameter, newInfo -> - val (newTypeRef, newDefaultValue) = newInfo - with(valueParameter) { - FirValueParameterImpl( - this@JavaClassEnhancementScope.session, psi, - this.name, newTypeRef, - defaultValue ?: newDefaultValue, isCrossinline, isNoinline, isVararg - ).apply { - annotations += valueParameter.annotations - } + val newValueParameters = firMethod.valueParameters.zip(newValueParameterInfo) { valueParameter, newInfo -> + val (newTypeRef, newDefaultValue) = newInfo + with(valueParameter) { + FirValueParameterImpl( + this@JavaClassEnhancementScope.session, psi, + this.name, newTypeRef, + defaultValue ?: newDefaultValue, isCrossinline, isNoinline, isVararg + ).apply { + annotations += valueParameter.annotations } } } + val function = when (firMethod) { + is FirJavaConstructor -> FirConstructorImpl( + this@JavaClassEnhancementScope.session, null, symbol as FirFunctionSymbol, + newReceiverTypeRef, newReturnTypeRef + ).apply { + this.valueParameters += newValueParameters + } + else -> FirMemberFunctionImpl( + this@JavaClassEnhancementScope.session, null, symbol, name, + newReceiverTypeRef, newReturnTypeRef + ).apply { + this.valueParameters += newValueParameters + } + } + function.apply { + status = firMethod.status as FirDeclarationStatusImpl + annotations += firMethod.annotations + } return symbol } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt index cbbb3312ad5..c726ffed23c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt @@ -10,12 +10,10 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall -import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformSingle @@ -23,21 +21,38 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.name.Name -open class FirConstructorImpl( - session: FirSession, - psi: PsiElement?, - override val symbol: FirFunctionSymbol, - visibility: Visibility, - isExpect: Boolean, - isActual: Boolean, - delegatedSelfTypeRef: FirTypeRef, - final override var delegatedConstructor: FirDelegatedConstructorCall? -) : FirAbstractCallableMember( - session, psi, NAME, visibility, Modality.FINAL, - isExpect, isActual, isOverride = false, receiverTypeRef = null, returnTypeRef = delegatedSelfTypeRef -), FirConstructor { +open class FirConstructorImpl : FirAbstractCallableMember, FirConstructor { - init { + override val symbol: FirFunctionSymbol + + final override var delegatedConstructor: FirDelegatedConstructorCall? = null + + constructor( + session: FirSession, + psi: PsiElement?, + symbol: FirFunctionSymbol, + visibility: Visibility, + isExpect: Boolean, + isActual: Boolean, + delegatedSelfTypeRef: FirTypeRef, + delegatedConstructor: FirDelegatedConstructorCall? + ) : super( + session, psi, NAME, visibility, Modality.FINAL, + isExpect, isActual, isOverride = false, receiverTypeRef = null, returnTypeRef = delegatedSelfTypeRef + ) { + this.symbol = symbol + this.delegatedConstructor = delegatedConstructor + symbol.bind(this) + } + + constructor( + session: FirSession, + psi: PsiElement?, + symbol: FirFunctionSymbol, + receiverTypeRef: FirTypeRef?, + returnTypeRef: FirTypeRef + ) : super(session, psi, NAME, receiverTypeRef, returnTypeRef) { + this.symbol = symbol symbol.bind(this) } diff --git a/compiler/testData/loadJava/compiledJava/MyException.fir.txt b/compiler/testData/loadJava/compiledJava/MyException.fir.txt index 8058776e41c..967288c0825 100644 --- a/compiler/testData/loadJava/compiledJava/MyException.fir.txt +++ b/compiler/testData/loadJava/compiledJava/MyException.fir.txt @@ -1,4 +1,4 @@ public open class MyException : R|java/lang/Object| { - public final fun MyException(message: R|ft|!, cause: R|ft|!): R|test/MyException| + public constructor(message: R|ft|!, cause: R|ft|!): R|test/MyException| } diff --git a/compiler/testData/loadJava/compiledJava/PackageLocalVisibility.fir.txt b/compiler/testData/loadJava/compiledJava/PackageLocalVisibility.fir.txt index d1fecd75217..753d2463a75 100644 --- a/compiler/testData/loadJava/compiledJava/PackageLocalVisibility.fir.txt +++ b/compiler/testData/loadJava/compiledJava/PackageLocalVisibility.fir.txt @@ -13,6 +13,6 @@ public open class JFrame : R|awt/Frame| { public/*package*/ get(): R|ft|! public/*package*/ set(value: R|ft|!): kotlin/Unit - public final fun JFrame(): R|test/JFrame| + public constructor(): R|test/JFrame| } diff --git a/compiler/testData/loadJava/compiledJava/PrivateMembers.fir.txt b/compiler/testData/loadJava/compiledJava/PrivateMembers.fir.txt index 2719bf13eed..466e01078ae 100644 --- a/compiler/testData/loadJava/compiledJava/PrivateMembers.fir.txt +++ b/compiler/testData/loadJava/compiledJava/PrivateMembers.fir.txt @@ -11,6 +11,6 @@ public open class PrivateMembers : R|java/lang/Object| { private open static operator fun staticMethod(): R|kotlin/Unit| - private final fun PrivateMembers(): R|test/PrivateMembers| + private constructor(): R|test/PrivateMembers| } diff --git a/compiler/testData/loadJava/compiledJava/Simple.fir.txt b/compiler/testData/loadJava/compiledJava/Simple.fir.txt index b289a07f658..197f1dfe676 100644 --- a/compiler/testData/loadJava/compiledJava/Simple.fir.txt +++ b/compiler/testData/loadJava/compiledJava/Simple.fir.txt @@ -1,4 +1,4 @@ public final class Simple : R|java/lang/Object| { - public final fun Simple(): R|test/Simple| + public constructor(): R|test/Simple| } diff --git a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedConstructor.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedConstructor.fir.txt index 06424b6536a..f5defcf9eb9 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedConstructor.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedConstructor.fir.txt @@ -1,4 +1,4 @@ public open class AnnotatedConstructor : R|java/lang/Object| { - @R|test/AnnotatedConstructor.Anno|(String(constructor)) public final fun AnnotatedConstructor(): R|test/AnnotatedConstructor| + @R|test/AnnotatedConstructor.Anno|(String(constructor)) public constructor(): R|test/AnnotatedConstructor| } diff --git a/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt index a59a52a745b..856212e7c3f 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt @@ -2,8 +2,8 @@ public final enum class EnumConstructorParameter : R|java/lang/Enum|! public get(): R|ft|! - private final fun EnumConstructorParameter(@R|test/EnumConstructorParameter.Anno|(String(string)) s: R|ft|!): R|test/EnumConstructorParameter| + private constructor(@R|test/EnumConstructorParameter.Anno|(String(string)) s: R|ft|!): R|test/EnumConstructorParameter| - private final fun EnumConstructorParameter(x: R|kotlin/Int|): R|test/EnumConstructorParameter| + private constructor(x: R|kotlin/Int|): R|test/EnumConstructorParameter| } diff --git a/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericDeep.fir.txt b/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericDeep.fir.txt index 0f9f5c57d4c..0741cf529e6 100644 --- a/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericDeep.fir.txt +++ b/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericDeep.fir.txt @@ -1,4 +1,4 @@ public open class ConstructorGenericDeep : R|java/lang/Object| { - public final fun ConstructorGenericDeep(cl: R|ft>, java/lang/Class>?>|!): R|test/ConstructorGenericDeep| + public constructor(cl: R|ft>, java/lang/Class>?>|!): R|test/ConstructorGenericDeep| } diff --git a/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericSimple.fir.txt b/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericSimple.fir.txt index e65781f9d8a..663cfdb6f06 100644 --- a/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericSimple.fir.txt +++ b/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericSimple.fir.txt @@ -1,4 +1,4 @@ public open class ConstructorGenericSimple : R|java/lang/Object| { - public final fun ConstructorGenericSimple(p: R|ft|!): R|test/ConstructorGenericSimple| + public constructor(p: R|ft|!): R|test/ConstructorGenericSimple| } diff --git a/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericUpperBound.fir.txt b/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericUpperBound.fir.txt index b4beab6c732..8279d55d6ee 100644 --- a/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericUpperBound.fir.txt +++ b/compiler/testData/loadJava/compiledJava/constructor/ConstructorGenericUpperBound.fir.txt @@ -1,4 +1,4 @@ public open class ConstructorGenericUpperBound : R|java/lang/Object| { - public final fun ConstructorGenericUpperBound(p: R|ft|!): R|test/ConstructorGenericUpperBound| + public constructor(p: R|ft|!): R|test/ConstructorGenericUpperBound| } diff --git a/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt b/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt index d7f69e15fe1..274af85e378 100644 --- a/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt +++ b/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt @@ -10,6 +10,6 @@ public final enum class EnumMembers : R|java/lang/Enum| { public open operator fun first(): R|kotlin/Boolean| - private final fun EnumMembers(isFirst: R|kotlin/Boolean|): R|test/EnumMembers| + private constructor(isFirst: R|kotlin/Boolean|): R|test/EnumMembers| } diff --git a/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithNewTypeParams.fir.txt b/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithNewTypeParams.fir.txt index 0028d1b5a7f..195cdd0393e 100644 --- a/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithNewTypeParams.fir.txt +++ b/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithNewTypeParams.fir.txt @@ -1,4 +1,4 @@ public open class ConstructorWithNewTypeParams : R|java/lang/Object| { - public final fun ConstructorWithNewTypeParams(first: R|ft|!): R|test/ConstructorWithNewTypeParams| + public constructor(first: R|ft|!): R|test/ConstructorWithNewTypeParams| } diff --git a/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithParentTypeParams.fir.txt b/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithParentTypeParams.fir.txt index 1fbb631fbc7..80045cfc712 100644 --- a/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithParentTypeParams.fir.txt +++ b/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithParentTypeParams.fir.txt @@ -1,4 +1,4 @@ public open class ConstructorWithParentTypeParams : R|java/lang/Object| { - public final fun ConstructorWithParentTypeParams(first: R|ft|!): R|test/ConstructorWithParentTypeParams| + public constructor(first: R|ft|!): R|test/ConstructorWithParentTypeParams| } diff --git a/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithSeveralParams.fir.txt b/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithSeveralParams.fir.txt index 003df708068..f15439c9874 100644 --- a/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithSeveralParams.fir.txt +++ b/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithSeveralParams.fir.txt @@ -1,4 +1,4 @@ public open class ConstructorWithSeveralParams : R|java/lang/Object| { - public final fun ConstructorWithSeveralParams(integer: R|ft|!, intBasic: R|kotlin/Int|, collection: R|ft>, java/util/ArrayList>?>|!): R|test/ConstructorWithSeveralParams| + public constructor(integer: R|ft|!, intBasic: R|kotlin/Int|, collection: R|ft>, java/util/ArrayList>?>|!): R|test/ConstructorWithSeveralParams| } diff --git a/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithoutParams.fir.txt b/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithoutParams.fir.txt index 08491c09a2a..bdb807b2c47 100644 --- a/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithoutParams.fir.txt +++ b/compiler/testData/loadJava/compiledJava/kotlinSignature/ConstructorWithoutParams.fir.txt @@ -1,4 +1,4 @@ public open class ConstructorWithoutParams : R|java/lang/Object| { - public final fun ConstructorWithoutParams(): R|test/ConstructorWithoutParams| + public constructor(): R|test/ConstructorWithoutParams| } diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/Constructor.fir.txt b/compiler/testData/loadJava/compiledJava/sam/adapters/Constructor.fir.txt index be9914f37d4..12a7dd52c53 100644 --- a/compiler/testData/loadJava/compiledJava/sam/adapters/Constructor.fir.txt +++ b/compiler/testData/loadJava/compiledJava/sam/adapters/Constructor.fir.txt @@ -1,4 +1,4 @@ public open class Constructor : R|java/lang/Object| { - public final fun Constructor(r: R|ft|!): R|test/Constructor| + public constructor(r: R|ft|!): R|test/Constructor| } diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.fir.txt b/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.fir.txt index 7f4d384fc7a..91eac2c2466 100644 --- a/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.fir.txt +++ b/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.fir.txt @@ -1,4 +1,4 @@ public open class ConstructorWithAnnotations : R|java/lang/Object| { - public final fun ConstructorWithAnnotations(r: R|ft|!, @R|org/jetbrains/annotations/NotNull|() s: R|kotlin/String|): R|test/ConstructorWithAnnotations| + public constructor(r: R|ft|!, @R|org/jetbrains/annotations/NotNull|() s: R|kotlin/String|): R|test/ConstructorWithAnnotations| }