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
This commit is contained in:
+6
@@ -100,6 +100,12 @@ public class FirIdeDependentAnalysisSourceModuleScopeContextForPositionTestGener
|
|||||||
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/localTypeScope.kt");
|
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/localTypeScope.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("notEnabledKotlinPackage.kt")
|
||||||
|
public void testNotEnabledKotlinPackage() throws Exception {
|
||||||
|
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("simpleScopeContextForPosition.kt")
|
@TestMetadata("simpleScopeContextForPosition.kt")
|
||||||
public void testSimpleScopeContextForPosition() throws Exception {
|
public void testSimpleScopeContextForPosition() throws Exception {
|
||||||
|
|||||||
+6
@@ -100,6 +100,12 @@ public class FirIdeNormalAnalysisSourceModuleScopeContextForPositionTestGenerate
|
|||||||
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/localTypeScope.kt");
|
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/localTypeScope.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("notEnabledKotlinPackage.kt")
|
||||||
|
public void testNotEnabledKotlinPackage() throws Exception {
|
||||||
|
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("simpleScopeContextForPosition.kt")
|
@TestMetadata("simpleScopeContextForPosition.kt")
|
||||||
public void testSimpleScopeContextForPosition() throws Exception {
|
public void testSimpleScopeContextForPosition() throws Exception {
|
||||||
|
|||||||
+6
@@ -100,6 +100,12 @@ public class FirStandaloneNormalAnalysisSourceModuleScopeContextForPositionTestG
|
|||||||
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/localTypeScope.kt");
|
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/localTypeScope.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("notEnabledKotlinPackage.kt")
|
||||||
|
public void testNotEnabledKotlinPackage() throws Exception {
|
||||||
|
runTest("analysis/analysis-api/testData/components/scopeProvider/scopeContextForPosition/notEnabledKotlinPackage.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("simpleScopeContextForPosition.kt")
|
@TestMetadata("simpleScopeContextForPosition.kt")
|
||||||
public void testSimpleScopeContextForPosition() throws Exception {
|
public void testSimpleScopeContextForPosition() throws Exception {
|
||||||
|
|||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
// FILE: main.kt
|
||||||
|
package kotlin.myPackage
|
||||||
|
|
||||||
|
class SomeClass {
|
||||||
|
fun test(param: String) {
|
||||||
|
<expr>param</expr>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+51
@@ -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
|
||||||
|
|
||||||
+72
@@ -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
|
||||||
|
|
||||||
+8
-7
@@ -282,13 +282,14 @@ class FirTowerDataElement(
|
|||||||
private fun ImplicitReceiverValue<*>.getImplicitScope(
|
private fun ImplicitReceiverValue<*>.getImplicitScope(
|
||||||
processTypeScope: FirTypeScope.(ConeKotlinType) -> FirTypeScope,
|
processTypeScope: FirTypeScope.(ConeKotlinType) -> FirTypeScope,
|
||||||
): FirScope {
|
): FirScope {
|
||||||
return when (val type = type.fullyExpandedType(useSiteSession)) {
|
// N.B.: implicitScope == null when the type sits in a user-defined 'kotlin' package,
|
||||||
is ConeErrorType,
|
// but there is no '-Xallow-kotlin-package' compiler argument provided
|
||||||
is ConeStubType -> FirTypeScope.Empty
|
val implicitScope = implicitScope ?: return FirTypeScope.Empty
|
||||||
else -> implicitScope?.processTypeScope(type) ?: errorWithAttachment("Scope for type ${type::class.simpleName} is null") {
|
|
||||||
withConeTypeEntry("type", type)
|
val type = type.fullyExpandedType(useSiteSession)
|
||||||
}
|
if (type is ConeErrorType || type is ConeStubType) return FirTypeScope.Empty
|
||||||
}
|
|
||||||
|
return implicitScope.processTypeScope(type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user