From d70770afb2de65f24569769f8908b6b72a55afb6 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Wed, 14 May 2014 13:31:42 +0400 Subject: [PATCH] Completion and highlighting for blockCodeFragment --- .../plugin/project/ResolveElementCache.java | 18 ++++++++++++------ .../checker/codeFragments/blockCodeFragment.kt | 4 ++++ .../blockCodeFragment.kt.fragment | 2 ++ .../basic/codeFragments/blockCodeFragment.kt | 7 +++++++ .../blockCodeFragment.kt.fragment | 2 ++ .../AbstractEditorForEvaluateExpressionTest.kt | 18 ++++++++++++++---- .../CodeFragmentCompletionTestGenerated.java | 5 +++++ .../CodeFragmentHighlightingTestGenerated.java | 5 +++++ 8 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 idea/testData/checker/codeFragments/blockCodeFragment.kt create mode 100644 idea/testData/checker/codeFragments/blockCodeFragment.kt.fragment create mode 100644 idea/testData/completion/basic/codeFragments/blockCodeFragment.kt create mode 100644 idea/testData/completion/basic/codeFragments/blockCodeFragment.kt.fragment diff --git a/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java b/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java index d408d9166da..2b017188799 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java +++ b/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java @@ -96,7 +96,7 @@ public class ResolveElementCache { JetTypeParameter.class, JetTypeConstraint.class, JetPackageDirective.class, - JetExpressionCodeFragment.class); + JetCodeFragment.class); if (elementOfAdditionalResolve != null && !(elementOfAdditionalResolve instanceof JetParameter)) { if (elementOfAdditionalResolve instanceof JetPackageDirective) { @@ -163,8 +163,8 @@ public class ResolveElementCache { else if (resolveElement instanceof JetTypeConstraint) { typeConstraintAdditionalResolve(resolveSession, (JetTypeConstraint) resolveElement); } - else if (resolveElement instanceof JetExpressionCodeFragment) { - codeFragmentAdditionalResolve(resolveSession, (JetExpressionCodeFragment) resolveElement, trace); + else if (resolveElement instanceof JetCodeFragment) { + codeFragmentAdditionalResolve(resolveSession, (JetCodeFragment) resolveElement, trace); } else if (PsiTreeUtil.getParentOfType(resolveElement, JetPackageDirective.class) != null) { packageRefAdditionalResolve(resolveSession, trace, resolveElement); @@ -215,10 +215,16 @@ public class ResolveElementCache { private void codeFragmentAdditionalResolve( ResolveSession resolveSession, - JetExpressionCodeFragment codeFragment, + JetCodeFragment codeFragment, BindingTrace trace ) { - JetExpression codeFragmentExpression = codeFragment.getExpression(); + JetExpression codeFragmentExpression = null; + if (codeFragment instanceof JetExpressionCodeFragment) { + codeFragmentExpression = ((JetExpressionCodeFragment) codeFragment).getExpression(); + } + else if (codeFragment instanceof JetBlockCodeFragment) { + codeFragmentExpression = ((JetBlockCodeFragment) codeFragment).getBlock(); + } if (codeFragmentExpression == null) return; PsiElement contextElement = codeFragment.getContext(); @@ -239,7 +245,7 @@ public class ResolveElementCache { DataFlowInfo dataFlowInfoForContextElement = contextForElement.get(BindingContext.EXPRESSION_DATA_FLOW_INFO, contextExpression); AnalyzerPackage.computeTypeInContext( - codeFragment.getExpression(), + codeFragmentExpression, chainedScope, trace, dataFlowInfoForContextElement == null ? DataFlowInfo.EMPTY : dataFlowInfoForContextElement, diff --git a/idea/testData/checker/codeFragments/blockCodeFragment.kt b/idea/testData/checker/codeFragments/blockCodeFragment.kt new file mode 100644 index 00000000000..05708572399 --- /dev/null +++ b/idea/testData/checker/codeFragments/blockCodeFragment.kt @@ -0,0 +1,4 @@ +fun foo() { + val a = 1 + a +} \ No newline at end of file diff --git a/idea/testData/checker/codeFragments/blockCodeFragment.kt.fragment b/idea/testData/checker/codeFragments/blockCodeFragment.kt.fragment new file mode 100644 index 00000000000..749e313fdf3 --- /dev/null +++ b/idea/testData/checker/codeFragments/blockCodeFragment.kt.fragment @@ -0,0 +1,2 @@ +val b = 1 +a + b + c \ No newline at end of file diff --git a/idea/testData/completion/basic/codeFragments/blockCodeFragment.kt b/idea/testData/completion/basic/codeFragments/blockCodeFragment.kt new file mode 100644 index 00000000000..cc11acb7e27 --- /dev/null +++ b/idea/testData/completion/basic/codeFragments/blockCodeFragment.kt @@ -0,0 +1,7 @@ +fun foo() { + val aaabbbccc = 1 + aaabbbccc +} + +// INVOCATION_COUNT: 1 +// EXIST: aaabbbccc, aaabbcc \ No newline at end of file diff --git a/idea/testData/completion/basic/codeFragments/blockCodeFragment.kt.fragment b/idea/testData/completion/basic/codeFragments/blockCodeFragment.kt.fragment new file mode 100644 index 00000000000..2c8d38d593e --- /dev/null +++ b/idea/testData/completion/basic/codeFragments/blockCodeFragment.kt.fragment @@ -0,0 +1,2 @@ +val aaabbcc = 1 +aaabb \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/AbstractEditorForEvaluateExpressionTest.kt b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/AbstractEditorForEvaluateExpressionTest.kt index 318e787dc91..f14e9613ad4 100644 --- a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/AbstractEditorForEvaluateExpressionTest.kt +++ b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/AbstractEditorForEvaluateExpressionTest.kt @@ -29,6 +29,8 @@ import org.jetbrains.jet.lang.psi.JetFile import com.intellij.openapi.application.ApplicationManager import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.InTextDirectivesUtils +import com.intellij.debugger.engine.evaluation.CodeFragmentKind +import org.jetbrains.jet.lang.psi.JetCodeFragment abstract class AbstractCodeFragmentHighlightingTest : AbstractJetPsiCheckerTest() { override fun doTest(filePath: String) { @@ -60,14 +62,22 @@ private fun JavaCodeInsightTestFixture.configureByCodeFragment(filePath: String) configureByFile(filePath) val elementAt = getFile()?.findElementAt(getCaretOffset()) - val file = createExpressionCodeFragment(filePath, elementAt!!) + val file = createCodeFragment(filePath, elementAt!!) configureFromExistingVirtualFile(file.getVirtualFile()) } -private fun createExpressionCodeFragment(filePath: String, contextElement: PsiElement): JetExpressionCodeFragment { - val codeFragmentText = FileUtil.loadFile(File(filePath + ".fragment"), true).trim() - return JetPsiFactory.createExpressionCodeFragment( +private fun createCodeFragment(filePath: String, contextElement: PsiElement): JetCodeFragment { + val fileForFragment = File(filePath + ".fragment") + val codeFragmentText = FileUtil.loadFile(fileForFragment, true).trim() + if (fileForFragment.readLines().size == 1) { + return JetPsiFactory.createExpressionCodeFragment( + contextElement.getProject(), + codeFragmentText, + KotlinCodeFragmentFactory.getContextElement(contextElement) + ) + } + return JetPsiFactory.createBlockCodeFragment( contextElement.getProject(), codeFragmentText, KotlinCodeFragmentFactory.getContextElement(contextElement) diff --git a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentCompletionTestGenerated.java index bfbaa811529..a9240619fb1 100644 --- a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentCompletionTestGenerated.java @@ -36,6 +36,11 @@ public class CodeFragmentCompletionTestGenerated extends AbstractCodeFragmentCom JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/completion/basic/codeFragments"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("blockCodeFragment.kt") + public void testBlockCodeFragment() throws Exception { + doTest("idea/testData/completion/basic/codeFragments/blockCodeFragment.kt"); + } + @TestMetadata("localVal.kt") public void testLocalVal() throws Exception { doTest("idea/testData/completion/basic/codeFragments/localVal.kt"); diff --git a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java index 403366ca4d2..e3902ae493f 100644 --- a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java @@ -43,6 +43,11 @@ public class CodeFragmentHighlightingTestGenerated extends AbstractCodeFragmentH doTest("idea/testData/checker/codeFragments/binaryExpression.kt"); } + @TestMetadata("blockCodeFragment.kt") + public void testBlockCodeFragment() throws Exception { + doTest("idea/testData/checker/codeFragments/blockCodeFragment.kt"); + } + @TestMetadata("callExpression.kt") public void testCallExpression() throws Exception { doTest("idea/testData/checker/codeFragments/callExpression.kt");