Completion and highlighting for blockCodeFragment

This commit is contained in:
Natalia Ukhorskaya
2014-05-14 13:31:42 +04:00
parent 511d270032
commit d70770afb2
8 changed files with 51 additions and 10 deletions
@@ -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,
@@ -0,0 +1,4 @@
fun foo() {
val a = 1
<caret>a
}
@@ -0,0 +1,2 @@
val b = 1
a + b + <error>c</error>
@@ -0,0 +1,7 @@
fun foo() {
val aaabbbccc = 1
aaa<caret>bbbccc
}
// INVOCATION_COUNT: 1
// EXIST: aaabbbccc, aaabbcc
@@ -0,0 +1,2 @@
val aaabbcc = 1
aaabb<caret>
@@ -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)
@@ -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");
@@ -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");