[231681] Potential duplicate restyling in StucturedPresentationReconciler
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java
index 83d926c..900fea7 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java
@@ -608,8 +608,13 @@
System.out.println(TRACE_PREFIX + "calculated simple text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
System.out.flush();
}
+
+ boolean damageOverlaps = processRecordedDamages(damage, document);
+ if(_trace && _traceTime) {
+ System.out.println(TRACE_PREFIX + "processed recorded structured text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
- if (damage != null && document != null) {
+ if (damage != null && document != null && !damageOverlaps) {
processDamage(damage, document);
if(_trace && _traceTime) {
System.out.println(TRACE_PREFIX + "processed simple text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -617,10 +622,6 @@
}
}
- processRecordedDamages();
- if(_trace && _traceTime) {
- System.out.println(TRACE_PREFIX + "processed recorded structured text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
- }
fDocumentPartitioningChanged= false;
fChangedDocumentPartitions= null;
if(_trace) {
@@ -1028,14 +1029,32 @@
}
void processRecordedDamages() {
+ processRecordedDamages(null, null);
+ }
+
+ boolean processRecordedDamages(IRegion damage, IDocument document) {
RecordedDamage[] recordings = null;
+ boolean recordingOverlaps = false;
synchronized (fRecordedDamages) {
recordings = (RecordedDamage[]) fRecordedDamages.toArray(new RecordedDamage[fRecordedDamages.size()]);
fRecordedDamages.clear();
}
for (int i = 0; i < recordings.length; i++) {
+ if (isOverlappingRegion(damage, recordings[i].damage) && document == recordings[i].document)
+ recordingOverlaps = true;
processDamage(recordings[i].damage, recordings[i].document);
}
+ return recordingOverlaps;
+ }
+
+ private boolean isOverlappingRegion(IRegion base, IRegion damage) {
+ if(base == null || damage == null)
+ return false;
+
+ int baseEnd = base.getOffset() + base.getLength();
+ int damageEnd = damage.getOffset() + damage.getLength();
+
+ return damage.getOffset() <= base.getOffset() && (damageEnd >= baseEnd);
}
/**