public void TestMerge() { var loc1 = new SourcePosition(0, 1, 1); var loc2 = new SourcePosition(2, 1, 3); var loc3 = new SourcePosition(5, 2, 6); var loc4 = new SourcePosition(6, 1, 7); var loc5 = new SourcePosition(9, 2, 14); Assert.AreEqual(SourceRange.Unknown, SourceRange.Merge()); Assert.AreEqual(SourceRange.Unknown, SourceRange.Merge(null)); Assert.AreEqual(SourceRange.Unknown, SourceRange.Merge(SourceRange.Unknown)); Assert.AreEqual(SourceRange.Unknown, SourceRange.Merge(SourceRange.Unknown, SourceRange.Unknown)); Assert.AreEqual(new SourceRange(loc1), SourceRange.Merge(SourceRange.Unknown, new SourceRange(loc1))); Assert.AreEqual(new SourceRange(loc1), SourceRange.Merge(SourceRange.Unknown, new SourceRange(loc1), SourceRange.Unknown, new SourceRange(loc1))); Assert.AreEqual(new SourceRange(loc1, loc5), SourceRange.Merge(new SourceRange(loc3, loc5), SourceRange.Unknown, new SourceRange(loc1))); Assert.AreEqual(new SourceRange(loc1, loc5), SourceRange.Merge(new SourceRange(loc3, loc5), new SourceRange(loc1, loc5))); Assert.AreEqual(new SourceRange(loc1, loc5), SourceRange.Merge(new SourceRange(loc4, loc5), new SourceRange(loc1, loc2), new SourceRange(loc2, loc3))); Assert.AreEqual(new SourceRange(loc2, loc5), SourceRange.Merge(new SourceRange(loc3, loc5), new SourceRange(loc2, loc3))); Assert.AreEqual(new SourceRange(loc2, loc5), SourceRange.Merge(new SourceRange(loc4, loc5), new SourceRange(loc2, loc3))); Assert.AreEqual(new SourceRange(loc1, loc3), SourceRange.Merge(new SourceRange(loc1, loc2), new SourceRange(loc2, loc3))); }
/// <summary> /// 向 <see cref="ParserController<T>"/> 中添加指定堆栈中的词法单元。 /// </summary> /// <param name="stack">要添加词法单元的堆栈。</param> /// <param name="count">要添加的词法单元的数量。</param> internal void InternalAdd(Stack <Token <T> > stack, int count) { while (this.Count > count) { base.Items.RemoveAt(this.Count - 1); } while (this.Count < count) { base.Items.Add(null); } if (count == 0) { if (stack.Count == 0) { this.Start = SourcePosition.Unknown; } else { this.Start = stack.Peek().Start; } this.End = this.Start; } else { while (count-- > 0) { base.Items[count] = stack.Pop(); } SourceRange range = SourceRange.Merge((IEnumerable <ISourceLocatable>) this); this.Start = range.Start; this.End = range.End; } }
public void TestProperties() { var loc1 = new SourcePosition(0, 1, 1); var loc2 = new SourcePosition(2, 1, 3); Assert.AreEqual(true, SourceRange.Unknown.IsUnknown); Assert.AreEqual(true, new SourceRange(SourcePosition.Unknown).IsUnknown); Assert.AreEqual(true, new SourceRange(SourcePosition.Unknown, SourcePosition.Unknown).IsUnknown); Assert.AreEqual(true, new SourceRange(new SourceRange(SourcePosition.Unknown, SourcePosition.Unknown)).IsUnknown); Assert.AreEqual(false, new SourceRange(loc1).IsUnknown); Assert.AreEqual(false, SourceRange.Merge(SourceRange.Unknown, new SourceRange(loc1)).IsUnknown); Assert.AreEqual(0, SourceRange.Unknown.Length); Assert.AreEqual(0, new SourceRange(new SourceRange(SourcePosition.Unknown, SourcePosition.Unknown)).Length); Assert.AreEqual(1, new SourceRange(loc1).Length); Assert.AreEqual(3, new SourceRange(loc1, loc2).Length); }
public void TestMerge() { SourceLocation loc1 = new SourceLocation(0, 1, 1); SourceLocation loc2 = new SourceLocation(2, 1, 3); SourceLocation loc3 = new SourceLocation(5, 1, 6); SourceLocation loc4 = new SourceLocation(6, 2, 1); SourceLocation loc5 = new SourceLocation(9, 2, 4); Assert.AreEqual(SourceRange.Unknown, SourceRange.Merge(SourceRange.Unknown)); Assert.AreEqual(SourceRange.Unknown, SourceRange.Merge(SourceRange.Unknown, SourceRange.Unknown)); Assert.AreEqual(new SourceRange(loc1), SourceRange.Merge(SourceRange.Unknown, new SourceRange(loc1))); Assert.AreEqual(new SourceRange(loc1), SourceRange.Merge(SourceRange.Unknown, new SourceRange(loc1), SourceRange.Unknown, new SourceRange(loc1))); Assert.AreEqual(new SourceRange(loc1, loc5), SourceRange.Merge(new SourceRange(loc3, loc5), SourceRange.Unknown, new SourceRange(loc1))); Assert.AreEqual(new SourceRange(loc1, loc5), SourceRange.Merge(new SourceRange(loc3, loc5), new SourceRange(loc1, loc5))); Assert.AreEqual(new SourceRange(loc1, loc5), SourceRange.Merge(new SourceRange(loc4, loc5), new SourceRange(loc1, loc2), new SourceRange(loc2, loc3))); Assert.AreEqual(new SourceRange(loc2, loc5), SourceRange.Merge(new SourceRange(loc3, loc5), new SourceRange(loc2, loc3))); Assert.AreEqual(new SourceRange(loc2, loc5), SourceRange.Merge(new SourceRange(loc4, loc5), new SourceRange(loc2, loc3))); Assert.AreEqual(new SourceRange(loc1, loc3), SourceRange.Merge(new SourceRange(loc1, loc2), new SourceRange(loc2, loc3))); Assert.AreEqual(SourceRange.Unknown, SourceRange.Unknown.MergeWith()); Assert.AreEqual(SourceRange.Unknown, SourceRange.Unknown.MergeWith(SourceRange.Unknown)); Assert.AreEqual(new SourceRange(loc1), SourceRange.Unknown.MergeWith(new SourceRange(loc1))); Assert.AreEqual(new SourceRange(loc1), new SourceRange(loc1).MergeWith(SourceRange.Unknown)); Assert.AreEqual(new SourceRange(loc1), SourceRange.Unknown.MergeWith(new SourceRange(loc1), SourceRange.Unknown, new SourceRange(loc1))); Assert.AreEqual(new SourceRange(loc1, loc5), new SourceRange(loc3, loc5).MergeWith(SourceRange.Unknown, new SourceRange(loc1))); Assert.AreEqual(new SourceRange(loc1, loc5), new SourceRange(loc3, loc5).MergeWith(new SourceRange(loc1, loc5))); Assert.AreEqual(new SourceRange(loc1, loc5), new SourceRange(loc4, loc5).MergeWith(new SourceRange(loc1, loc2), new SourceRange(loc2, loc3))); Assert.AreEqual(new SourceRange(loc2, loc5), new SourceRange(loc3, loc5).MergeWith(new SourceRange(loc2, loc3))); Assert.AreEqual(new SourceRange(loc2, loc5), new SourceRange(loc4, loc5).MergeWith(new SourceRange(loc2, loc3))); Assert.AreEqual(new SourceRange(loc1, loc3), new SourceRange(loc1, loc2).MergeWith(new SourceRange(loc2, loc3))); }