undo after template: don't insert second space (IDEA-153669)

This commit is contained in:
Anna.Kozlova
2016-04-01 11:38:39 +02:00
parent 3fb215dbc0
commit ed7ed9c829
3 changed files with 43 additions and 6 deletions
@@ -0,0 +1,6 @@
class Test {
void simpleMethod() {
int x = 0;
int k = <caret>1;
}
}
@@ -17,6 +17,9 @@ package com.intellij.refactoring;
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
import com.intellij.codeInsight.template.impl.TemplateState;
import com.intellij.openapi.command.undo.UndoManager;
import com.intellij.openapi.fileEditor.TextEditor;
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider;
import com.intellij.refactoring.introduceVariable.ReassignVariableUtil;
public class InplaceReassignVariableTest extends AbstractJavaInplaceIntroduceTest {
@@ -34,6 +37,10 @@ public class InplaceReassignVariableTest extends AbstractJavaInplaceIntroduceTes
doTest();
}
public void testUndoPositionAfterSpace() throws Exception {
doUndoTest();
}
private void doTest() {
String name = getTestName(true);
configureByFile(getBasePath() + name + getExtension());
@@ -55,6 +62,32 @@ public class InplaceReassignVariableTest extends AbstractJavaInplaceIntroduceTes
}
}
private void doUndoTest() {
String name = getTestName(true);
configureByFile(getBasePath() + name + getExtension());
final boolean enabled = getEditor().getSettings().isVariableInplaceRenameEnabled();
try {
TemplateManagerImpl.setTemplateTesting(getProject(), getTestRootDisposable());
getEditor().getSettings().setVariableInplaceRenameEnabled(true);
invokeRefactoring();
ReassignVariableUtil.reassign(getEditor());
TemplateState state = TemplateManagerImpl.getTemplateState(getEditor());
assert state != null;
state.gotoEnd(false);
TextEditor textEditor = TextEditorProvider.getInstance().getTextEditor(getEditor());
assertNotNull(textEditor);
UndoManager.getInstance(getProject()).undo(textEditor);
checkResultByFile(getBasePath() + name + getExtension());
}
finally {
getEditor().getSettings().setVariableInplaceRenameEnabled(enabled);
}
}
@Override
protected String getBasePath() {
return "/refactoring/inplaceIntroduceVariable/";
@@ -33,10 +33,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiNamedElement;
import com.intellij.psi.SmartPointerManager;
import com.intellij.psi.SmartPsiElementPointer;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.SuggestedNameInfo;
import com.intellij.psi.impl.source.PostprocessReformattingAspect;
import com.intellij.refactoring.rename.NameSuggestionProvider;
@@ -77,8 +74,9 @@ public abstract class InplaceVariableIntroducer<E extends PsiElement> extends In
if (expr != null) {
final ASTNode node = expr.getNode();
ASTNode prev = node.getTreePrev();
final ASTNode astNode = LanguageTokenSeparatorGenerators.INSTANCE.forLanguage(expr.getLanguage())
.generateWhitespaceBetweenTokens(prev, node);
final ASTNode astNode = prev instanceof PsiWhiteSpace ? null :
LanguageTokenSeparatorGenerators.INSTANCE.forLanguage(expr.getLanguage())
.generateWhitespaceBetweenTokens(prev, node);
if (astNode != null) {
final Lexer lexer = LanguageParserDefinitions.INSTANCE.forLanguage(expr.getLanguage()).createLexer(project);
if (LanguageUtil.canStickTokensTogetherByLexer(prev, prev, lexer) == ParserDefinition.SpaceRequirements.MUST) {