diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java
index fda11fd67b11..394d42ab7989 100644
--- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java
+++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -544,27 +544,35 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM
final XmlTag rootTag = document.getRootTag();
final String externalName = getExternalName(listOwner, false);
if (rootTag != null) {
+ XmlTag anchor = null;
for (XmlTag item : rootTag.getSubTags()) {
- if (Comparing.strEqual(StringUtil.unescapeXml(item.getAttributeValue("name")), externalName)) {
+ int compare = Comparing.compare(externalName, StringUtil.unescapeXml(item.getAttributeValue("name")));
+ if (compare == 0) {
+ anchor = null;
for (XmlTag annotation : item.getSubTags()) {
- if (Comparing.strEqual(annotation.getAttributeValue("name"), annotationFQName)) {
+ compare = Comparing.compare(annotationFQName, annotation.getAttributeValue("name"));
+ if (compare == 0) {
annotation.delete();
break;
}
+ if (compare < 0) break;
+ anchor = annotation;
}
XmlTag newTag = XmlElementFactory.getInstance(myPsiManager.getProject()).createTagFromText(
createAnnotationTag(annotationFQName, values));
- item.add(newTag);
+ item.addAfter(newTag, anchor);
commitChanges(xmlFile);
notifyAfterAnnotationChanging(listOwner, annotationFQName, true);
return;
}
+ if (compare < 0) break;
+ anchor = item;
}
@NonNls String text =
"- \n";
text += createAnnotationTag(annotationFQName, values);
text += "
";
- rootTag.add(XmlElementFactory.getInstance(myPsiManager.getProject()).createTagFromText(text));
+ rootTag.addAfter(XmlElementFactory.getInstance(myPsiManager.getProject()).createTagFromText(text), anchor);
}
}
commitChanges(xmlFile);
@@ -604,7 +612,8 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM
}
}
- Collections.sort(itemTags, new Comparator() {
+ List sorted = new ArrayList(itemTags);
+ Collections.sort(sorted, new Comparator() {
@Override
public int compare(XmlTag item1, XmlTag item2) {
String externalName1 = item1.getAttributeValue("name");
@@ -613,9 +622,11 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM
return externalName1.compareTo(externalName2);
}
});
- for (XmlTag item : itemTags) {
- rootTag.addAfter(item, null);
- item.delete();
+ if (!sorted.equals(itemTags)) {
+ for (XmlTag item : sorted) {
+ rootTag.addAfter(item, null);
+ item.delete();
+ }
}
}
diff --git a/java/java-tests/testData/codeInsight/externalAnnotations/content/anno/p/annotations.xml b/java/java-tests/testData/codeInsight/externalAnnotations/content/anno/p/annotations.xml
index 4d905a4befdb..5daf0fa19a40 100644
--- a/java/java-tests/testData/codeInsight/externalAnnotations/content/anno/p/annotations.xml
+++ b/java/java-tests/testData/codeInsight/externalAnnotations/content/anno/p/annotations.xml
@@ -1,8 +1,8 @@
- -
-
-
- -
-
-
+ -
+
+
+ -
+
+
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/externalAnnotations/content/anno/suppressed/annotations.xml b/java/java-tests/testData/codeInsight/externalAnnotations/content/anno/suppressed/annotations.xml
index 01443638aa18..d25dd2fd44d9 100644
--- a/java/java-tests/testData/codeInsight/externalAnnotations/content/anno/suppressed/annotations.xml
+++ b/java/java-tests/testData/codeInsight/externalAnnotations/content/anno/suppressed/annotations.xml
@@ -1,10 +1,10 @@
- -
-
-
- -
-
-
-
-
+ -
+
+
+ -
+
+
+
+
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/externalAnnotations/content/annoMultiRoot/root1/multiRoot/annotations.xml b/java/java-tests/testData/codeInsight/externalAnnotations/content/annoMultiRoot/root1/multiRoot/annotations.xml
index 36aa8d8050c6..baa0a3a9ba3c 100644
--- a/java/java-tests/testData/codeInsight/externalAnnotations/content/annoMultiRoot/root1/multiRoot/annotations.xml
+++ b/java/java-tests/testData/codeInsight/externalAnnotations/content/annoMultiRoot/root1/multiRoot/annotations.xml
@@ -1,7 +1,7 @@
- -
-
-
-
-
+ -
+
+
+
+
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/externalAnnotations/content/annoMultiRoot/root2/multiRoot/annotations.xml b/java/java-tests/testData/codeInsight/externalAnnotations/content/annoMultiRoot/root2/multiRoot/annotations.xml
index e497a6ea84d4..606162592b30 100644
--- a/java/java-tests/testData/codeInsight/externalAnnotations/content/annoMultiRoot/root2/multiRoot/annotations.xml
+++ b/java/java-tests/testData/codeInsight/externalAnnotations/content/annoMultiRoot/root2/multiRoot/annotations.xml
@@ -1,7 +1,7 @@
- -
-
-
-
-
+ -
+
+
+
+
\ No newline at end of file