Completion and highlighting for blockCodeFragment
This commit is contained in:
@@ -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>
|
||||
+14
-4
@@ -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)
|
||||
|
||||
+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);
|
||||
}
|
||||
|
||||
@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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user