private static ContainerOrTerminalNode ParseScenarioDefinition(ScenarioDefinition definition, CharacterPositionFinder finder, LineInfo locationAfterDefinition) { var start = GetLineInfo(definition.Location); var end = locationAfterDefinition; var spanStart = finder.GetCharacterPosition(start); var spanEnd = spanStart + finder.GetLineLength(start); var locationInside = definition.Steps.Select(_ => _.Location).OrderBy(_ => _.Line).ThenBy(_ => _.Column).FirstOrDefault(); if (locationInside != null) { var lineInfo = GetLineInfo(locationInside); var position = finder.GetCharacterPosition(lineInfo) - 1; spanEnd = position; } var container = new Container { Type = nameof(ScenarioDefinition), Name = definition.Name, LocationSpan = new LocationSpan(start, end), HeaderSpan = new CharacterSpan(spanStart, spanEnd), FooterSpan = CharacterSpan.None, // TODO: FIX }; container.Children.AddRange(ParseSteps(definition, finder, locationAfterDefinition)); return(container); }
private static void AdjustNode(IList <ContainerOrTerminalNode> parentChildren, int indexInParentChildren, CharacterPositionFinder finder) { var child = parentChildren[indexInParentChildren]; if (indexInParentChildren < parentChildren.Count - 1) { var nextSibling = parentChildren[indexInParentChildren + 1]; var indexBefore = finder.GetCharacterPosition(nextSibling.LocationSpan.Start) - 1; var newEndPos = finder.GetLineInfo(indexBefore); child.LocationSpan = new LocationSpan(child.LocationSpan.Start, newEndPos); } if (child is Container c) { var start = c.HeaderSpan.End + 1; AdjustChildren(c, finder); var end = finder.GetCharacterPosition(c.LocationSpan.End); c.FooterSpan = new CharacterSpan(start, end); } else if (child is TerminalNode t) { var start = finder.GetCharacterPosition(t.LocationSpan.Start); var end = finder.GetCharacterPosition(t.LocationSpan.End); t.Span = new CharacterSpan(start, end); } }
private static ContainerOrTerminalNode ParseStep(Step step, CharacterPositionFinder finder, LineInfo locationAfterDefinition) { var start = GetLineInfo(step.Location); var end = locationAfterDefinition; var spanStart = finder.GetCharacterPosition(start); var spanEnd = spanStart + finder.GetLineLength(start); var node = new TerminalNode { Type = nameof(Step), Name = step.Keyword + step.Text, LocationSpan = new LocationSpan(start, end), Span = new CharacterSpan(spanStart, spanEnd), // TODO: FIX }; return(node); }
private static ContainerOrTerminalNode ParseTag(Tag tag, CharacterPositionFinder finder, LineInfo locationAfterDefinition) { var start = GetLineInfo(tag.Location); var end = locationAfterDefinition; var spanStart = finder.GetCharacterPosition(start); var spanEnd = spanStart + finder.GetLineLength(start); var container = new Container { Type = nameof(Tag), Name = tag.Name, LocationSpan = new LocationSpan(start, end), HeaderSpan = new CharacterSpan(spanStart, spanEnd), FooterSpan = CharacterSpan.None, // TODO: FIX }; return(container); }