From 56354fd643f6b87a65837953c8f5c2fcc2655143 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 26 Dec 2013 12:55:33 +0400 Subject: [PATCH] performance: do not rewrite the whole file --- .../ExternalAnnotationsManagerImpl.java | 29 +++++++++++++------ .../content/anno/p/annotations.xml | 12 ++++---- .../content/anno/suppressed/annotations.xml | 16 +++++----- .../root1/multiRoot/annotations.xml | 10 +++---- .../root2/multiRoot/annotations.xml | 10 +++---- 5 files changed, 44 insertions(+), 33 deletions(-) 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