提交 0d6e3093 编写于 作者: J Jinseong Jeon 提交者: Mikhail Glukhikh

FIR: construct type with actual type arguments during GetClassCall transformation

上级 4f8ad6bd
...@@ -5,5 +5,5 @@ FILE: reflectionClass.kt ...@@ -5,5 +5,5 @@ FILE: reflectionClass.kt
public get(): R|kotlin/reflect/KClass<kotlin/String>| public get(): R|kotlin/reflect/KClass<kotlin/String>|
public final fun foo(): R|kotlin/Unit| { public final fun foo(): R|kotlin/Unit| {
lval stringClass: R|java/lang/Class<kotlin/String>| = <getClass>(Q|kotlin/String|).R|kotlin/jvm/java|<R|kotlin/String|> lval stringClass: R|java/lang/Class<kotlin/String>| = <getClass>(Q|kotlin/String|).R|kotlin/jvm/java|<R|kotlin/String|>
lval arrayStringClass: R|java/lang/Class<kotlin/Array<*>>| = <getClass>(Q|kotlin/Array|).R|kotlin/jvm/java|<R|kotlin/Array<*>|> lval arrayStringClass: R|java/lang/Class<kotlin/Array<kotlin/String>>| = <getClass>(Q|kotlin/Array|).R|kotlin/jvm/java|<R|kotlin/Array<kotlin/String>|>
} }
...@@ -188,19 +188,8 @@ fun FirClassifierSymbol<*>.constructType( ...@@ -188,19 +188,8 @@ fun FirClassifierSymbol<*>.constructType(
} }
} }
private fun List<FirQualifierPart>.toTypeProjections(): Array<ConeTypeProjection> =
private fun List<FirQualifierPart>.toTypeProjections(): Array<ConeTypeProjection> = asReversed().flatMap { asReversed().flatMap { it.typeArguments.map { typeArgument -> typeArgument.toConeTypeProjection() } }.toTypedArray()
it.typeArguments.map { typeArgument ->
when (typeArgument) {
is FirStarProjection -> ConeStarProjection
is FirTypeProjectionWithVariance -> {
val type = (typeArgument.typeRef as FirResolvedTypeRef).type
type.toTypeProjection(typeArgument.variance)
}
else -> error("!")
}
}
}.toTypedArray()
fun FirFunction<*>.constructFunctionalTypeRef(session: FirSession, isSuspend: Boolean = false): FirResolvedTypeRef { fun FirFunction<*>.constructFunctionalTypeRef(session: FirSession, isSuspend: Boolean = false): FirResolvedTypeRef {
val receiverTypeRef = when (this) { val receiverTypeRef = when (this) {
......
...@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol ...@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.* import org.jetbrains.kotlin.fir.types.builder.*
import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
...@@ -540,13 +541,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : ...@@ -540,13 +541,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
val typeOfExpression = when (val lhs = transformedGetClassCall.argument) { val typeOfExpression = when (val lhs = transformedGetClassCall.argument) {
is FirResolvedQualifier -> { is FirResolvedQualifier -> {
val symbol = lhs.symbol val symbol = lhs.symbol
val typeRef = val typeRef = symbol?.constructType(lhs.typeArguments.map { it.toConeTypeProjection() }.toTypedArray(), isNullable = false)
symbol?.constructType(
Array((symbol.phasedFir as? FirTypeParameterRefsOwner)?.typeParameters?.size ?: 0) {
ConeStarProjection
},
isNullable = false,
)
if (typeRef != null) { if (typeRef != null) {
lhs.replaceTypeRef(buildResolvedTypeRef { type = typeRef }) lhs.replaceTypeRef(buildResolvedTypeRef { type = typeRef })
typeRef typeRef
......
...@@ -184,6 +184,16 @@ fun ConeKotlinType.toTypeProjection(variance: Variance): ConeTypeProjection = ...@@ -184,6 +184,16 @@ fun ConeKotlinType.toTypeProjection(variance: Variance): ConeTypeProjection =
Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(this) Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(this)
} }
internal fun FirTypeProjection.toConeTypeProjection(): ConeTypeProjection =
when (this) {
is FirStarProjection -> ConeStarProjection
is FirTypeProjectionWithVariance -> {
val type = (this.typeRef as FirResolvedTypeRef).type
type.toTypeProjection(this.variance)
}
else -> error("!")
}
fun ConeClassLikeLookupTag.constructClassType( fun ConeClassLikeLookupTag.constructClassType(
typeArguments: Array<out ConeTypeProjection>, typeArguments: Array<out ConeTypeProjection>,
isNullable: Boolean, isNullable: Boolean,
......
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// WITH_RUNTIME // WITH_RUNTIME
......
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// WITH_RUNTIME // WITH_RUNTIME
......
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// WITH_REFLECT // WITH_REFLECT
......
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// WITH_REFLECT // WITH_REFLECT
......
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// WITH_REFLECT // WITH_REFLECT
......
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// WITH_REFLECT // WITH_REFLECT
......
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JS_IR // IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JS_IR_ES6 // IGNORE_BACKEND: JS_IR_ES6
// TODO: muted automatically, investigate should it be ran for JS or not // TODO: muted automatically, investigate should it be ran for JS or not
......
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JS_IR // IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JS_IR_ES6 // IGNORE_BACKEND: JS_IR_ES6
// TODO: muted automatically, investigate should it be ran for JS or not // TODO: muted automatically, investigate should it be ran for JS or not
......
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// WITH_REFLECT // WITH_REFLECT
......
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// WITH_REFLECT // WITH_REFLECT
......
...@@ -23,21 +23,21 @@ val test3: MutableList<Int> = ...@@ -23,21 +23,21 @@ val test3: MutableList<Int> =
} }
val test4: Collection<Int> = val test4: Collection<Int> =
listOf(1, 2, 3).<!AMBIGUITY!>flatMapTo<!>(LinkedHashSet()) { listOf(1, 2, 3).flatMapTo(LinkedHashSet()) {
<!INAPPLICABLE_CANDIDATE!>listOf<!>(<!UNRESOLVED_REFERENCE!>it<!>) listOf(it)
} }
val test5: Collection<Int> = val test5: Collection<Int> =
listOf(1, 2, 3).<!AMBIGUITY!>flatMapTo<!>(LinkedHashSet()) { // TODO listOf(1, 2, 3).flatMapTo(LinkedHashSet()) { // TODO
if (true) <!INAPPLICABLE_CANDIDATE!>listOf<!>(<!UNRESOLVED_REFERENCE!>it<!>) else <!INAPPLICABLE_CANDIDATE!>listOf<!>(<!UNRESOLVED_REFERENCE!>it<!>) if (true) listOf(it) else listOf(it)
} }
val test6: Collection<Int> = val test6: Collection<Int> =
listOf(1, 2, 3).<!AMBIGUITY!>flatMapTo<!>(LinkedHashSet<Int>()) { listOf(1, 2, 3).flatMapTo(LinkedHashSet<Int>()) {
if (true) <!INAPPLICABLE_CANDIDATE!>listOf<!>(<!UNRESOLVED_REFERENCE!>it<!>) else <!INAPPLICABLE_CANDIDATE!>listOf<!>(<!UNRESOLVED_REFERENCE!>it<!>) if (true) listOf(it) else listOf(it)
} }
val test7: Collection<Int> = val test7: Collection<Int> =
listOf(1, 2, 3).<!AMBIGUITY!>flatMapTo<!>(LinkedHashSet()) { listOf(1, 2, 3).flatMapTo(LinkedHashSet()) {
<!INAPPLICABLE_CANDIDATE!>select<!>(<!INAPPLICABLE_CANDIDATE!>listOf<!>(<!UNRESOLVED_REFERENCE!>it<!>), <!INAPPLICABLE_CANDIDATE!>listOf<!>(<!UNRESOLVED_REFERENCE!>it<!>)) select(listOf(it), listOf(it))
} }
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册