[FIR] Fix incorrect usages of getClassLikeSymbolByClassId with lookup tag

^KT-57839 Fixed
This commit is contained in:
Dmitriy Novozhilov
2023-04-11 11:43:37 +03:00
committed by Space Team
parent b750e1e62c
commit cfa06dbf74
10 changed files with 79 additions and 19 deletions
@@ -3535,6 +3535,12 @@ public class DiagnosticCompilerTestFirTestdataTestGenerated extends AbstractDiag
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.kt");
}
@Test
@TestMetadata("lambdaWithAnonymousObject.kt")
public void testLambdaWithAnonymousObject() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt");
}
@Test
@TestMetadata("overrideInLocal.kt")
public void testOverrideInLocal() throws Exception {
@@ -3535,6 +3535,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.kt");
}
@Test
@TestMetadata("lambdaWithAnonymousObject.kt")
public void testLambdaWithAnonymousObject() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt");
}
@Test
@TestMetadata("overrideInLocal.kt")
public void testOverrideInLocal() throws Exception {
@@ -3107,6 +3107,11 @@ public class LazyBodyIsNotTouchedTestGenerated extends AbstractLazyBodyIsNotTouc
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.kt");
}
@TestMetadata("lambdaWithAnonymousObject.kt")
public void testLambdaWithAnonymousObject() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt");
}
@TestMetadata("overrideInLocal.kt")
public void testOverrideInLocal() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/overrideInLocal.kt");
@@ -0,0 +1,26 @@
FILE: lambdaWithAnonymousObject.kt
public final fun <R> myRun(block: R|() -> R|): R|R| {
^myRun R|<local>/block|.R|SubstitutionOverride<kotlin/Function0.invoke: R|R|>|()
}
public abstract interface Bar : R|kotlin/Any| {
public abstract val action: R|() -> kotlin/Unit|
public get(): R|() -> kotlin/Unit|
}
public final val cardModel: R|Bar| = R|/myRun|<R|<anonymous>|>(<L> = myRun@fun <anonymous>(): R|<anonymous>| <inline=NoInline> {
^ object : R|Bar| {
private constructor(): R|<anonymous>| {
super<R|kotlin/Any|>()
}
public open override val action: R|() -> kotlin/Unit| = myRun@fun <anonymous>(): R|kotlin/Unit| <inline=Unknown> {
^@myRun Unit
}
public get(): R|() -> kotlin/Unit|
}
}
)
public get(): R|Bar|
@@ -0,0 +1,15 @@
// ISSUE: KT-57839
fun <R> myRun(block: () -> R): R {
return block()
}
interface Bar {
val action: () -> Unit
}
val cardModel = myRun {
object : Bar {
override val action = {}
}
}
@@ -3535,6 +3535,12 @@ public class FirLightTreeDiagnosticsTestGenerated extends AbstractFirLightTreeDi
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.kt");
}
@Test
@TestMetadata("lambdaWithAnonymousObject.kt")
public void testLambdaWithAnonymousObject() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt");
}
@Test
@TestMetadata("overrideInLocal.kt")
public void testOverrideInLocal() throws Exception {
@@ -3535,6 +3535,12 @@ public class FirPsiDiagnosticTestGenerated extends AbstractFirPsiDiagnosticTest
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.kt");
}
@Test
@TestMetadata("lambdaWithAnonymousObject.kt")
public void testLambdaWithAnonymousObject() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt");
}
@Test
@TestMetadata("overrideInLocal.kt")
public void testOverrideInLocal() throws Exception {
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fir.resolve.bindSymbolToLookupTag
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedReferenceError
import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredPropertySymbols
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.types.*
@@ -209,7 +210,7 @@ private fun fillAnnotationArgumentMapping(
) {
if (annotationArguments.isEmpty()) return
val annotationClassSymbol = session.symbolProvider.getClassLikeSymbolByClassId(lookupTag.classId).also {
val annotationClassSymbol = lookupTag.toSymbol(session).also {
lookupTag.bindSymbolToLookupTag(session, it)
}
val annotationConstructor = (annotationClassSymbol?.fir as FirRegularClass?)
@@ -17,10 +17,7 @@ import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMappi
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTagWithFixedSymbol
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
@@ -42,31 +39,26 @@ fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): FirClassLikeSym
if (this is ConeClassLookupTagWithFixedSymbol) {
return this.symbol
}
val firSymbolProvider = useSiteSession.symbolProvider
(this as? ConeClassLikeLookupTagImpl)?.boundSymbol?.takeIf { it.first === useSiteSession }?.let { return it.second }
return firSymbolProvider.getClassLikeSymbolByClassId(classId).also {
return useSiteSession.symbolProvider.getClassLikeSymbolByClassId(classId).also {
(this as? ConeClassLikeLookupTagImpl)?.bindSymbolToLookupTag(useSiteSession, it)
}
}
@OptIn(LookupTagInternals::class)
fun ConeClassLikeLookupTag.toSymbolOrError(useSiteSession: FirSession): FirClassLikeSymbol<*> =
toSymbol(useSiteSession)
?: error("Class symbol with classId $classId was not found")
toSymbol(useSiteSession) ?: error("Class symbol with classId $classId was not found")
@OptIn(LookupTagInternals::class)
fun ConeClassLikeLookupTag.toFirRegularClassSymbol(session: FirSession): FirRegularClassSymbol? =
session.symbolProvider.getSymbolByLookupTag(this) as? FirRegularClassSymbol
toSymbol(session) as? FirRegularClassSymbol
@OptIn(LookupTagInternals::class)
fun ConeClassLikeLookupTagImpl.bindSymbolToLookupTag(session: FirSession, symbol: FirClassLikeSymbol<*>?) {
boundSymbol = WeakPair(session, symbol)
}
@LookupTagInternals
fun ConeClassLikeLookupTag.toFirRegularClass(session: FirSession): FirRegularClass? =
session.symbolProvider.getSymbolByLookupTag(this)?.fir as? FirRegularClass
@SymbolInternals
fun ConeClassLikeLookupTag.toFirRegularClass(session: FirSession): FirRegularClass? = toFirRegularClassSymbol(session)?.fir
fun FirSymbolProvider.getSymbolByLookupTag(lookupTag: ConeClassifierLookupTag): FirClassifierSymbol<*>? {
return lookupTag.toSymbol(session)
@@ -562,10 +562,7 @@ class FirCallCompletionResultsWriterTransformer(
expectedArgumentType.isSomeFunctionType(session) -> expectedArgumentType
// fun interface (a.k.a. SAM), then unwrap it and build a functional type from that interface function
expectedArgumentType is ConeClassLikeType -> {
val firRegularClass =
session.symbolProvider.getClassLikeSymbolByClassId(expectedArgumentType.lookupTag.classId)?.fir as? FirRegularClass
firRegularClass?.let answer@{
expectedArgumentType.lookupTag.toFirRegularClass(session)?.let answer@{ firRegularClass ->
val functionType = samResolver.getFunctionTypeForPossibleSamType(firRegularClass.defaultType())
?: return@answer null
val kind = functionType.functionTypeKind(session) ?: FunctionTypeKind.Function