[FIR] Record & use type arguments of FirQualifiedAccessExpression
This commit is contained in:
@@ -785,13 +785,13 @@ class Fir2IrVisitor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrExpression.applyTypeArguments(call: FirFunctionCall): IrExpression {
|
private fun IrExpression.applyTypeArguments(access: FirQualifiedAccess): IrExpression {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is IrCallWithIndexedArgumentsBase -> {
|
is IrCallWithIndexedArgumentsBase -> {
|
||||||
val argumentsCount = call.typeArguments.size
|
val argumentsCount = access.typeArguments.size
|
||||||
if (argumentsCount <= typeArgumentsCount) {
|
if (argumentsCount <= typeArgumentsCount) {
|
||||||
apply {
|
apply {
|
||||||
for ((index, argument) in call.typeArguments.withIndex()) {
|
for ((index, argument) in access.typeArguments.withIndex()) {
|
||||||
val argumentIrType = (argument as FirTypeProjectionWithVariance).typeRef.toIrType(
|
val argumentIrType = (argument as FirTypeProjectionWithVariance).typeRef.toIrType(
|
||||||
session,
|
session,
|
||||||
declarationStorage
|
declarationStorage
|
||||||
@@ -904,7 +904,8 @@ class Fir2IrVisitor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: Any?): IrElement {
|
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: Any?): IrElement {
|
||||||
return qualifiedAccessExpression.toIrExpression(qualifiedAccessExpression.typeRef).applyReceivers(qualifiedAccessExpression)
|
return qualifiedAccessExpression.toIrExpression(qualifiedAccessExpression.typeRef)
|
||||||
|
.applyTypeArguments(qualifiedAccessExpression).applyReceivers(qualifiedAccessExpression)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: Any?): IrElement {
|
override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: Any?): IrElement {
|
||||||
|
|||||||
+35
-26
@@ -53,6 +53,7 @@ class FirCallCompletionResultsWriterTransformer(
|
|||||||
qualifiedAccessExpression.calleeReference as? FirNamedReferenceWithCandidate ?: return qualifiedAccessExpression.compose()
|
qualifiedAccessExpression.calleeReference as? FirNamedReferenceWithCandidate ?: return qualifiedAccessExpression.compose()
|
||||||
|
|
||||||
val candidateFir = calleeReference.candidateSymbol.phasedFir
|
val candidateFir = calleeReference.candidateSymbol.phasedFir
|
||||||
|
val typeArguments = computeTypeArguments(qualifiedAccessExpression, calleeReference.candidate)
|
||||||
val typeRef = (candidateFir as? FirTypedDeclaration)?.let {
|
val typeRef = (candidateFir as? FirTypedDeclaration)?.let {
|
||||||
typeCalculator.tryCalculateReturnType(it)
|
typeCalculator.tryCalculateReturnType(it)
|
||||||
} ?: buildErrorTypeRef {
|
} ?: buildErrorTypeRef {
|
||||||
@@ -60,7 +61,7 @@ class FirCallCompletionResultsWriterTransformer(
|
|||||||
diagnostic = FirSimpleDiagnostic("Callee reference to candidate without return type: ${candidateFir.render()}")
|
diagnostic = FirSimpleDiagnostic("Callee reference to candidate without return type: ${candidateFir.render()}")
|
||||||
}
|
}
|
||||||
|
|
||||||
qualifiedAccessExpression.replaceTypeRefWithSubstituted(calleeReference, typeRef)
|
qualifiedAccessExpression.replaceTypeRefWithSubstituted(calleeReference, typeRef).replaceTypeArguments(typeArguments)
|
||||||
|
|
||||||
return qualifiedAccessExpression.transformCalleeReference(
|
return qualifiedAccessExpression.transformCalleeReference(
|
||||||
StoreCalleeReference,
|
StoreCalleeReference,
|
||||||
@@ -69,7 +70,9 @@ class FirCallCompletionResultsWriterTransformer(
|
|||||||
name = calleeReference.name
|
name = calleeReference.name
|
||||||
resolvedSymbol = calleeReference.candidateSymbol
|
resolvedSymbol = calleeReference.candidateSymbol
|
||||||
},
|
},
|
||||||
).compose()
|
).apply {
|
||||||
|
replaceTypeArguments(typeArguments)
|
||||||
|
}.compose()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <D : FirExpression> D.replaceTypeRefWithSubstituted(
|
private fun <D : FirExpression> D.replaceTypeRefWithSubstituted(
|
||||||
@@ -115,7 +118,7 @@ class FirCallCompletionResultsWriterTransformer(
|
|||||||
source = calleeReference.source
|
source = calleeReference.source
|
||||||
name = calleeReference.name
|
name = calleeReference.name
|
||||||
resolvedSymbol = calleeReference.candidateSymbol
|
resolvedSymbol = calleeReference.candidateSymbol
|
||||||
inferredTypeArguments.addAll(computeTypeArguments(calleeReference.candidate))
|
inferredTypeArguments.addAll(computeTypeArgumentTypes(calleeReference.candidate))
|
||||||
},
|
},
|
||||||
).compose()
|
).compose()
|
||||||
}
|
}
|
||||||
@@ -141,29 +144,7 @@ class FirCallCompletionResultsWriterTransformer(
|
|||||||
|
|
||||||
val subCandidate = calleeReference.candidate
|
val subCandidate = calleeReference.candidate
|
||||||
val declaration = subCandidate.symbol.phasedFir as FirCallableMemberDeclaration<*>
|
val declaration = subCandidate.symbol.phasedFir as FirCallableMemberDeclaration<*>
|
||||||
val typeArguments = computeTypeArguments(subCandidate)
|
val typeArguments = computeTypeArguments(functionCall, subCandidate)
|
||||||
.mapIndexed { index, type ->
|
|
||||||
when (val argument = functionCall.typeArguments.getOrNull(index)) {
|
|
||||||
is FirTypeProjectionWithVariance -> {
|
|
||||||
val typeRef = argument.typeRef as FirResolvedTypeRef
|
|
||||||
buildTypeProjectionWithVariance {
|
|
||||||
source = argument.source
|
|
||||||
this.typeRef = typeRef.withReplacedConeType(type)
|
|
||||||
variance = argument.variance
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
buildTypeProjectionWithVariance {
|
|
||||||
source = argument?.source
|
|
||||||
typeRef = buildResolvedTypeRef {
|
|
||||||
this.type = type
|
|
||||||
}
|
|
||||||
variance = Variance.INVARIANT
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val typeRef = typeCalculator.tryCalculateReturnType(declaration).let {
|
val typeRef = typeCalculator.tryCalculateReturnType(declaration).let {
|
||||||
if (functionCall.safe) {
|
if (functionCall.safe) {
|
||||||
val nullableType = it.coneTypeUnsafe<ConeKotlinType>().withNullability(ConeNullability.NULLABLE, session.inferenceContext)
|
val nullableType = it.coneTypeUnsafe<ConeKotlinType>().withNullability(ConeNullability.NULLABLE, session.inferenceContext)
|
||||||
@@ -262,6 +243,34 @@ class FirCallCompletionResultsWriterTransformer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun computeTypeArguments(
|
private fun computeTypeArguments(
|
||||||
|
access: FirQualifiedAccess,
|
||||||
|
candidate: Candidate
|
||||||
|
): List<FirTypeProjectionWithVariance> {
|
||||||
|
return computeTypeArgumentTypes(candidate)
|
||||||
|
.mapIndexed { index, type ->
|
||||||
|
when (val argument = access.typeArguments.getOrNull(index)) {
|
||||||
|
is FirTypeProjectionWithVariance -> {
|
||||||
|
val typeRef = argument.typeRef as FirResolvedTypeRef
|
||||||
|
buildTypeProjectionWithVariance {
|
||||||
|
source = argument.source
|
||||||
|
this.typeRef = typeRef.withReplacedConeType(type)
|
||||||
|
variance = argument.variance
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
buildTypeProjectionWithVariance {
|
||||||
|
source = argument?.source
|
||||||
|
typeRef = buildResolvedTypeRef {
|
||||||
|
this.type = type
|
||||||
|
}
|
||||||
|
variance = Variance.INVARIANT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun computeTypeArgumentTypes(
|
||||||
candidate: Candidate,
|
candidate: Candidate,
|
||||||
): List<ConeKotlinType> {
|
): List<ConeKotlinType> {
|
||||||
val declaration = candidate.symbol.phasedFir as? FirCallableMemberDeclaration<*> ?: return emptyList()
|
val declaration = candidate.symbol.phasedFir as? FirCallableMemberDeclaration<*> ?: return emptyList()
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ FILE: extensionPropertyInLambda.kt
|
|||||||
}
|
}
|
||||||
public final fun test1(): R|kotlin/Unit| {
|
public final fun test1(): R|kotlin/Unit| {
|
||||||
R|/use|(<L> = use@fun <anonymous>(): R|kotlin/String| {
|
R|/use|(<L> = use@fun <anonymous>(): R|kotlin/String| {
|
||||||
^ R|/C.C|<R|kotlin/String|>(String(abc)).R|/y|
|
^ R|/C.C|<R|kotlin/String|>(String(abc)).R|/y|<R|kotlin/String|>
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|/use|(R|/C.C|<R|kotlin/String|>(String(abc))::R|/y<kotlin/String>|)
|
R|/use|(R|/C.C|<R|kotlin/String|>(String(abc))::R|/y<kotlin/String>|)
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ FILE: simpleCapturedTypes.kt
|
|||||||
private final fun getSetterInfos(kc: R|KC<out Ann>|): R|kotlin/Unit| {
|
private final fun getSetterInfos(kc: R|KC<out Ann>|): R|kotlin/Unit| {
|
||||||
R|/id|<R|CapturedType(out Ann)|>(R|<local>/kc|).R|FakeOverride</KC.x: R|Ann|>|.R|/Ann.foo|()
|
R|/id|<R|CapturedType(out Ann)|>(R|<local>/kc|).R|FakeOverride</KC.x: R|Ann|>|.R|/Ann.foo|()
|
||||||
R|<local>/kc|.R|/idR|<R|CapturedType(out Ann)|>().R|FakeOverride</KC.x: R|Ann|>|.R|/Ann.foo|()
|
R|<local>/kc|.R|/idR|<R|CapturedType(out Ann)|>().R|FakeOverride</KC.x: R|Ann|>|.R|/Ann.foo|()
|
||||||
R|<local>/kc|.R|/idP|.R|FakeOverride</KC.x: R|Ann|>|.R|/Ann.foo|()
|
R|<local>/kc|.R|/idP|<R|CapturedType(out Ann)|>.R|FakeOverride</KC.x: R|Ann|>|.R|/Ann.foo|()
|
||||||
lval x1: R|KC<out Ann>| = R|/id|<R|CapturedType(out Ann)|>(R|<local>/kc|)
|
lval x1: R|KC<out Ann>| = R|/id|<R|CapturedType(out Ann)|>(R|<local>/kc|)
|
||||||
lval x2: R|KC<out Ann>| = R|<local>/kc|.R|/idR|<R|CapturedType(out Ann)|>()
|
lval x2: R|KC<out Ann>| = R|<local>/kc|.R|/idR|<R|CapturedType(out Ann)|>()
|
||||||
lval x3: R|KC<out Ann>| = R|<local>/kc|.R|/idP|
|
lval x3: R|KC<out Ann>| = R|<local>/kc|.R|/idP|<R|CapturedType(out Ann)|>
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
FILE: classLiteralForParameter.kt
|
FILE: classLiteralForParameter.kt
|
||||||
public final inline fun <reified T : R|kotlin/Any|> foo(t: R|T|): R|T| {
|
public final inline fun <reified T : R|kotlin/Any|> foo(t: R|T|): R|T| {
|
||||||
lval klass: R|java/lang/Class<T>| = <getClass>(R|T|).R|kotlin/jvm/java|
|
lval klass: R|java/lang/Class<T>| = <getClass>(R|T|).R|kotlin/jvm/java|<R|T|>
|
||||||
^foo R|<local>/t|
|
^foo R|<local>/t|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ FILE: test.kt
|
|||||||
super<R|kotlin/Any|>()
|
super<R|kotlin/Any|>()
|
||||||
}
|
}
|
||||||
|
|
||||||
private final val klass: R|java/lang/Class<MyTest>| = <getClass>(this@R|/MyTest|).R|kotlin/jvm/java|
|
private final val klass: R|java/lang/Class<MyTest>| = <getClass>(this@R|/MyTest|).R|kotlin/jvm/java|<R|MyTest|>
|
||||||
private get(): R|java/lang/Class<MyTest>|
|
private get(): R|java/lang/Class<MyTest>|
|
||||||
|
|
||||||
private final val logger: R|ft<Logger, Logger?>!| = Q|Logger|.R|/Logger.getInstance|(this@R|/MyTest|.R|/MyTest.klass|)
|
private final val logger: R|ft<Logger, Logger?>!| = Q|Logger|.R|/Logger.getInstance|(this@R|/MyTest|.R|/MyTest.klass|)
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ FILE: User.kt
|
|||||||
protected abstract fun createSettings(): R|T|
|
protected abstract fun createSettings(): R|T|
|
||||||
|
|
||||||
public final fun foo(): R|kotlin/Unit| {
|
public final fun foo(): R|kotlin/Unit| {
|
||||||
this@R|/User|.R|/User.settings| = Q|StaticOwner|.R|/StaticOwner.newInstance|<R|ft<T, T?>!|>(this@R|/User|.R|/User.settings|.R|kotlin/jvm/javaClass|)
|
this@R|/User|.R|/User.settings| = Q|StaticOwner|.R|/StaticOwner.newInstance|<R|ft<T, T?>!|>(this@R|/User|.R|/User.settings|.R|kotlin/jvm/javaClass|<R|ft<T, T?>!|>)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
FILE: reflectionClass.kt
|
FILE: reflectionClass.kt
|
||||||
public final val javaClass: R|java/lang/Class<kotlin/String>| = <getClass>(Q|kotlin/String|).R|kotlin/jvm/java|
|
public final val javaClass: R|java/lang/Class<kotlin/String>| = <getClass>(Q|kotlin/String|).R|kotlin/jvm/java|<R|kotlin/String|>
|
||||||
public get(): R|java/lang/Class<kotlin/String>|
|
public get(): R|java/lang/Class<kotlin/String>|
|
||||||
public final val kotlinClass: R|kotlin/reflect/KClass<kotlin/String>| = <getClass>(Q|kotlin/String|)
|
public final val kotlinClass: R|kotlin/reflect/KClass<kotlin/String>| = <getClass>(Q|kotlin/String|)
|
||||||
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|
|
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|
|
lval arrayStringClass: R|java/lang/Class<kotlin/Array<*>>| = <getClass>(Q|kotlin/Array|).R|kotlin/jvm/java|<R|kotlin/Array<*>|>
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -25,6 +25,8 @@ interface FirQualifiedAccessWithoutCallee : FirStatement {
|
|||||||
|
|
||||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccessWithoutCallee(this, data)
|
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccessWithoutCallee(this, data)
|
||||||
|
|
||||||
|
fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
|
||||||
|
|
||||||
fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
|
fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
|
||||||
|
|
||||||
fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
|
fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
|
||||||
|
|||||||
@@ -33,5 +33,7 @@ abstract class FirResolvedQualifier : FirExpression() {
|
|||||||
|
|
||||||
abstract fun replaceSafe(newSafe: Boolean)
|
abstract fun replaceSafe(newSafe: Boolean)
|
||||||
|
|
||||||
|
abstract fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
|
||||||
|
|
||||||
abstract fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirResolvedQualifier
|
abstract fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirResolvedQualifier
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,4 +109,9 @@ internal class FirArraySetCallImpl(
|
|||||||
indexes.transformInplace(transformer, data)
|
indexes.transformInplace(transformer, data)
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
typeArguments.clear()
|
||||||
|
typeArguments.addAll(newTypeArguments)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -88,4 +88,9 @@ internal class FirCallableReferenceAccessImpl(
|
|||||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
||||||
typeRef = newTypeRef
|
typeRef = newTypeRef
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
typeArguments.clear()
|
||||||
|
typeArguments.addAll(newTypeArguments)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -95,4 +95,9 @@ internal class FirComponentCallImpl(
|
|||||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
||||||
typeRef = newTypeRef
|
typeRef = newTypeRef
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
typeArguments.clear()
|
||||||
|
typeArguments.addAll(newTypeArguments)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,4 +97,9 @@ open class FirFunctionCallImpl @FirImplementationDetail constructor(
|
|||||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
||||||
typeRef = newTypeRef
|
typeRef = newTypeRef
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
typeArguments.clear()
|
||||||
|
typeArguments.addAll(newTypeArguments)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -35,4 +35,6 @@ interface FirModifiableQualifiedAccess : FirQualifiedAccessWithoutCallee {
|
|||||||
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
|
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
|
||||||
|
|
||||||
override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
|
override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -88,4 +88,9 @@ internal class FirQualifiedAccessExpressionImpl(
|
|||||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
||||||
typeRef = newTypeRef
|
typeRef = newTypeRef
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
typeArguments.clear()
|
||||||
|
typeArguments.addAll(newTypeArguments)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -59,4 +59,9 @@ internal class FirResolvedQualifierImpl(
|
|||||||
override fun replaceSafe(newSafe: Boolean) {
|
override fun replaceSafe(newSafe: Boolean) {
|
||||||
safe = newSafe
|
safe = newSafe
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
typeArguments.clear()
|
||||||
|
typeArguments.addAll(newTypeArguments)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -90,4 +90,9 @@ internal class FirThisReceiverExpressionImpl(
|
|||||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
||||||
typeRef = newTypeRef
|
typeRef = newTypeRef
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
typeArguments.clear()
|
||||||
|
typeArguments.addAll(newTypeArguments)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -94,4 +94,9 @@ internal class FirVariableAssignmentImpl(
|
|||||||
rValue = rValue.transformSingle(transformer, data)
|
rValue = rValue.transformSingle(transformer, data)
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
typeArguments.clear()
|
||||||
|
typeArguments.addAll(newTypeArguments)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -67,5 +67,9 @@ internal class FirExpressionWithSmartcastImpl(
|
|||||||
throw IllegalStateException()
|
throw IllegalStateException()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
throw IllegalStateException()
|
||||||
|
}
|
||||||
|
|
||||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
|
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -29,7 +29,7 @@ object FieldSets {
|
|||||||
)
|
)
|
||||||
|
|
||||||
val typeArguments =
|
val typeArguments =
|
||||||
fieldList("typeArguments", typeProjection)
|
fieldList("typeArguments", typeProjection, withReplace = true)
|
||||||
|
|
||||||
val arguments =
|
val arguments =
|
||||||
fieldList("arguments", expression)
|
fieldList("arguments", expression)
|
||||||
|
|||||||
@@ -24,9 +24,5 @@ FILE fqName:<root> fileName:/classReference.kt
|
|||||||
GET_OBJECT 'CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit
|
GET_OBJECT 'CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit
|
||||||
GET_CLASS type=kotlin.reflect.KClass<<root>.A>
|
GET_CLASS type=kotlin.reflect.KClass<<root>.A>
|
||||||
CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in <root>.A' type=<root>.A origin=null
|
CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in <root>.A' type=<root>.A origin=null
|
||||||
CALL 'public final fun <get-java> (): java.lang.Class<T of <uninitialized parent>> declared in kotlin.jvm' type=java.lang.Class<<root>.A> origin=null
|
ERROR_EXPR 'Cannot bind 1 type arguments to <get-java> call with 0 type parameters' type=java.lang.Class<<root>.A>
|
||||||
$receiver: GET_CLASS type=kotlin.reflect.KClass<<root>.A>
|
ERROR_EXPR 'Cannot bind 1 type arguments to <get-java> call with 0 type parameters' type=java.lang.Class<<root>.A>
|
||||||
GET_OBJECT 'CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit
|
|
||||||
CALL 'public final fun <get-java> (): java.lang.Class<T of <uninitialized parent>> declared in kotlin.jvm' type=java.lang.Class<<root>.A> origin=null
|
|
||||||
$receiver: GET_CLASS type=kotlin.reflect.KClass<<root>.A>
|
|
||||||
CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in <root>.A' type=<root>.A origin=null
|
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ FILE fqName:<root> fileName:/genericPropertyCall.kt
|
|||||||
PROPERTY name:test visibility:public modality:FINAL [val]
|
PROPERTY name:test visibility:public modality:FINAL [val]
|
||||||
FIELD PROPERTY_BACKING_FIELD name:test type:kotlin.String visibility:private [final,static]
|
FIELD PROPERTY_BACKING_FIELD name:test type:kotlin.String visibility:private [final,static]
|
||||||
EXPRESSION_BODY
|
EXPRESSION_BODY
|
||||||
CALL 'public final fun <get-id> (): T of <uninitialized parent> declared in <root>' type=kotlin.String origin=null
|
ERROR_EXPR 'Cannot bind 1 type arguments to <get-id> call with 0 type parameters' type=kotlin.String
|
||||||
$receiver: CONST String type=kotlin.String value="abc"
|
|
||||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test> visibility:public modality:FINAL <> () returnType:kotlin.String
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test> visibility:public modality:FINAL <> () returnType:kotlin.String
|
||||||
correspondingProperty: PROPERTY name:test visibility:public modality:FINAL [val]
|
correspondingProperty: PROPERTY name:test visibility:public modality:FINAL [val]
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
|
|||||||
@@ -22,6 +22,4 @@ FILE fqName:<root> fileName:/objectClassReference.kt
|
|||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
GET_CLASS type=kotlin.reflect.KClass<<root>.A>
|
GET_CLASS type=kotlin.reflect.KClass<<root>.A>
|
||||||
GET_OBJECT 'CLASS OBJECT name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=<root>.A
|
GET_OBJECT 'CLASS OBJECT name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=<root>.A
|
||||||
CALL 'public final fun <get-java> (): java.lang.Class<T of <uninitialized parent>> declared in kotlin.jvm' type=java.lang.Class<<root>.A> origin=null
|
ERROR_EXPR 'Cannot bind 1 type arguments to <get-java> call with 0 type parameters' type=java.lang.Class<<root>.A>
|
||||||
$receiver: GET_CLASS type=kotlin.reflect.KClass<<root>.A>
|
|
||||||
GET_OBJECT 'CLASS OBJECT name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=<root>.A
|
|
||||||
|
|||||||
@@ -229,9 +229,7 @@ FILE fqName:<root> fileName:/useImportedMember.kt
|
|||||||
BRANCH
|
BRANCH
|
||||||
if: CALL 'public final fun not (): kotlin.Boolean [operator] declared in kotlin.Boolean' type=kotlin.Boolean origin=EXCLEQ
|
if: CALL 'public final fun not (): kotlin.Boolean [operator] declared in kotlin.Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||||
$this: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EXCLEQ
|
$this: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EXCLEQ
|
||||||
arg0: CALL 'public final fun <get-g2> (): T of <uninitialized parent> declared in <root>.C' type=kotlin.String origin=null
|
arg0: ERROR_EXPR 'Cannot bind 1 type arguments to <get-g2> call with 0 type parameters' type=kotlin.String
|
||||||
$this: CONST String type=kotlin.String value="8"
|
|
||||||
$receiver: CONST String type=kotlin.String value="8"
|
|
||||||
arg1: CONST String type=kotlin.String value="8"
|
arg1: CONST String type=kotlin.String value="8"
|
||||||
then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
||||||
CONST String type=kotlin.String value="8"
|
CONST String type=kotlin.String value="8"
|
||||||
@@ -250,9 +248,7 @@ FILE fqName:<root> fileName:/useImportedMember.kt
|
|||||||
BRANCH
|
BRANCH
|
||||||
if: CALL 'public final fun not (): kotlin.Boolean [operator] declared in kotlin.Boolean' type=kotlin.Boolean origin=EXCLEQ
|
if: CALL 'public final fun not (): kotlin.Boolean [operator] declared in kotlin.Boolean' type=kotlin.Boolean origin=EXCLEQ
|
||||||
$this: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EXCLEQ
|
$this: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EXCLEQ
|
||||||
arg0: CALL 'public final fun <get-fromClass> (): T of <uninitialized parent> declared in <root>.BaseClass' type=kotlin.String origin=null
|
arg0: ERROR_EXPR 'Cannot bind 1 type arguments to <get-fromClass> call with 0 type parameters' type=kotlin.String
|
||||||
$this: CONST String type=kotlin.String value="10"
|
|
||||||
$receiver: CONST String type=kotlin.String value="10"
|
|
||||||
arg1: CONST String type=kotlin.String value="10"
|
arg1: CONST String type=kotlin.String value="10"
|
||||||
then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
||||||
CONST String type=kotlin.String value="10"
|
CONST String type=kotlin.String value="10"
|
||||||
|
|||||||
+2
-4
@@ -15,8 +15,7 @@ FILE fqName:<root> fileName:/variableAsFunctionCallWithGenerics.kt
|
|||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='public final fun testGeneric1 (x: kotlin.String): T of <uninitialized parent> declared in <root>'
|
RETURN type=kotlin.Nothing from='public final fun testGeneric1 (x: kotlin.String): T of <uninitialized parent> declared in <root>'
|
||||||
CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of <uninitialized parent> origin=INVOKE
|
CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of <uninitialized parent> origin=INVOKE
|
||||||
$this: CALL 'public final fun <get-gk> (): kotlin.Function0<T of <uninitialized parent>> declared in <root>' type=kotlin.Function0<kotlin.String> origin=null
|
$this: ERROR_EXPR 'Cannot bind 1 type arguments to <get-gk> call with 0 type parameters' type=kotlin.Function0<kotlin.String>
|
||||||
$receiver: GET_VAR 'x: kotlin.String declared in <root>.testGeneric1' type=kotlin.String origin=null
|
|
||||||
PROPERTY name:kt26531Val visibility:public modality:FINAL [val]
|
PROPERTY name:kt26531Val visibility:public modality:FINAL [val]
|
||||||
FUN name:<get-kt26531Val> visibility:public modality:FINAL <> ($receiver:T of <uninitialized parent>) returnType:kotlin.Function0<T of <uninitialized parent>>
|
FUN name:<get-kt26531Val> visibility:public modality:FINAL <> ($receiver:T of <uninitialized parent>) returnType:kotlin.Function0<T of <uninitialized parent>>
|
||||||
correspondingProperty: PROPERTY name:kt26531Val visibility:public modality:FINAL [val]
|
correspondingProperty: PROPERTY name:kt26531Val visibility:public modality:FINAL [val]
|
||||||
@@ -32,5 +31,4 @@ FILE fqName:<root> fileName:/variableAsFunctionCallWithGenerics.kt
|
|||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='public final fun kt26531 (): T of <uninitialized parent> declared in <root>'
|
RETURN type=kotlin.Nothing from='public final fun kt26531 (): T of <uninitialized parent> declared in <root>'
|
||||||
CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of <uninitialized parent> origin=INVOKE
|
CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of <uninitialized parent> origin=INVOKE
|
||||||
$this: CALL 'public final fun <get-kt26531Val> (): kotlin.Function0<T of <uninitialized parent>> declared in <root>' type=kotlin.Function0<kotlin.Int> origin=null
|
$this: ERROR_EXPR 'Cannot bind 1 type arguments to <get-kt26531Val> call with 0 type parameters' type=kotlin.Function0<kotlin.Int>
|
||||||
$receiver: CONST Int type=kotlin.Int value=7
|
|
||||||
|
|||||||
Reference in New Issue
Block a user