[FIR] Fix incorrect usages of getClassLikeSymbolByClassId with lookup tag
^KT-57839 Fixed
This commit is contained in:
committed by
Space Team
parent
b750e1e62c
commit
cfa06dbf74
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Vendored
+26
@@ -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|
|
||||
+15
@@ -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 = {}
|
||||
}
|
||||
}
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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)
|
||||
|
||||
+1
-4
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user