From d4ab5f0efb50aa6b5f35195a2de7fca92a21776b Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 8 Jan 2018 20:52:11 +0100 Subject: [PATCH] java completion: don't delete everything if class name coincides with package (IDEA-180284) --- .../completion/AllClassesGetter.java | 2 +- .../JavaClassNameInsertHandler.java | 3 ++- .../completion/JavaCompletionUtil.java | 23 ++++++++----------- .../lookup/VariableLookupItem.java | 2 +- .../CompletingClassWithSameNameAsPackage.java | 5 ++++ ...etingClassWithSameNameAsPackage_after.java | 7 ++++++ .../completion/NormalCompletionTest.groovy | 5 ++++ .../lang/completion/GroovyCompletionUtil.java | 2 +- 8 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/CompletingClassWithSameNameAsPackage.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/CompletingClassWithSameNameAsPackage_after.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java index 87ff9783959b..dbcfffc0612e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java @@ -98,7 +98,7 @@ public class AllClassesGetter { } } } - if (toDelete.isValid()) { + if (toDelete != null && toDelete.isValid()) { document.deleteString(toDelete.getStartOffset(), toDelete.getEndOffset()); context.setTailOffset(toDelete.getStartOffset()); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java index 11c8589d8ae8..ddf8369dd2ce 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java @@ -83,7 +83,7 @@ class JavaClassNameInsertHandler implements InsertHandler= length) { - toDelete = document.createRangeMarker(length, length); + RangeMarker toDelete = document.createRangeMarker(endOffset, endOffset + 1); + toDelete.setGreedyToLeft(true); + toDelete.setGreedyToRight(true); + return toDelete; } - else { - toDelete = document.createRangeMarker(endOffset, endOffset); - } - toDelete.setGreedyToLeft(true); - toDelete.setGreedyToRight(true); - return toDelete; + return null; } public static void insertParentheses(final InsertionContext context, 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 faa20264a14d..60e9cdd19d2b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java @@ -189,7 +189,7 @@ public class VariableLookupItem extends LookupItem implements Typed ref.bindToElementViaStaticImport(((PsiField)variable).getContainingClass()); PostprocessReformattingAspect.getInstance(ref.getProject()).doPostponedFormatting(); } - if (toDelete.isValid()) { + if (toDelete != null && toDelete.isValid()) { document.deleteString(toDelete.getStartOffset(), toDelete.getEndOffset()); } context.commitDocument(); diff --git a/java/java-tests/testData/codeInsight/completion/normal/CompletingClassWithSameNameAsPackage.java b/java/java-tests/testData/codeInsight/completion/normal/CompletingClassWithSameNameAsPackage.java new file mode 100644 index 000000000000..5f30c42c5425 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/CompletingClassWithSameNameAsPackage.java @@ -0,0 +1,5 @@ +public class Util { + int goo() { + new Apple + } +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/CompletingClassWithSameNameAsPackage_after.java b/java/java-tests/testData/codeInsight/completion/normal/CompletingClassWithSameNameAsPackage_after.java new file mode 100644 index 000000000000..e6f09664b29b --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/CompletingClassWithSameNameAsPackage_after.java @@ -0,0 +1,7 @@ +import Apple.Apple; + +public class Util { + int goo() { + new Apple() + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy index f6f05ab6117a..2f89dfa07a0c 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy @@ -1845,4 +1845,9 @@ class Bar {{ checkResultByFile(getTestName(false) + "_after.java") } + void testCompletingClassWithSameNameAsPackage() { + myFixture.addClass("package Apple; public class Apple {}") + doTest('\n') + } + } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java index bf0ab4ef1ef3..53cdb276461b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java @@ -481,7 +481,7 @@ public class GroovyCompletionUtil { newStartOffset = marker.getStartOffset(); } - if (toDelete.isValid()) { + if (toDelete != null && toDelete.isValid()) { document.deleteString(toDelete.getStartOffset(), toDelete.getEndOffset()); }