diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java index f44b8273499..534d688b779 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -664,6 +664,12 @@ public class Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated extends A runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/memberFunctionCallWithTypeArgument.kt"); } + @Test + @TestMetadata("noBuiltIns.kt") + public void testNoBuiltIns() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.kt"); + } + @Test @TestMetadata("postfixUnaryOperatorOnVar.kt") public void testPostfixUnaryOperatorOnVar() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt index fd2c105e440..45d73b5a51e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt @@ -79,14 +79,15 @@ internal class KtFirCallResolver( override val analysisSession: KtFirAnalysisSession, override val token: KtLifetimeToken, ) : AbstractKtCallResolver(), KtFirAnalysisSessionComponent { - private val equalsSymbolInAny: FirNamedFunctionSymbol by lazy(LazyThreadSafetyMode.PUBLICATION) { + private val equalsSymbolInAny: FirNamedFunctionSymbol? by lazy(LazyThreadSafetyMode.PUBLICATION) { val session = analysisSession.useSiteSession + val anyFirClass = session.builtinTypes.anyType.toRegularClassSymbol(session) ?: return@lazy null val scope = session.declaredMemberScope( - session.builtinTypes.anyType.toRegularClassSymbol(session)!!, + anyFirClass, memberRequiredPhase = FirResolvePhase.STATUS, ) - lateinit var result: FirNamedFunctionSymbol + var result: FirNamedFunctionSymbol? = null scope.processFunctionsByName(EQUALS) { result = it } @@ -1217,13 +1218,12 @@ internal class KtFirCallResolver( val rightPsi = binaryExpression.right ?: return null return when (operation) { FirOperation.EQ, FirOperation.NOT_EQ -> { - val equalsSymbolInAny = equalsSymbolInAny val leftOperand = arguments.firstOrNull() ?: return null val session = analysisSession.useSiteSession val leftOperandType = leftOperand.resolvedType val classSymbol = leftOperandType.fullyExpandedType(session).toSymbol(session) as? FirClassSymbol<*> - val equalsSymbol = classSymbol?.getEqualsSymbol(equalsSymbolInAny) ?: equalsSymbolInAny + val equalsSymbol = classSymbol?.getEqualsSymbol() ?: equalsSymbolInAny ?: return null val ktSignature = equalsSymbol.toKtSignature() KtSuccessCallInfo( KtSimpleFunctionCall( @@ -1244,7 +1244,7 @@ internal class KtFirCallResolver( } } - private fun FirClassSymbol<*>.getEqualsSymbol(equalsSymbolInAny: FirNamedFunctionSymbol): FirNamedFunctionSymbol { + private fun FirClassSymbol<*>.getEqualsSymbol(): FirNamedFunctionSymbol? { val scope = unsubstitutedScope( analysisSession.useSiteSession, analysisSession.getScopeSessionFor(analysisSession.useSiteSession), diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java index 152eba7f3e0..1199816449e 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -664,6 +664,12 @@ public class FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated extends Ab runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/memberFunctionCallWithTypeArgument.kt"); } + @Test + @TestMetadata("noBuiltIns.kt") + public void testNoBuiltIns() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.kt"); + } + @Test @TestMetadata("postfixUnaryOperatorOnVar.kt") public void testPostfixUnaryOperatorOnVar() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java index 6f8ff06e269..393a242ffca 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -664,6 +664,12 @@ public class FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated ext runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/memberFunctionCallWithTypeArgument.kt"); } + @Test + @TestMetadata("noBuiltIns.kt") + public void testNoBuiltIns() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.kt"); + } + @Test @TestMetadata("postfixUnaryOperatorOnVar.kt") public void testPostfixUnaryOperatorOnVar() throws Exception { diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.descriptors.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.descriptors.txt new file mode 100644 index 00000000000..02deae94677 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.descriptors.txt @@ -0,0 +1,31 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = 1 + isSafeNavigation = false + type = kotlin.Int + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Boolean + symbol = kotlin/Int.equals(: kotlin.Int, other: kotlin.Any?): kotlin.Boolean + valueParameters = [ + KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Any? + symbol = other: kotlin.Any? + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = kotlin/Int.equals + typeArgumentsMapping = {} + argumentMapping = { + 2 -> (KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Any? + symbol = other: kotlin.Any? + callableIdIfNonLocal = null) + } \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.kt new file mode 100644 index 00000000000..f6c1e772ca8 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.kt @@ -0,0 +1,5 @@ +// NO_RUNTIME + +fun call() { + 1 == 2 +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.standalone.fir.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.standalone.fir.txt new file mode 100644 index 00000000000..02deae94677 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.standalone.fir.txt @@ -0,0 +1,31 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = 1 + isSafeNavigation = false + type = kotlin.Int + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Boolean + symbol = kotlin/Int.equals(: kotlin.Int, other: kotlin.Any?): kotlin.Boolean + valueParameters = [ + KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Any? + symbol = other: kotlin.Any? + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = kotlin/Int.equals + typeArgumentsMapping = {} + argumentMapping = { + 2 -> (KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Any? + symbol = other: kotlin.Any? + callableIdIfNonLocal = null) + } \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.txt new file mode 100644 index 00000000000..ec747fa47dd --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/noBuiltIns.txt @@ -0,0 +1 @@ +null \ No newline at end of file