diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java index 7f47e02399f3..9fa4834de1c5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java @@ -4,6 +4,8 @@ import com.intellij.codeInsight.AutoPopupController; import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.completion.*; import com.intellij.featureStatistics.FeatureUsageTracker; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.RangeMarker; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.impl.source.PostprocessReformattingAspect; @@ -84,17 +86,24 @@ public class VariableLookupItem extends LookupItem implements Typed public void handleInsert(InsertionContext context) { PsiVariable variable = getObject(); - context.getDocument().replaceString(context.getStartOffset(), context.getTailOffset(), variable.getName()); + Document document = context.getDocument(); + document.replaceString(context.getStartOffset(), context.getTailOffset(), variable.getName()); context.commitDocument(); if (variable instanceof PsiField) { if (willBeImported()) { + RangeMarker toDelete = JavaCompletionUtil.insertTemporary(context.getTailOffset(), document, " "); + context.commitDocument(); final PsiReferenceExpression ref = PsiTreeUtil.findElementOfClassAtOffset(context.getFile(), context.getStartOffset(), PsiReferenceExpression.class, false); if (ref != null) { ref.bindToElementViaStaticImport(((PsiField)variable).getContainingClass()); PostprocessReformattingAspect.getInstance(ref.getProject()).doPostponedFormatting(); } + if (toDelete.isValid()) { + document.deleteString(toDelete.getStartOffset(), toDelete.getEndOffset()); + } + context.commitDocument(); } else if (shouldQualify((PsiField)variable, context)) { qualifyFieldReference(context, (PsiField)variable); @@ -127,7 +136,7 @@ public class VariableLookupItem extends LookupItem implements Typed context.setAddCompletionChar(false); if (ref != null) { FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EXCLAMATION_FINISH); - context.getDocument().insertString(ref.getTextRange().getStartOffset(), "!"); + document.insertString(ref.getTextRange().getStartOffset(), "!"); } } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/GlobalMemberNameCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/GlobalMemberNameCompletionTest.groovy index 1fc4145095c2..c70c166a19b0 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/GlobalMemberNameCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/GlobalMemberNameCompletionTest.groovy @@ -197,6 +197,44 @@ class A { ''' } + public void "test static import before an identifier"() { + myFixture.addClass ''' +package test.t1; + +public enum DemoEnum +{ + XXONE, + TWO +}''' + doTest """ +import test.t1.DemoEnum; + +public class Demo { + + public static void doStuff(DemoEnum enumValue, String value) {} + public static void main(String[] args) + { + String val = "anyValue"; + doStuff(XXONval); + } +} +""", true, """ +import test.t1.DemoEnum; + +import static test.t1.DemoEnum.XXONE; + +public class Demo { + + public static void doStuff(DemoEnum enumValue, String value) {} + public static void main(String[] args) + { + String val = "anyValue"; + doStuff(XXONEval); + } +} +""" + } + private void doTest(String input, boolean importStatic, String output) { myFixture.configureByText("a.java", input)