KT-62071 [AA] Do not throw error from `getScopeContextForPosition` when `implicitScope` of receiver value is `null`
`implicitScope` can be `null`
in case when the implicit receiver resides in a user-defined `kotlin.*`
package, but the user have not yet allowed this with compiler argument
directive.
In this case,
we don't want the IDE to crush and show exceptions - the `kotlin`
package would be highlighted by the compiler diagnostics and other
resolve problems, and that would be enough
^KT-62071 Fixed
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/scopeProvider/FirIdeDependentAnalysisSourceModuleScopeContextForPositionTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/scopeProvider/FirIdeDependentAnalysisSourceModuleScopeContextForPositionTestGenerated.java
index 714d2fc..f436bdb 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/scopeProvider/FirIdeDependentAnalysisSourceModuleScopeContextForPositionTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/scopeProvider/FirIdeDependentAnalysisSourceModuleScopeContextForPositionTestGenerated.java
@@ -101,6 +101,12 @@
}
@Test
+ @TestMetadata("notEnabledKotlinPackage.kt")
+ public void testNotEnabledKotlinPackage() throws Exception {
+ runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.kt");
+ }
+
+ @Test
@TestMetadata("simpleScopeContextForPosition.kt")
public void testSimpleScopeContextForPosition() throws Exception {
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/simpleScopeContextForPosition.kt");
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/scopeProvider/FirIdeNormalAnalysisSourceModuleScopeContextForPositionTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/scopeProvider/FirIdeNormalAnalysisSourceModuleScopeContextForPositionTestGenerated.java
index 5d06a3b..a2d2eb3 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/scopeProvider/FirIdeNormalAnalysisSourceModuleScopeContextForPositionTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/scopeProvider/FirIdeNormalAnalysisSourceModuleScopeContextForPositionTestGenerated.java
@@ -101,6 +101,12 @@
}
@Test
+ @TestMetadata("notEnabledKotlinPackage.kt")
+ public void testNotEnabledKotlinPackage() throws Exception {
+ runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.kt");
+ }
+
+ @Test
@TestMetadata("simpleScopeContextForPosition.kt")
public void testSimpleScopeContextForPosition() throws Exception {
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/simpleScopeContextForPosition.kt");
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/scopeProvider/FirStandaloneNormalAnalysisSourceModuleScopeContextForPositionTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/scopeProvider/FirStandaloneNormalAnalysisSourceModuleScopeContextForPositionTestGenerated.java
index 2faad20..4560dc6 100644
--- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/scopeProvider/FirStandaloneNormalAnalysisSourceModuleScopeContextForPositionTestGenerated.java
+++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/scopeProvider/FirStandaloneNormalAnalysisSourceModuleScopeContextForPositionTestGenerated.java
@@ -101,6 +101,12 @@
}
@Test
+ @TestMetadata("notEnabledKotlinPackage.kt")
+ public void testNotEnabledKotlinPackage() throws Exception {
+ runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.kt");
+ }
+
+ @Test
@TestMetadata("simpleScopeContextForPosition.kt")
public void testSimpleScopeContextForPosition() throws Exception {
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/simpleScopeContextForPosition.kt");
diff --git a/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.kt b/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.kt
new file mode 100644
index 0000000..a6074cb
--- /dev/null
+++ b/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.kt
@@ -0,0 +1,9 @@
+// FILE: main.kt
+package kotlin.myPackage
+
+class SomeClass {
+ fun test(param: String) {
+ <expr>param</expr>
+ }
+}
+
diff --git a/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.pretty.txt b/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.pretty.txt
new file mode 100644
index 0000000..2404c30
--- /dev/null
+++ b/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.pretty.txt
@@ -0,0 +1,51 @@
+element: param
+implicit receivers:
+ type: kotlin.myPackage.SomeClass
+ owner symbol: KtFirNamedClassOrObjectSymbol
+
+scopes:
+ LocalScope, index = 0
+ packages: 0
+ classifiers: 0
+ callables: 0
+ constructors: 0
+
+ LocalScope, index = 1
+ packages: 0
+ classifiers: 0
+ callables: 1
+ param: kotlin.String
+ constructors: 0
+
+ TypeScope, index = 2
+ packages: 0
+ classifiers: 0
+ callables: 0
+ constructors: 0
+
+ ExplicitSimpleImportingScope, index = 3
+ packages: 0
+ classifiers: 0
+ callables: 0
+ constructors: 0
+
+ PackageMemberScope, index = 4
+ packages: 0
+ classifiers: 0
+ callables: 0
+ constructors: 0
+
+ DefaultSimpleImportingScope, index = 5
+
+ DefaultSimpleImportingScope, index = 6
+
+ ExplicitStarImportingScope, index = 7
+ packages: 0
+ classifiers: 0
+ callables: 0
+ constructors: 0
+
+ DefaultSimpleImportingScope, index = 8
+
+ DefaultStarImportingScope, index = 9
+
diff --git a/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.txt b/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.txt
new file mode 100644
index 0000000..ebb68f3
--- /dev/null
+++ b/analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.txt
@@ -0,0 +1,72 @@
+element: param
+implicit receivers:
+ type: KtClassErrorType:
+ annotationsList: []
+ type: ERROR_TYPE
+ owner symbol: KtFirNamedClassOrObjectSymbol
+
+scopes:
+ LocalScope, index = 0
+ packages: 0
+ classifiers: 0
+ callables: 0
+ constructors: 0
+
+ LocalScope, index = 1
+ packages: 0
+ classifiers: 0
+ callables: 1
+ KtValueParameterSymbol:
+ annotationsList: []
+ callableIdIfNonLocal: null
+ contextReceivers: []
+ generatedPrimaryConstructorProperty: null
+ hasDefaultValue: false
+ isCrossinline: false
+ isExtension: false
+ isImplicitLambdaParameter: false
+ isNoinline: false
+ isVararg: false
+ name: param
+ origin: SOURCE
+ receiverParameter: null
+ returnType: KtUsualClassType:
+ annotationsList: []
+ ownTypeArguments: []
+ type: kotlin/String
+ symbolKind: LOCAL
+ typeParameters: []
+ constructors: 0
+
+ TypeScope, index = 2
+ packages: 0
+ classifiers: 0
+ callables: 0
+ constructors: 0
+
+ ExplicitSimpleImportingScope, index = 3
+ packages: 0
+ classifiers: 0
+ callables: 0
+ constructors: 0
+
+ PackageMemberScope, index = 4
+ packages: 0
+ classifiers: 0
+ callables: 0
+ constructors: 0
+
+ DefaultSimpleImportingScope, index = 5
+
+ DefaultSimpleImportingScope, index = 6
+
+ ExplicitStarImportingScope, index = 7
+ packages: 0
+ classifiers: 0
+ callables: 0
+ constructors: 0
+
+ DefaultSimpleImportingScope, index = 8
+
+ DefaultStarImportingScope, index = 9
+
diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt
index 1929ba6..fdcff7f 100644
--- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt
+++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt
@@ -282,13 +282,14 @@
private fun ImplicitReceiverValue<*>.getImplicitScope(
processTypeScope: FirTypeScope.(ConeKotlinType) -> FirTypeScope,
): FirScope {
- return when (val type = type.fullyExpandedType(useSiteSession)) {
- is ConeErrorType,
- is ConeStubType -> FirTypeScope.Empty
- else -> implicitScope?.processTypeScope(type) ?: errorWithAttachment("Scope for type ${type::class.simpleName} is null") {
- withConeTypeEntry("type", type)
- }
- }
+ // N.B.: implicitScope == null when the type sits in a user-defined 'kotlin' package,
+ // but there is no '-Xallow-kotlin-package' compiler argument provided
+ val implicitScope = implicitScope ?: return FirTypeScope.Empty
+
+ val type = type.fullyExpandedType(useSiteSession)
+ if (type is ConeErrorType || type is ConeStubType) return FirTypeScope.Empty
+
+ return implicitScope.processTypeScope(type)
}
}