private void ExtendStartPoint()
{
//some are not extended
if (!Complete
|| StartLine.LineNumber == EndLine.LineNumber
|| !string.IsNullOrWhiteSpace(TextBefore)) return;
//how much can we move region start
int upperLimit = 0;
if (this.Parent != null)
{
int childPosition = Parent.Children.IndexOf(this);
if (childPosition == 0)
{
//this region is first child of its parent
//we can go until the parent's start
upperLimit = Parent.RegionType != TextRegionType.None ? Parent.StartLine.LineNumber + 1 : 0;
}
else
{
//there is previous child
//we can go until its end
TextRegion prevRegion = Parent.Children[childPosition - 1];
upperLimit = prevRegion.EndLine.LineNumber + (prevRegion.EndLine.LineNumber == prevRegion.StartLine.LineNumber ? 0 : 1);
}
}
//now looking up to calculated upper limit for non-empty line
for (int i = StartLine.LineNumber - 1; i >= upperLimit; i--)
{
ITextSnapshotLine line = StartPoint.Snapshot.GetLineFromLineNumber(i);
if (!string.IsNullOrWhiteSpace(line.GetText()))
{
//found such line, placing region start at its end
StartPoint = line.End;
return;
}
}
}
/// <summary> /// parses buffer /// </summary> /// <param name="parser"></param> /// <param name="parent">parent region or null</param> /// <returns>a region with its children or null</returns> public static TextRegion ParseBuffer(SnapshotParser parser, TextRegion parent) { for (; !parser.AtEnd(); parser.MoveNext()) { TextRegion r = TextRegion.TryCreateRegion(parser); if (r != null) { parser.MoveNext(); //found the start of the region if (!r.Complete) { //searching for child regions while (TextRegion.ParseBuffer(parser, r) != null) { ; } //found everything r.ExtendStartPoint(); } //adding to children or merging with last child r.Parent = parent; parent.Children.Add(r); return(r); } //found parent's end - terminating parsing if (parent.TryComplete(parser)) { parser.MoveNext(); return(null); } } return(null); }