[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.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* 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.FirProvider
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
import org.jetbrains.kotlin.fir.symbols.CallableId 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.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.fir.visitors.FirDefaultVisitorVoid
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -29,6 +26,12 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinSc
symbol.overriddenSymbol?.let { symbol.overriddenSymbol?.let {
return getFirCallableContainerFile(it) 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] 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.*
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor 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.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -75,6 +76,11 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
} }
override fun transformProperty(property: FirProperty, data: ResolutionMode): CompositeTransformResult<FirProperty> { 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) { return withScopeCleanup(topLevelScopes) {
prepareTypeParameterOwnerForBodyResolve(property) prepareTypeParameterOwnerForBodyResolve(property)
if (property.isLocal) { 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.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* 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.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirStatement 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.firProvider
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType 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.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
@@ -246,6 +248,12 @@ private class ImplicitBodyResolveComputationSession {
private val implicitBodyResolveStatusMap = hashMapOf<FirCallableSymbol<*>, ImplicitBodyResolveComputationStatus>() private val implicitBodyResolveStatusMap = hashMapOf<FirCallableSymbol<*>, ImplicitBodyResolveComputationStatus>()
fun getStatus(symbol: 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 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"); 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") @TestMetadata("syntheticSmartCast.kt")
public void testSyntheticSmartCast() throws Exception { public void testSyntheticSmartCast() throws Exception {
runTest("compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.kt"); 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"); 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") @TestMetadata("syntheticSmartCast.kt")
public void testSyntheticSmartCast() throws Exception { public void testSyntheticSmartCast() throws Exception {
runTest("compiler/fir/resolve/testData/resolve/expresssions/syntheticSmartCast.kt"); 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.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.declarations.* 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.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
@@ -24,12 +23,12 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
class FirSyntheticProperty( class FirSyntheticProperty(
override val session: FirSession, override val session: FirSession,
override val returnTypeRef: FirTypeRef, override var returnTypeRef: FirTypeRef,
override val name: Name, override val name: Name,
override val isVar: Boolean, override val isVar: Boolean,
override val symbol: FirAccessorSymbol, override val symbol: FirAccessorSymbol,
override val status: FirDeclarationStatus, override val status: FirDeclarationStatus,
override val resolvePhase: FirResolvePhase, override var resolvePhase: FirResolvePhase,
override val getter: FirSyntheticPropertyAccessor, override val getter: FirSyntheticPropertyAccessor,
override val setter: FirSyntheticPropertyAccessor? = null override val setter: FirSyntheticPropertyAccessor? = null
) : FirProperty() { ) : FirProperty() {
@@ -114,11 +113,11 @@ class FirSyntheticProperty(
} }
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
throw AssertionError("Mutation of synthetic property isn't supported") resolvePhase = newResolvePhase
} }
override fun replaceReturnTypeRef(newReturnTypeRef: FirTypeRef) { override fun replaceReturnTypeRef(newReturnTypeRef: FirTypeRef) {
throw AssertionError("Mutation of synthetic property isn't supported") returnTypeRef = newReturnTypeRef
} }
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) { override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {