[FIR] Fix situation with synthetic property in implicit body

This commit is contained in:
Mikhail Glukhikh
2020-02-10 13:53:48 +03:00
parent d19d52292e
commit 232efa6303
8 changed files with 65 additions and 9 deletions
@@ -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]
}
@@ -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) {
@@ -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
}
@@ -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() = ""
}
@@ -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()
}
}
@@ -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");
@@ -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");
@@ -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?) {