Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }