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");
|
||||
}
|
||||
|
||||
@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 {
|
||||
|
||||
+6
@@ -100,6 +100,12 @@ public class FirIdeNormalAnalysisSourceModuleScopeContextForPositionTestGenerate
|
||||
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
|
||||
@TestMetadata("simpleScopeContextForPosition.kt")
|
||||
public void testSimpleScopeContextForPosition() throws Exception {
|
||||
|
||||
+6
@@ -100,6 +100,12 @@ public class FirStandaloneNormalAnalysisSourceModuleScopeContextForPositionTestG
|
||||
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
|
||||
@TestMetadata("simpleScopeContextForPosition.kt")
|
||||
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(
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user