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:
+27
-16
@@ -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
|
||||
}
|
||||
|
||||
|
||||
+31
-16
@@ -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
@@ -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
-1
@@ -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
-2
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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|
|
||||
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -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|
|
||||
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -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|
|
||||
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -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
-1
@@ -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
-1
@@ -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|
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user