FIR Java: fix constructor enhancements

Before this commit,
we generated regular member functions as constructor enhancement.
Now, we generate constructors as constructor enhancement.
This commit is contained in:
Mikhail Glukhikh
2019-04-16 16:26:07 +03:00
parent 2e966a7ded
commit 2476c0299f
18 changed files with 75 additions and 49 deletions
@@ -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
}
@@ -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)
}
@@ -1,4 +1,4 @@
public open class MyException : R|java/lang/Object| {
public final fun MyException(message: R|ft<kotlin/String, kotlin/String?>|!, cause: R|ft<kotlin/Throwable, kotlin/Throwable?>|!): R|test/MyException|
public constructor(message: R|ft<kotlin/String, kotlin/String?>|!, cause: R|ft<kotlin/Throwable, kotlin/Throwable?>|!): R|test/MyException|
}
@@ -13,6 +13,6 @@ public open class JFrame : R|awt/Frame| {
public/*package*/ get(): R|ft<kotlin/String, kotlin/String?>|!
public/*package*/ set(value: R|ft<kotlin/String, kotlin/String?>|!): kotlin/Unit
public final fun JFrame(): R|test/JFrame|
public constructor(): R|test/JFrame|
}
@@ -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|
}
+1 -1
View File
@@ -1,4 +1,4 @@
public final class Simple : R|java/lang/Object| {
public final fun Simple(): R|test/Simple|
public constructor(): R|test/Simple|
}
@@ -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|
}
@@ -2,8 +2,8 @@ public final enum class EnumConstructorParameter : R|java/lang/Enum<test/EnumCon
public final static val INSTANCE: R|ft<test/EnumConstructorParameter, test/EnumConstructorParameter?>|!
public get(): R|ft<test/EnumConstructorParameter, test/EnumConstructorParameter?>|!
private final fun EnumConstructorParameter(@R|test/EnumConstructorParameter.Anno|(String(string)) s: R|ft<kotlin/String, kotlin/String?>|!): R|test/EnumConstructorParameter|
private constructor(@R|test/EnumConstructorParameter.Anno|(String(string)) s: R|ft<kotlin/String, kotlin/String?>|!): R|test/EnumConstructorParameter|
private final fun EnumConstructorParameter(x: R|kotlin/Int|): R|test/EnumConstructorParameter|
private constructor(x: R|kotlin/Int|): R|test/EnumConstructorParameter|
}
@@ -1,4 +1,4 @@
public open class ConstructorGenericDeep : R|java/lang/Object| {
public final fun ConstructorGenericDeep(cl: R|ft<java/lang/Class<ft<P, P?>>, java/lang/Class<ft<P, P?>>?>|!): R|test/ConstructorGenericDeep|
public constructor(cl: R|ft<java/lang/Class<ft<P, P?>>, java/lang/Class<ft<P, P?>>?>|!): R|test/ConstructorGenericDeep|
}
@@ -1,4 +1,4 @@
public open class ConstructorGenericSimple : R|java/lang/Object| {
public final fun ConstructorGenericSimple(p: R|ft<P, P?>|!): R|test/ConstructorGenericSimple|
public constructor(p: R|ft<P, P?>|!): R|test/ConstructorGenericSimple|
}
@@ -1,4 +1,4 @@
public open class ConstructorGenericUpperBound : R|java/lang/Object| {
public final fun ConstructorGenericUpperBound(p: R|ft<P, P?>|!): R|test/ConstructorGenericUpperBound|
public constructor(p: R|ft<P, P?>|!): R|test/ConstructorGenericUpperBound|
}
@@ -10,6 +10,6 @@ public final enum class EnumMembers : R|java/lang/Enum<test/EnumMembers>| {
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|
}
@@ -1,4 +1,4 @@
public open class ConstructorWithNewTypeParams<T> : R|java/lang/Object| {
public final fun ConstructorWithNewTypeParams(first: R|ft<U, U?>|!): R|test/ConstructorWithNewTypeParams|
public constructor(first: R|ft<U, U?>|!): R|test/ConstructorWithNewTypeParams|
}
@@ -1,4 +1,4 @@
public open class ConstructorWithParentTypeParams<T> : R|java/lang/Object| {
public final fun ConstructorWithParentTypeParams(first: R|ft<T, T?>|!): R|test/ConstructorWithParentTypeParams|
public constructor(first: R|ft<T, T?>|!): R|test/ConstructorWithParentTypeParams|
}
@@ -1,4 +1,4 @@
public open class ConstructorWithSeveralParams : R|java/lang/Object| {
public final fun ConstructorWithSeveralParams(integer: R|ft<kotlin/Int, kotlin/Int?>|!, intBasic: R|kotlin/Int|, collection: R|ft<java/util/ArrayList<ft<kotlin/String, kotlin/String?>>, java/util/ArrayList<ft<kotlin/String, kotlin/String?>>?>|!): R|test/ConstructorWithSeveralParams|
public constructor(integer: R|ft<kotlin/Int, kotlin/Int?>|!, intBasic: R|kotlin/Int|, collection: R|ft<java/util/ArrayList<ft<kotlin/String, kotlin/String?>>, java/util/ArrayList<ft<kotlin/String, kotlin/String?>>?>|!): R|test/ConstructorWithSeveralParams|
}
@@ -1,4 +1,4 @@
public open class ConstructorWithoutParams : R|java/lang/Object| {
public final fun ConstructorWithoutParams(): R|test/ConstructorWithoutParams|
public constructor(): R|test/ConstructorWithoutParams|
}
@@ -1,4 +1,4 @@
public open class Constructor : R|java/lang/Object| {
public final fun Constructor(r: R|ft<java/lang/Runnable, java/lang/Runnable?>|!): R|test/Constructor|
public constructor(r: R|ft<java/lang/Runnable, java/lang/Runnable?>|!): R|test/Constructor|
}
@@ -1,4 +1,4 @@
public open class ConstructorWithAnnotations : R|java/lang/Object| {
public final fun ConstructorWithAnnotations(r: R|ft<java/lang/Runnable, java/lang/Runnable?>|!, @R|org/jetbrains/annotations/NotNull|() s: R|kotlin/String|): R|test/ConstructorWithAnnotations|
public constructor(r: R|ft<java/lang/Runnable, java/lang/Runnable?>|!, @R|org/jetbrains/annotations/NotNull|() s: R|kotlin/String|): R|test/ConstructorWithAnnotations|
}