FIR IDE: Fix searching for the closest function to re-resolve

If the function is local, there would be errors related to its
unresolved body and receiver type
This commit is contained in:
Roman Golyshev
2021-02-15 17:56:13 +03:00
parent 1d64c0789f
commit f641466f70
6 changed files with 56 additions and 1 deletions
@@ -0,0 +1,17 @@
// FIR_COMPARISON
val topLevelVal = ""
fun topLevel(topLevelArg: String) {
val inTopLevelVal = 10
fun local(localArg: String) {
val inLocalVal = 20
<caret>
}
}
// EXIST: topLevelVal
// EXIST: topLevelArg
// EXIST: inTopLevelVal
// EXIST: localArg
// EXIST: inLocalVal
@@ -0,0 +1,8 @@
// FIR_COMPARISON
val topLevelVal = ""
val otherVal: () -> Unit = {
val foo = <caret>
}
// EXIST: topLevelVal
@@ -2273,6 +2273,16 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/classFieldsAndFunctionsFromInnerClassExplicitReceiver.kt");
}
@TestMetadata("completionInLocalFunction.kt")
public void testCompletionInLocalFunction() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/completionInLocalFunction.kt");
}
@TestMetadata("completionInPropertyLambdaInitializer.kt")
public void testCompletionInPropertyLambdaInitializer() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/completionInPropertyLambdaInitializer.kt");
}
@TestMetadata("defaultKotlinImports.kt")
public void testDefaultKotlinImports() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/defaultKotlinImports.kt");
@@ -2273,6 +2273,16 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/classFieldsAndFunctionsFromInnerClassExplicitReceiver.kt");
}
@TestMetadata("completionInLocalFunction.kt")
public void testCompletionInLocalFunction() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/completionInLocalFunction.kt");
}
@TestMetadata("completionInPropertyLambdaInitializer.kt")
public void testCompletionInPropertyLambdaInitializer() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/completionInPropertyLambdaInitializer.kt");
}
@TestMetadata("defaultKotlinImports.kt")
public void testDefaultKotlinImports() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/defaultKotlinImports.kt");
@@ -2273,6 +2273,16 @@ public class HighLevelJvmBasicCompletionTestGenerated extends AbstractHighLevelJ
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/classFieldsAndFunctionsFromInnerClassExplicitReceiver.kt");
}
@TestMetadata("completionInLocalFunction.kt")
public void testCompletionInLocalFunction() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/completionInLocalFunction.kt");
}
@TestMetadata("completionInPropertyLambdaInitializer.kt")
public void testCompletionInPropertyLambdaInitializer() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/completionInPropertyLambdaInitializer.kt");
}
@TestMetadata("defaultKotlinImports.kt")
public void testDefaultKotlinImports() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/defaultKotlinImports.kt");
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
internal sealed class EnclosingDeclarationContext {
companion object {
fun detect(originalFile: KtFile, positionInFakeFile: KtElement): EnclosingDeclarationContext {
val fakeFunction = positionInFakeFile.getNonStrictParentOfType<KtNamedFunction>()
val fakeFunction = positionInFakeFile.parentsOfType<KtNamedFunction>().firstOrNull { !it.isLocal }
if (fakeFunction != null) {
val originalFunction = originalFile.findDeclarationOfTypeAt<KtNamedFunction>(fakeFunction.textOffset)
?: error("Cannot find original function matching to ${fakeFunction.getElementTextInContext()} in $originalFile")