From 938a43534604890b774d90e049d633a4c756ac22 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 5 Feb 2016 15:08:06 +0300 Subject: [PATCH] Allow to process return statements without parent KtDeclaration (EA-70883) --- .../types/expressions/ControlStructureTypingVisitor.java | 3 ++- idea/testData/checker/codeFragments/startingFromReturn.kt | 4 ++++ .../checker/codeFragments/startingFromReturn.kt.fragment | 1 + idea/testData/checker/recovery/returnInFileAnnotation.kt | 1 + .../jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java | 6 ++++++ .../evaluate/CodeFragmentHighlightingTestGenerated.java | 6 ++++++ 6 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 idea/testData/checker/codeFragments/startingFromReturn.kt create mode 100644 idea/testData/checker/codeFragments/startingFromReturn.kt.fragment create mode 100644 idea/testData/checker/recovery/returnInFileAnnotation.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java index 1be4e42e48f..457913937d3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java @@ -571,8 +571,9 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { parentDeclaration = PsiTreeUtil.getParentOfType(parentDeclaration, KtDeclaration.class); } - assert parentDeclaration != null : "Can't find parent declaration for " + expression.getText(); + // Parent declaration can be null in code fragments or in some bad error expressions DeclarationDescriptor declarationDescriptor = context.trace.get(DECLARATION_TO_DESCRIPTOR, parentDeclaration); + Pair containingFunInfo = BindingContextUtils.getContainingFunctionSkipFunctionLiterals(declarationDescriptor, false); FunctionDescriptor containingFunctionDescriptor = containingFunInfo.getFirst(); diff --git a/idea/testData/checker/codeFragments/startingFromReturn.kt b/idea/testData/checker/codeFragments/startingFromReturn.kt new file mode 100644 index 00000000000..5c8b6447617 --- /dev/null +++ b/idea/testData/checker/codeFragments/startingFromReturn.kt @@ -0,0 +1,4 @@ +fun foo(): Int? { + val a: Int? = 1 + return a +} \ No newline at end of file diff --git a/idea/testData/checker/codeFragments/startingFromReturn.kt.fragment b/idea/testData/checker/codeFragments/startingFromReturn.kt.fragment new file mode 100644 index 00000000000..98dac6b3e8e --- /dev/null +++ b/idea/testData/checker/codeFragments/startingFromReturn.kt.fragment @@ -0,0 +1 @@ +return a \ No newline at end of file diff --git a/idea/testData/checker/recovery/returnInFileAnnotation.kt b/idea/testData/checker/recovery/returnInFileAnnotation.kt new file mode 100644 index 00000000000..d1ab3ebef9f --- /dev/null +++ b/idea/testData/checker/recovery/returnInFileAnnotation.kt @@ -0,0 +1 @@ +@file:suppress(return a) \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java index dae2fe729fa..8e0d091258d 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java @@ -630,6 +630,12 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/recovery/namelessToplevelDeclarations.kt"); doTest(fileName); } + + @TestMetadata("returnInFileAnnotation.kt") + public void testReturnInFileAnnotation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/recovery/returnInFileAnnotation.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/checker/rendering") diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java index 526abbfc1a8..810b378396e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java @@ -151,6 +151,12 @@ public class CodeFragmentHighlightingTestGenerated extends AbstractCodeFragmentH doTest(fileName); } + @TestMetadata("startingFromReturn.kt") + public void testStartingFromReturn() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/codeFragments/startingFromReturn.kt"); + doTest(fileName); + } + @TestMetadata("withoutBodyFunction.kt") public void testWithoutBodyFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/codeFragments/withoutBodyFunction.kt");