diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/ICSharpCode.AvalonEdit.Tests.csproj b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/ICSharpCode.AvalonEdit.Tests.csproj
index d81a412734..6798784599 100644
--- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/ICSharpCode.AvalonEdit.Tests.csproj
+++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/ICSharpCode.AvalonEdit.Tests.csproj
@@ -19,6 +19,7 @@
4
false
..\..\..\..\bin\UnitTests\
+ OnBuildSuccess
true
@@ -38,7 +39,7 @@
False
Auto
4194304
- AnyCPU
+ x86
4096
@@ -87,6 +88,7 @@
+
Always
diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/XmlParser/TextReplacementTests.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/XmlParser/TextReplacementTests.cs
new file mode 100644
index 0000000000..7e82a95fb8
--- /dev/null
+++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/XmlParser/TextReplacementTests.cs
@@ -0,0 +1,119 @@
+//
+//
+//
+//
+// $Revision$
+//
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.AvalonEdit.Document;
+using ICSharpCode.AvalonEdit.Xml;
+using NUnit.Framework;
+
+namespace ICSharpCode.AvalonEdit.Xml
+{
+ [TestFixture]
+ public class TextReplacementTests
+ {
+ #region Test Data
+ string initialDocumentText = @"
+
+
+
+";
+
+ string finalDocumentText = @"
+
+
+
+
+
+
+
+
+
+
+
+
+";
+
+ int offset = @"
+".Length;
+
+ string original = @"
+
+ ";
+
+ string replacement = @"
+
+
+
+
+
+
+
+
+
+
+ ";
+ #endregion
+
+ [Test]
+ public void ReplacementTest1()
+ {
+ /*
+ * REPRODUCTION STEPS
+ *
+ * 1. Run XmlDOM project
+ * 2. paste text from initialDocumentText (see Test Data region)
+ * 3. select lines 4 to 6
+ * 4. replace with replacement (see Test Data region)
+ * 5. exception thrown:
+ * ICSharpCode.AvalonEdit.Xml.InternalException : Assertion failed: cached elements must not have zero length
+ * at ICSharpCode.AvalonEdit.Xml.AXmlParser.Assert(Boolean condition, String message)
+ * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Xml\AXmlParser.cs:line 121
+ * at ICSharpCode.AvalonEdit.Xml.TagReader.TryReadFromCacheOrNew[T](T& res, Predicate`1 condition)
+ * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Xml\TagReader.cs:line 39
+ * at ICSharpCode.AvalonEdit.Xml.TagReader.d__12.MoveNext()
+ * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Xml\TagReader.cs:line 456
+ * at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection)
+ * at System.Collections.Generic.List`1.AddRange(IEnumerable`1 collection)
+ * at ICSharpCode.AvalonEdit.Xml.TagReader.ReadAllTags()
+ * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Xml\TagReader.cs:line 73
+ * at ICSharpCode.AvalonEdit.Xml.AXmlParser.Parse(String input, IEnumerable`1 changesSinceLastParse)
+ * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Xml\AXmlParser.cs:line 161
+ * at ICSharpCode.AvalonEdit.Tests.XmlParser.TextReplacementTests.RunTest()
+ * in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit.Tests\XmlParser\TextReplacementTests.cs:line 114
+ * at ICSharpCode.AvalonEdit.Tests.XmlParser.TextReplacementTests.TestMethod(
+ * ) in c:\Projects\SharpDevelop\4.0\SharpDevelop\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit.Tests\XmlParser\TextReplacementTests.cs:line 97
+ * */
+ Assert.DoesNotThrow(RunTest1);
+ }
+
+ void RunTest1()
+ {
+ AXmlParser parser = new AXmlParser();
+
+ try {
+ parser.Lock.EnterWriteLock();
+
+ parser.Parse(initialDocumentText, null); // full reparse
+
+ IList changes = new List();
+
+ changes.Add(new DocumentChangeEventArgs(offset, original, replacement));
+
+ parser.Parse(finalDocumentText, changes);
+ } finally {
+ parser.Lock.ExitWriteLock();
+ }
+ }
+ }
+}
diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Xml/TrackedSegmentCollection.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Xml/TrackedSegmentCollection.cs
index 32dbcb2c1f..92cb3e1ec0 100644
--- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Xml/TrackedSegmentCollection.cs
+++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Xml/TrackedSegmentCollection.cs
@@ -40,11 +40,11 @@ namespace ICSharpCode.AvalonEdit.Xml
segments.UpdateOffsets(change);
// Remove any items affected by the change
- AXmlParser.Log("Changed offset {0}", change.Offset);
+ AXmlParser.Log("Changed {0}-{1}", change.Offset, change.Offset + change.InsertionLength);
// Removing will cause one of the ends to be set to change.Offset
// FindSegmentsContaining includes any segments touching
// so that conviniently takes care of the +1 byte
- var segmentsContainingOffset = segments.FindSegmentsContaining(change.Offset);
+ var segmentsContainingOffset = segments.FindOverlappingSegments(change.Offset, change.InsertionLength);
foreach(AXmlObject obj in segmentsContainingOffset.OfType().Where(o => o.IsCached)) {
InvalidateCache(obj, false);
}