[FIR] Don't throw in FirIntegerConstantOperatorScope in restricted analysis mode #KT-76396 Fixed
diff --git a/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerConstantOperator.kt b/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerConstantOperator.kt new file mode 100644 index 0000000..b342e49 --- /dev/null +++ b/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerConstantOperator.kt
@@ -0,0 +1,3 @@ +fun f<caret>oo(x: Int) { + 1 * x +} \ No newline at end of file
diff --git a/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerConstantOperator.txt b/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerConstantOperator.txt new file mode 100644 index 0000000..5d5bd1a --- /dev/null +++ b/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerConstantOperator.txt
@@ -0,0 +1,59 @@ +RAW_FIR: +FILE: [ResolvedTo(RAW_FIR)] integerConstantOperator.kt + public? final? [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] x: Int): R|kotlin/Unit| { LAZY_BLOCK } + +IMPORTS: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public? final? [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] x: Int): R|kotlin/Unit| { LAZY_BLOCK } + +COMPILER_REQUIRED_ANNOTATIONS: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public? final? [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] fun foo([ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] x: Int): R|kotlin/Unit| { LAZY_BLOCK } + +COMPANION_GENERATION: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public? final? [ResolvedTo(COMPANION_GENERATION)] fun foo([ResolvedTo(COMPANION_GENERATION)] x: Int): R|kotlin/Unit| { LAZY_BLOCK } + +SUPER_TYPES: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public? final? [ResolvedTo(SUPER_TYPES)] fun foo([ResolvedTo(SUPER_TYPES)] x: Int): R|kotlin/Unit| { LAZY_BLOCK } + +TYPES: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public? final? [ResolvedTo(TYPES)] fun foo([ResolvedTo(TYPES)] x: <ERROR TYPE REF: Symbol not found for Int>): R|kotlin/Unit| { LAZY_BLOCK } + +STATUS: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public final [ResolvedTo(STATUS)] fun foo([ResolvedTo(STATUS)] x: <ERROR TYPE REF: Symbol not found for Int>): R|kotlin/Unit| { LAZY_BLOCK } + +EXPECT_ACTUAL_MATCHING: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public final [ResolvedTo(EXPECT_ACTUAL_MATCHING)] fun foo([ResolvedTo(EXPECT_ACTUAL_MATCHING)] x: <ERROR TYPE REF: Symbol not found for Int>): R|kotlin/Unit| { LAZY_BLOCK } + +CONTRACTS: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public final [ResolvedTo(CONTRACTS)] fun foo([ResolvedTo(CONTRACTS)] x: <ERROR TYPE REF: Symbol not found for Int>): R|kotlin/Unit| { LAZY_BLOCK } + +IMPLICIT_TYPES_BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public final [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] fun foo([ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] x: <ERROR TYPE REF: Symbol not found for Int>): R|kotlin/Unit| { LAZY_BLOCK } + +CONSTANT_EVALUATION: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public final [ResolvedTo(CONSTANT_EVALUATION)] fun foo([ResolvedTo(CONSTANT_EVALUATION)] x: <ERROR TYPE REF: Symbol not found for Int>): R|kotlin/Unit| { LAZY_BLOCK } + +ANNOTATION_ARGUMENTS: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public final [ResolvedTo(ANNOTATION_ARGUMENTS)] fun foo([ResolvedTo(ANNOTATION_ARGUMENTS)] x: <ERROR TYPE REF: Symbol not found for Int>): R|kotlin/Unit| { LAZY_BLOCK } + +BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] integerConstantOperator.kt + public final [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: <ERROR TYPE REF: Symbol not found for Int>): R|kotlin/Unit| { + IntegerLiteral(1).<Unresolved name: times (*)>#(R|<local>/x|) + } + +FILE RAW TO BODY: +FILE: [ResolvedTo(BODY_RESOLVE)] integerConstantOperator.kt + public final [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: <ERROR TYPE REF: Symbol not found for Int>): R|kotlin/Unit| { + IntegerLiteral(1).<Unresolved name: times (*)>#(R|<local>/x|) + }
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java index 42ab88f..1a5d809 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java
@@ -1598,6 +1598,12 @@ } @Test + @TestMetadata("integerConstantOperator.kt") + public void testIntegerConstantOperator() { + runTest("analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerConstantOperator.kt"); + } + + @Test @TestMetadata("integerLiteralCall.kt") public void testIntegerLiteralCall() { runTest("analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerLiteralCall.kt");
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java index 5873ed3..9191020 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java
@@ -1598,6 +1598,12 @@ } @Test + @TestMetadata("integerConstantOperator.kt") + public void testIntegerConstantOperator() { + runTest("analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerConstantOperator.kt"); + } + + @Test @TestMetadata("integerLiteralCall.kt") public void testIntegerLiteralCall() { runTest("analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerLiteralCall.kt");
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerConstantOperatorScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerConstantOperatorScope.kt index 6277176..fa14a72 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerConstantOperatorScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerConstantOperatorScope.kt
@@ -45,7 +45,7 @@ ) ?: Empty } - private val mappedFunctions = mutableMapOf<Name, FirNamedFunctionSymbol>() + private val mappedFunctions = mutableMapOf<Name, FirNamedFunctionSymbol?>() override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) { // Constant conversion for those unary operators works only for signed integers @@ -57,9 +57,9 @@ val requiresUnsignedOperand = isUnsigned && name !in binaryOperatorsWithSignedArgument val wrappedSymbol = mappedFunctions.getOrPut(name) { val allFunctions = baseScope.getFunctions(name) - val functionSymbol = allFunctions.first { + val functionSymbol = allFunctions.firstOrNull { // unary operators have only one overload - if (isUnaryOperator) return@first true + if (isUnaryOperator) return@firstOrNull true val coneType = it.fir.valueParameters.first().returnTypeRef.coneType if (requiresUnsignedOperand) { @@ -68,9 +68,9 @@ coneType.isInt } } - wrapIntOperator(functionSymbol) + functionSymbol?.let { wrapIntOperator(it) } } - processor(wrappedSymbol) + wrappedSymbol?.let { processor(it) } baseScope.processFunctionsByName(name, processor) }