[FIR] Fix situation with synthetic property in implicit body
This commit is contained in:
@@ -9,16 +9,13 @@ import org.jetbrains.annotations.TestOnly
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
@@ -29,6 +26,12 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinSc
|
||||
symbol.overriddenSymbol?.let {
|
||||
return getFirCallableContainerFile(it)
|
||||
}
|
||||
if (symbol is FirAccessorSymbol) {
|
||||
val fir = symbol.fir
|
||||
if (fir is FirSyntheticProperty) {
|
||||
return getFirCallableContainerFile(fir.getter.delegate.symbol)
|
||||
}
|
||||
}
|
||||
return state.callableContainerMap[symbol]
|
||||
}
|
||||
|
||||
|
||||
+6
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.copy
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
@@ -75,6 +76,11 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
}
|
||||
|
||||
override fun transformProperty(property: FirProperty, data: ResolutionMode): CompositeTransformResult<FirProperty> {
|
||||
if (property is FirSyntheticProperty) {
|
||||
transformSimpleFunction(property.getter.delegate, data)
|
||||
property.replaceReturnTypeRef(property.getter.delegate.returnTypeRef)
|
||||
return property.compose()
|
||||
}
|
||||
return withScopeCleanup(topLevelScopes) {
|
||||
prepareTypeParameterOwnerForBodyResolve(property)
|
||||
if (property.isLocal) {
|
||||
|
||||
+8
@@ -10,6 +10,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||
@@ -19,6 +20,7 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.firProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
@@ -246,6 +248,12 @@ private class ImplicitBodyResolveComputationSession {
|
||||
private val implicitBodyResolveStatusMap = hashMapOf<FirCallableSymbol<*>, ImplicitBodyResolveComputationStatus>()
|
||||
|
||||
fun getStatus(symbol: FirCallableSymbol<*>): ImplicitBodyResolveComputationStatus {
|
||||
if (symbol is FirAccessorSymbol) {
|
||||
val fir = symbol.fir
|
||||
if (fir is FirSyntheticProperty) {
|
||||
return getStatus(fir.getter.delegate.symbol)
|
||||
}
|
||||
}
|
||||
return implicitBodyResolveStatusMap[symbol] ?: ImplicitBodyResolveComputationStatus.NotComputed
|
||||
}
|
||||
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
// FILE: Owner.java
|
||||
|
||||
public class Owner {
|
||||
public String getText() {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: User.kt
|
||||
|
||||
class User : Owner() {
|
||||
fun foo() = text
|
||||
|
||||
override fun getText() = ""
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
FILE: User.kt
|
||||
public final class User : R|Owner| {
|
||||
public constructor(): R|User| {
|
||||
super<R|Owner|>()
|
||||
}
|
||||
|
||||
public final fun foo(): R|kotlin/String| {
|
||||
^foo this@R|/User|.R|/User.text|
|
||||
}
|
||||
|
||||
public final override fun getText(): R|kotlin/String| {
|
||||
^getText String()
|
||||
}
|
||||
|
||||
}
|
||||
+5
@@ -689,6 +689,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest {
|
||||
runTest("compiler/fir/resolve/testData/resolve/expresssions/simple.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("syntheticInImplicitBody.kt")
|
||||
public void testSyntheticInImplicitBody() throws Exception {
|
||||
runTest("compiler/fir/resolve/testData/resolve/expresssions/syntheticInImplicitBody.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("syntheticSmartCast.kt")
|
||||
public void testSyntheticSmartCast() throws Exception {
|
||||
runTest("compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.kt");
|
||||
|
||||
Generated
+5
@@ -689,6 +689,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
|
||||
runTest("compiler/fir/resolve/testData/resolve/expresssions/simple.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("syntheticInImplicitBody.kt")
|
||||
public void testSyntheticInImplicitBody() throws Exception {
|
||||
runTest("compiler/fir/resolve/testData/resolve/expresssions/syntheticInImplicitBody.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("syntheticSmartCast.kt")
|
||||
public void testSyntheticSmartCast() throws Exception {
|
||||
runTest("compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.kt");
|
||||
|
||||
+4
-5
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.declarations.synthetic
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
@@ -24,12 +23,12 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
|
||||
|
||||
class FirSyntheticProperty(
|
||||
override val session: FirSession,
|
||||
override val returnTypeRef: FirTypeRef,
|
||||
override var returnTypeRef: FirTypeRef,
|
||||
override val name: Name,
|
||||
override val isVar: Boolean,
|
||||
override val symbol: FirAccessorSymbol,
|
||||
override val status: FirDeclarationStatus,
|
||||
override val resolvePhase: FirResolvePhase,
|
||||
override var resolvePhase: FirResolvePhase,
|
||||
override val getter: FirSyntheticPropertyAccessor,
|
||||
override val setter: FirSyntheticPropertyAccessor? = null
|
||||
) : FirProperty() {
|
||||
@@ -114,11 +113,11 @@ class FirSyntheticProperty(
|
||||
}
|
||||
|
||||
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
|
||||
throw AssertionError("Mutation of synthetic property isn't supported")
|
||||
resolvePhase = newResolvePhase
|
||||
}
|
||||
|
||||
override fun replaceReturnTypeRef(newReturnTypeRef: FirTypeRef) {
|
||||
throw AssertionError("Mutation of synthetic property isn't supported")
|
||||
returnTypeRef = newReturnTypeRef
|
||||
}
|
||||
|
||||
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {
|
||||
|
||||
Reference in New Issue
Block a user