From 232efa63038c4f0a32e0936b70548af83ec867c9 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 10 Feb 2020 13:53:48 +0300 Subject: [PATCH] [FIR] Fix situation with synthetic property in implicit body --- .../kotlin/fir/resolve/impl/FirProviderImpl.kt | 11 +++++++---- .../resolve/FirDeclarationsResolveTransformer.kt | 6 ++++++ .../body/resolve/FirImplicitBodyResolve.kt | 8 ++++++++ .../expresssions/syntheticInImplicitBody.kt | 15 +++++++++++++++ .../expresssions/syntheticInImplicitBody.txt | 15 +++++++++++++++ .../kotlin/fir/FirDiagnosticsTestGenerated.java | 5 +++++ .../FirDiagnosticsWithLightTreeTestGenerated.java | 5 +++++ .../synthetic/FirSyntheticProperty.kt | 9 ++++----- 8 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 compiler/fir/resolve/testData/resolve/expresssions/syntheticInImplicitBody.kt create mode 100644 compiler/fir/resolve/testData/resolve/expresssions/syntheticInImplicitBody.txt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt index f1a035746dc..af31b8bc627 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt @@ -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] } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 67d9298b32b..075a8bf2dbb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -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 { + 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) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index a96518c0cac..0f1e733d5f9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -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, 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 } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/syntheticInImplicitBody.kt b/compiler/fir/resolve/testData/resolve/expresssions/syntheticInImplicitBody.kt new file mode 100644 index 00000000000..51fab0e4ff2 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/syntheticInImplicitBody.kt @@ -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() = "" +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/syntheticInImplicitBody.txt b/compiler/fir/resolve/testData/resolve/expresssions/syntheticInImplicitBody.txt new file mode 100644 index 00000000000..d4289e49e4b --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/syntheticInImplicitBody.txt @@ -0,0 +1,15 @@ +FILE: User.kt + public final class User : R|Owner| { + public constructor(): R|User| { + super() + } + + public final fun foo(): R|kotlin/String| { + ^foo this@R|/User|.R|/User.text| + } + + public final override fun getText(): R|kotlin/String| { + ^getText String() + } + + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index 6d3197ea49b..af23daa1a95 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -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"); diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java index 10f14d9eb10..48c066ecd1e 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java @@ -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"); diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt index ce4dd43f1e6..fa6265b2c4a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt @@ -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?) {