Completion and highlighting for blockCodeFragment
This commit is contained in:
@@ -96,7 +96,7 @@ public class ResolveElementCache {
|
|||||||
JetTypeParameter.class,
|
JetTypeParameter.class,
|
||||||
JetTypeConstraint.class,
|
JetTypeConstraint.class,
|
||||||
JetPackageDirective.class,
|
JetPackageDirective.class,
|
||||||
JetExpressionCodeFragment.class);
|
JetCodeFragment.class);
|
||||||
|
|
||||||
if (elementOfAdditionalResolve != null && !(elementOfAdditionalResolve instanceof JetParameter)) {
|
if (elementOfAdditionalResolve != null && !(elementOfAdditionalResolve instanceof JetParameter)) {
|
||||||
if (elementOfAdditionalResolve instanceof JetPackageDirective) {
|
if (elementOfAdditionalResolve instanceof JetPackageDirective) {
|
||||||
@@ -163,8 +163,8 @@ public class ResolveElementCache {
|
|||||||
else if (resolveElement instanceof JetTypeConstraint) {
|
else if (resolveElement instanceof JetTypeConstraint) {
|
||||||
typeConstraintAdditionalResolve(resolveSession, (JetTypeConstraint) resolveElement);
|
typeConstraintAdditionalResolve(resolveSession, (JetTypeConstraint) resolveElement);
|
||||||
}
|
}
|
||||||
else if (resolveElement instanceof JetExpressionCodeFragment) {
|
else if (resolveElement instanceof JetCodeFragment) {
|
||||||
codeFragmentAdditionalResolve(resolveSession, (JetExpressionCodeFragment) resolveElement, trace);
|
codeFragmentAdditionalResolve(resolveSession, (JetCodeFragment) resolveElement, trace);
|
||||||
}
|
}
|
||||||
else if (PsiTreeUtil.getParentOfType(resolveElement, JetPackageDirective.class) != null) {
|
else if (PsiTreeUtil.getParentOfType(resolveElement, JetPackageDirective.class) != null) {
|
||||||
packageRefAdditionalResolve(resolveSession, trace, resolveElement);
|
packageRefAdditionalResolve(resolveSession, trace, resolveElement);
|
||||||
@@ -215,10 +215,16 @@ public class ResolveElementCache {
|
|||||||
|
|
||||||
private void codeFragmentAdditionalResolve(
|
private void codeFragmentAdditionalResolve(
|
||||||
ResolveSession resolveSession,
|
ResolveSession resolveSession,
|
||||||
JetExpressionCodeFragment codeFragment,
|
JetCodeFragment codeFragment,
|
||||||
BindingTrace trace
|
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;
|
if (codeFragmentExpression == null) return;
|
||||||
|
|
||||||
PsiElement contextElement = codeFragment.getContext();
|
PsiElement contextElement = codeFragment.getContext();
|
||||||
@@ -239,7 +245,7 @@ public class ResolveElementCache {
|
|||||||
|
|
||||||
DataFlowInfo dataFlowInfoForContextElement = contextForElement.get(BindingContext.EXPRESSION_DATA_FLOW_INFO, contextExpression);
|
DataFlowInfo dataFlowInfoForContextElement = contextForElement.get(BindingContext.EXPRESSION_DATA_FLOW_INFO, contextExpression);
|
||||||
AnalyzerPackage.computeTypeInContext(
|
AnalyzerPackage.computeTypeInContext(
|
||||||
codeFragment.getExpression(),
|
codeFragmentExpression,
|
||||||
chainedScope,
|
chainedScope,
|
||||||
trace,
|
trace,
|
||||||
dataFlowInfoForContextElement == null ? DataFlowInfo.EMPTY : dataFlowInfoForContextElement,
|
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>
|
||||||
+14
-4
@@ -29,6 +29,8 @@ import org.jetbrains.jet.lang.psi.JetFile
|
|||||||
import com.intellij.openapi.application.ApplicationManager
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName
|
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||||
import org.jetbrains.jet.InTextDirectivesUtils
|
import org.jetbrains.jet.InTextDirectivesUtils
|
||||||
|
import com.intellij.debugger.engine.evaluation.CodeFragmentKind
|
||||||
|
import org.jetbrains.jet.lang.psi.JetCodeFragment
|
||||||
|
|
||||||
abstract class AbstractCodeFragmentHighlightingTest : AbstractJetPsiCheckerTest() {
|
abstract class AbstractCodeFragmentHighlightingTest : AbstractJetPsiCheckerTest() {
|
||||||
override fun doTest(filePath: String) {
|
override fun doTest(filePath: String) {
|
||||||
@@ -60,14 +62,22 @@ private fun JavaCodeInsightTestFixture.configureByCodeFragment(filePath: String)
|
|||||||
configureByFile(filePath)
|
configureByFile(filePath)
|
||||||
|
|
||||||
val elementAt = getFile()?.findElementAt(getCaretOffset())
|
val elementAt = getFile()?.findElementAt(getCaretOffset())
|
||||||
val file = createExpressionCodeFragment(filePath, elementAt!!)
|
val file = createCodeFragment(filePath, elementAt!!)
|
||||||
|
|
||||||
configureFromExistingVirtualFile(file.getVirtualFile())
|
configureFromExistingVirtualFile(file.getVirtualFile())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createExpressionCodeFragment(filePath: String, contextElement: PsiElement): JetExpressionCodeFragment {
|
private fun createCodeFragment(filePath: String, contextElement: PsiElement): JetCodeFragment {
|
||||||
val codeFragmentText = FileUtil.loadFile(File(filePath + ".fragment"), true).trim()
|
val fileForFragment = File(filePath + ".fragment")
|
||||||
return JetPsiFactory.createExpressionCodeFragment(
|
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(),
|
contextElement.getProject(),
|
||||||
codeFragmentText,
|
codeFragmentText,
|
||||||
KotlinCodeFragmentFactory.getContextElement(contextElement)
|
KotlinCodeFragmentFactory.getContextElement(contextElement)
|
||||||
|
|||||||
+5
@@ -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);
|
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")
|
@TestMetadata("localVal.kt")
|
||||||
public void testLocalVal() throws Exception {
|
public void testLocalVal() throws Exception {
|
||||||
doTest("idea/testData/completion/basic/codeFragments/localVal.kt");
|
doTest("idea/testData/completion/basic/codeFragments/localVal.kt");
|
||||||
|
|||||||
+5
@@ -43,6 +43,11 @@ public class CodeFragmentHighlightingTestGenerated extends AbstractCodeFragmentH
|
|||||||
doTest("idea/testData/checker/codeFragments/binaryExpression.kt");
|
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")
|
@TestMetadata("callExpression.kt")
|
||||||
public void testCallExpression() throws Exception {
|
public void testCallExpression() throws Exception {
|
||||||
doTest("idea/testData/checker/codeFragments/callExpression.kt");
|
doTest("idea/testData/checker/codeFragments/callExpression.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user