[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.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]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
@@ -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) {
|
||||||
|
|||||||
+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.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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+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");
|
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");
|
||||||
|
|||||||
Generated
+5
@@ -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");
|
||||||
|
|||||||
+4
-5
@@ -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?) {
|
||||||
|
|||||||
Reference in New Issue
Block a user