diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java index 3a21b097a3d9..d3ac9a9394fa 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java @@ -208,9 +208,16 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme assert dot != null : this; deleteChildRange(child.getPsi(), dot.getPsi()); - List annotations = PsiTreeUtil.getChildrenOfTypeAsList(this, PsiAnnotation.class); - setAnnotations(annotations); - + PsiModifierList modifierList = PsiImplUtil.findNeighbourModifierList(this); + if (modifierList != null) { + ASTNode ref = findChildByRole(ChildRole.REFERENCE_NAME); + assert ref != null : this; + PsiElement lastChild = ref.getPsi().getPrevSibling(); + if (lastChild != null) { + modifierList.addRange(getFirstChild(), lastChild); + deleteChildRange(getFirstChild(), lastChild); + } + } return; } @@ -614,31 +621,6 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme return annotations; } - private void setAnnotations(List annotations) { - if (annotations.isEmpty()) return; - - PsiElement newParent = this; - PsiElement anchor = SourceTreeToPsiMap.treeElementToPsi(findChildByType(JavaTokenType.DOT)); - if (anchor == null) { - PsiModifierList modifierList = PsiImplUtil.findNeighbourModifierList(this); - if (modifierList != null) { - newParent = modifierList; - } - } - - for (PsiAnnotation annotation : annotations) { - if (annotation.getParent() != newParent) { - if (anchor != null) { - newParent.addAfter(annotation, anchor); - } - else { - newParent.add(annotation); - } - annotation.delete(); - } - } - } - private boolean isFullyQualified(@NotNull PsiFile containingFile) { int kind = getKind(containingFile); switch (kind) { diff --git a/java/java-tests/testData/psi/shortenClassRefs/WhiteSpaceForMovedTypeAnnotations.java b/java/java-tests/testData/psi/shortenClassRefs/WhiteSpaceForMovedTypeAnnotations.java new file mode 100644 index 000000000000..18a1cded67ea --- /dev/null +++ b/java/java-tests/testData/psi/shortenClassRefs/WhiteSpaceForMovedTypeAnnotations.java @@ -0,0 +1,11 @@ +import java.lang.annotation.*; + +@Target({ElementType.TYPE_USE}) +@interface TA { } + +class Test { + private void bar(java.util.@TA List name) { + } + + +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/shortenClassRefs/WhiteSpaceForMovedTypeAnnotations_after.java b/java/java-tests/testData/psi/shortenClassRefs/WhiteSpaceForMovedTypeAnnotations_after.java new file mode 100644 index 000000000000..0b00a329c4ea --- /dev/null +++ b/java/java-tests/testData/psi/shortenClassRefs/WhiteSpaceForMovedTypeAnnotations_after.java @@ -0,0 +1,12 @@ +import java.lang.annotation.*; +import java.util.List; + +@Target({ElementType.TYPE_USE}) +@interface TA { } + +class Test { + private void bar(@TA List name) { + } + + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/psi/impl/source/tree/java/ShortenClassReferencesTest.java b/java/java-tests/testSrc/com/intellij/psi/impl/source/tree/java/ShortenClassReferencesTest.java index c4887c452d23..df9b57d43c2e 100644 --- a/java/java-tests/testSrc/com/intellij/psi/impl/source/tree/java/ShortenClassReferencesTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/impl/source/tree/java/ShortenClassReferencesTest.java @@ -81,6 +81,20 @@ public class ShortenClassReferencesTest extends LightCodeInsightFixtureTestCase "class Outer1 {class Inner {} {boolean b = new Inner() instanceof Inner;}}"); } + public void testWhiteSpaceForMovedTypeAnnotations() throws Exception { + myFixture.configureByFile(getTestName(false) + ".java"); + PsiElement elementAtCaret = myFixture.getElementAtCaret(); + assertTrue(elementAtCaret instanceof PsiParameter); + WriteCommandAction.runWriteCommandAction(getProject(), + () -> { + PsiTypeElement typeElement = (PsiTypeElement)JavaCodeStyleManager.getInstance(getProject()).shortenClassReferences(((PsiParameter)elementAtCaret).getTypeElement()); + assertTrue(typeElement != null && typeElement.isValid()); + assertEquals("List", typeElement.getText()); + }); + + myFixture.checkResultByFile(getTestName(false) + "_after.java"); + } + private void doTest() { myFixture.configureByFile(getTestName(false) + ".java"); doShortenRefs();