diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceVariable/undoPositionAfterSpace.java b/java/java-tests/testData/refactoring/inplaceIntroduceVariable/undoPositionAfterSpace.java new file mode 100644 index 000000000000..3d32cd82b6cd --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceVariable/undoPositionAfterSpace.java @@ -0,0 +1,6 @@ +class Test { + void simpleMethod() { + int x = 0; + int k = 1; + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InplaceReassignVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InplaceReassignVariableTest.java index 45ec638d7cba..bcae61847a2e 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/InplaceReassignVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/InplaceReassignVariableTest.java @@ -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/"; diff --git a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/InplaceVariableIntroducer.java b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/InplaceVariableIntroducer.java index d5a5aa91a649..359e719891a7 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/InplaceVariableIntroducer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/InplaceVariableIntroducer.java @@ -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 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) {