public override void VisitMarkupMinimizedTagHelperDirectiveAttribute(MarkupMinimizedTagHelperDirectiveAttributeSyntax node)
            {
                if (node.TagHelperAttributeInfo.Bound)
                {
                    var transition = new SyntaxResult(node.Transition, SyntaxKind.Transition, _razorCodeDocument);
                    _syntaxNodes.Add(transition);

                    var directiveAttribute = new SyntaxResult(node.Name, SyntaxKind.MarkupMinimizedTagHelperDirectiveAttribute, _razorCodeDocument);
                    _syntaxNodes.Add(directiveAttribute);

                    if (node.Colon != null)
                    {
                        var colon = new SyntaxResult(node.Colon, SyntaxKind.Colon, _razorCodeDocument);
                        _syntaxNodes.Add(colon);
                    }

                    if (node.ParameterName != null)
                    {
                        var parameterName = new SyntaxResult(node.ParameterName, SyntaxKind.MarkupMinimizedTagHelperDirectiveAttribute, _razorCodeDocument);
                        _syntaxNodes.Add(parameterName);
                    }
                }

                base.VisitMarkupMinimizedTagHelperDirectiveAttribute(node);
            }
 public override void VisitMarkupTagHelperEndTag(MarkupTagHelperEndTagSyntax node)
 {
     if (ClassifyTagName((MarkupTagHelperElementSyntax)node.Parent))
     {
         var result = new SyntaxResult(node.Name, SyntaxKind.MarkupTagHelperEndTag, _razorCodeDocument);
         _syntaxNodes.Add(result);
     }
     base.VisitMarkupTagHelperEndTag(node);
 }
            public override void VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node)
            {
                if (node.TagHelperAttributeInfo.Bound)
                {
                    var result = new SyntaxResult(node.Name, SyntaxKind.MarkupTagHelperAttribute, _razorCodeDocument);
                    _syntaxNodes.Add(result);
                }

                base.VisitMarkupTagHelperAttribute(node);
            }
Ejemplo n.º 4
0
        public ActionResult <Result> Post([FromBody] Dto dto)
        {
            if (dto == null || string.IsNullOrEmpty(dto.Text))
            {
                return(BadRequest());
            }

            string       add = dto.Text.Last().Equals('\n') ? " " : "\n";
            OuterLexemes lex = _manager.LexicalAnalyzer(dto.Text + add);
            SyntaxResult syn = _manager.SyntaxAnalyzer(lex);

            if (!syn.Success)
            {
                return(new Result
                {
                    OuterLexemes = lex,
                    SyntaxResult = syn,
                    ReferenceNumber = Guid.NewGuid()
                });
            }

            PolishResult polishResult = _polishManager.Run(lex);

            Guid referenceNumber = Guid.NewGuid();

            _cache.Set(referenceNumber, new ExecutionPoint {
                PolishResult = polishResult
            });

            return(new Result
            {
                OuterLexemes = lex,
                SyntaxResult = syn,
                // todo Use AutoMapper
                PolishResult = new PolishResultDto
                {
                    ReversePolishNotation = string.Join(" ", polishResult.ReversePolishNotation.Select(pn => pn.Token)),
                    Trace = polishResult.Trace.Select(t => new PolishTraceDto
                    {
                        Input = t.Input,
                        Stack = string.Join(" | ", t.Stack.Select(pn => pn.Token)),
                        ReversePolishNotation = string.Join(" ", t.ReversePolishNotation.Select(pn => pn.Token))
                    })
                },
                ReferenceNumber = referenceNumber
            });
        }
        /**
         * In short, each token takes 5 integers to represent, so a specific token `i` in the file consists of the following array indices:
         *  - at index `5*i`   - `deltaLine`: token line number, relative to the previous token
         *  - at index `5*i+1` - `deltaStart`: token start character, relative to the previous token (relative to 0 or the previous token's start if they are on the same line)
         *  - at index `5*i+2` - `length`: the length of the token. A token cannot be multiline.
         *  - at index `5*i+3` - `tokenType`: will be looked up in `SemanticTokensLegend.tokenTypes`
         *  - at index `5*i+4` - `tokenModifiers`: each set bit will be looked up in `SemanticTokensLegend.tokenModifiers`
         **/
        private static IEnumerable <uint> GetData(
            SyntaxResult currentNode,
            SyntaxResult?previousNode,
            RazorCodeDocument razorCodeDocument)
        {
            var previousRange = previousNode?.Range;
            var currentRange  = currentNode.Range;

            // deltaLine
            var previousLineIndex = previousNode == null ? 0 : previousRange.Start.Line;

            yield return((uint)(currentRange.Start.Line - previousLineIndex));

            // deltaStart
            if (previousRange != null && previousRange?.Start.Line == currentRange.Start.Line)
            {
                yield return((uint)(currentRange.Start.Character - previousRange.Start.Character));
            }
            else
            {
                yield return((uint)currentRange.Start.Character);
            }

            // length
            var endIndex   = currentNode.Range.End.GetAbsoluteIndex(razorCodeDocument.GetSourceText());
            var startIndex = currentNode.Range.Start.GetAbsoluteIndex(razorCodeDocument.GetSourceText());
            var length     = endIndex - startIndex;

            Debug.Assert(length > 0);
            yield return((uint)length);

            // tokenType
            yield return(GetTokenTypeData(currentNode.Kind));

            // tokenModifiers
            // We don't currently have any need for tokenModifiers
            yield return(0);
        }