diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy index 05b264e1cb68..0c5c0a175493 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy @@ -267,7 +267,7 @@ public class LiveTemplateTest extends LightCodeInsightFixtureTestCase { @Override protected void invokeTestRunnable(final Runnable runnable) throws Exception { - if ("testNavigationActionsDontTerminateTemplate".equals(getName()) || "testTemplateWithEnd".equals(getName())) { + if (name in ["testNavigationActionsDontTerminateTemplate", "testTemplateWithEnd", "testDisappearingVar"]) { runnable.run(); return; } @@ -375,4 +375,23 @@ public class LiveTemplateTest extends LightCodeInsightFixtureTestCase { } } + public void testUseDefaultValueForQuickResultCalculation() { + myFixture.configureByText 'a.txt', '' + + final TemplateManager manager = TemplateManager.getInstance(getProject()); + final Template template = manager.createTemplate("vn", "user", '$V1$ var = $V2$;'); + template.addVariable("V1", "", "", true); + template.addVariable("V2", "", '"239"', true); + + writeCommand { manager.startTemplate(editor, template) } + + myFixture.checkResult ' var = 239;' + + myFixture.type 'O' + myFixture.checkResult 'O var = 239;' + + myFixture.type '\t' + myFixture.checkResult 'O var = 239;' + } + } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java index 0b3b7e6e3366..80e4f965faa1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java @@ -651,33 +651,20 @@ public class TemplateState implements Disposable { String oldValue = getExpressionString(segmentNumber); int start = mySegments.getSegmentStart(segmentNumber); int end = mySegments.getSegmentEnd(segmentNumber); - ExpressionContext context = createExpressionContext(start); - Result result; - if (isQuick) { - result = expressionNode.calculateQuickResult(context); - } - else { - result = expressionNode.calculateResult(context); - if (expressionNode instanceof ConstantNode) { - if (result instanceof TextResult) { - TextResult text = (TextResult)result; - if (text.getText().length() == 0 && defaultValue != null) { - result = defaultValue.calculateResult(context); - } - } - } - if (result == null && defaultValue != null) { - result = defaultValue.calculateResult(context); - } - } - if (result == null) return; + PsiDocumentManager.getInstance(myProject).commitDocument(myDocument); PsiFile psiFile = PsiDocumentManager.getInstance(myProject).getPsiFile(myDocument); PsiElement element = psiFile.findElementAt(start); - if (result.equalsToText(oldValue, element)) return; - String newValue = result.toString(); - if (newValue == null) newValue = ""; + ExpressionContext context = createExpressionContext(start); + Result result = isQuick ? expressionNode.calculateQuickResult(context) : expressionNode.calculateResult(context); + if ((result == null || result.equalsToText("", element)) && defaultValue != null) { + result = defaultValue.calculateResult(context); + } + assert element == null || element.isValid(); + if (result == null || result.equalsToText(oldValue, element)) return; + + String newValue = StringUtil.notNullize(result.toString()); if (element != null && !(expressionNode instanceof SelectionNode)) { newValue = LanguageLiteralEscapers.INSTANCE.forLanguage(PsiUtilBase.getLanguageAtOffset(psiFile, start)).getEscapedText(element, newValue); diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index eeace69eacb5..1f477ce80d19 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -695,6 +695,9 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig if (_performEditorAction(IdeActions.ACTION_EXPAND_LIVE_TEMPLATE_BY_TAB)) { return; } + if (_performEditorAction(IdeActions.ACTION_EDITOR_NEXT_TEMPLATE_VARIABLE)) { + return; + } if (_performEditorAction(IdeActions.ACTION_EDITOR_TAB)) { return; }