コード例 #1
0
        public static SyntaxNode ConvertToTriviaList(this SyntaxNode[] nodes)
        {
            var builder = new SyntaxListBuilder(nodes.Length);
            for (int i = 0; i < nodes.Length; i++)
            {
                var node = nodes[i];
                var nd = node.GetDiagnostics();
                foreach (var token in node.GetTokens())
                {
                    builder.Add(token.GetLeadingTrivia());
                    if (token.Width > 0)
                    {
                        var tk = token.WithLeadingTrivia(null).WithTrailingTrivia(null);
                        System.Diagnostics.Debug.Assert(tk.HasDiagnostics == token.HasDiagnostics);
                        if (nd != null && nd.Length > 0)
                        {
                            if (token != node)
                            {
                                tk = tk.WithAdditionalDiagnostics(nd);
                            }

                            nd = null;
                        }

                        builder.Add(Syntax.SkippedTokens(tk));
                    }

                    builder.Add(token.GetTrailingTrivia());
                }
            }

            return builder.ToListNode();
        }
コード例 #2
0
ファイル: XmlCommentParser.cs プロジェクト: sperling/cskarp
        private XmlCommentSyntax ParseXmlComment()
        {
            var lessThanExclamationMinusMinusToken = this.EatToken(SyntaxKind.XmlCommentStartToken);
            var saveMode   = this.SetMode(LexMode.XmlCommentText);
            var textTokens = new SyntaxListBuilder <SyntaxToken>(10);

            while (this.CurrentToken.Kind == SyntaxKind.XmlTextLiteralToken ||
                   this.CurrentToken.Kind == SyntaxKind.XmlTextLiteralNewLineToken ||
                   this.CurrentToken.Kind == SyntaxKind.MinusMinusToken)
            {
                var token = this.EatToken();
                if (token.Kind == SyntaxKind.MinusMinusToken)
                {
                    // TODO: It is possible that a non-literal gets in here. --, specifically. Is that ok?
                    token = this.WithXmlParseError(token, XmlParseErrorCode.XML_IncorrectComment);
                }

                textTokens.Add(token);
            }

            var minusMinusGreaterThanToken = this.EatToken(SyntaxKind.XmlCommentEndToken);

            this.ResetMode(saveMode);
            return(Syntax.XmlComment(lessThanExclamationMinusMinusToken, textTokens, minusMinusGreaterThanToken));
        }
コード例 #3
0
ファイル: XmlCommentParser.cs プロジェクト: sperling/cskarp
        public void ParseRemainder(SyntaxListBuilder <XmlNodeSyntax> nodes)
        {
            bool endTag = this.CurrentToken.Kind == SyntaxKind.LessThanSlashToken;

            var saveMode = this.SetMode(LexMode.XmlCDataSectionText);

            var textTokens = this.pool.Allocate();

            try
            {
                while (this.CurrentToken.Kind != SyntaxKind.EndOfDocumentationCommentToken)
                {
                    var token = this.EatToken();

                    // TODO: It is possible that a non-literal gets in here. ]]>, specifically. Is that ok?
                    textTokens.Add(token);
                }

                var allRemainderText      = Syntax.XmlText(textTokens.ToTokenList());
                XmlParseErrorArgument arg = endTag
                    ? new XmlParseErrorArgument(XmlParseErrorCode.XML_EndTagNotExpected)
                    : new XmlParseErrorArgument(XmlParseErrorCode.XML_ExpectedEndOfXml);

                allRemainderText = allRemainderText.WithAdditionalDiagnostics(this.MakeError(0, 1, ErrorCode.WRN_XMLParseError, arg));

                nodes.Add(allRemainderText);
            }
            finally
            {
                this.pool.Free(textTokens);
            }

            this.ResetMode(saveMode);
        }
コード例 #4
0
ファイル: XmlCommentParser.cs プロジェクト: sperling/cskarp
        private XmlAttributeSyntax ParseXmlAttribute()
        {
            var attrName = this.ParseXmlName();

            if (attrName.LeadingWidth == 0)
            {
                // The Xml spec requires whitespace here: STag ::= '<' Name (S Attribute)* S? '>'
                attrName = this.WithXmlParseError(attrName, XmlParseErrorCode.XML_WhitespaceMissing);
            }

            var equals = this.EatToken(SyntaxKind.EqualsToken, false);

            if (equals.IsMissing)
            {
                equals = this.WithXmlParseError(equals, XmlParseErrorCode.XML_MissingEqualsAttribute);
            }

            var attributeTextStyle = this.CurrentToken.Kind == SyntaxKind.SingleQuoteToken
                ? SyntaxKind.SingleQuoteToken
                : SyntaxKind.DoubleQuoteToken;
            var startQuote = this.EatToken(attributeTextStyle, false);

            if (startQuote.IsMissing)
            {
                startQuote = this.WithXmlParseError(startQuote, XmlParseErrorCode.XML_StringLiteralNoQuote);
            }

            var textTokens = new SyntaxListBuilder <SyntaxToken>(10);
            {
                var saveMode = this.SetMode(attributeTextStyle == SyntaxKind.SingleQuoteToken
                    ? LexMode.XmlAttributeTextQuote
                    : LexMode.XmlAttributeTextDoubleQuote);
                while (this.CurrentToken.Kind == SyntaxKind.XmlTextLiteralToken ||
                       this.CurrentToken.Kind == SyntaxKind.XmlTextLiteralNewLineToken ||
                       this.CurrentToken.Kind == SyntaxKind.XmlEntityLiteralToken ||
                       this.CurrentToken.Kind == SyntaxKind.LessThanToken)
                {
                    var token = this.EatToken();
                    if (token.Kind == SyntaxKind.LessThanToken)
                    {
                        // TODO: It is possible that a non-literal gets in here. <, specifically. Is that ok?
                        token = this.WithXmlParseError(token, XmlParseErrorCode.XML_LessThanInAttributeValue);
                    }

                    textTokens.Add(token);
                }

                this.ResetMode(saveMode);
            }

            var endQuote = this.EatToken(attributeTextStyle);

            return(Syntax.XmlAttribute(attrName, equals, startQuote, textTokens, endQuote));
        }
コード例 #5
0
        public static SyntaxNode ConvertToTriviaList(this SyntaxNode[] nodes)
        {
            var builder = new SyntaxListBuilder(nodes.Length);

            for (int i = 0; i < nodes.Length; i++)
            {
                var node = nodes[i];
                var nd   = node.GetDiagnostics();
                foreach (var token in node.GetTokens())
                {
                    builder.Add(token.GetLeadingTrivia());
                    if (token.Width > 0)
                    {
                        var text = Syntax.SkippedText(token.GetText());
                        var d    = token.GetDiagnostics();
                        if (d.Length > 0)
                        {
                            text = text.WithDiagnostics(d);
                        }

                        if (nd != null && nd.Length > 0)
                        {
                            if (token != node)
                            {
                                text = text.WithAdditionalDiagnostics(nd);
                            }

                            nd = null;
                        }

                        builder.Add(text);
                    }

                    builder.Add(token.GetTrailingTrivia());
                }
            }

            return(builder.ToListNode());
        }
コード例 #6
0
ファイル: XmlCommentParser.cs プロジェクト: sperling/cskarp
        private XmlNodeSyntax ParseXmlText()
        {
            var textTokens = new SyntaxListBuilder(10);

            while (this.CurrentToken.Kind == SyntaxKind.XmlTextLiteralToken ||
                   this.CurrentToken.Kind == SyntaxKind.XmlTextLiteralNewLineToken ||
                   this.CurrentToken.Kind == SyntaxKind.XmlEntityLiteralToken)
            {
                textTokens.Add(this.EatToken());
            }

            return(Syntax.XmlText(textTokens.ToList()));
        }
コード例 #7
0
ファイル: XmlCommentParser.cs プロジェクト: sperling/cskarp
        private void ParseXmlNodes(SyntaxListBuilder <XmlNodeSyntax> nodes)
        {
            while (true)
            {
                var node = this.ParseXmlNode();
                if (node == null)
                {
                    return;
                }

                nodes.Add(node);
            }
        }
コード例 #8
0
        public static SyntaxNode ConvertToTriviaList(this SyntaxNode[] nodes)
        {
            var builder = new SyntaxListBuilder(nodes.Length);
            for (int i = 0; i < nodes.Length; i++)
            {
                var node = nodes[i];
                var nd = node.GetDiagnostics();
                foreach (var token in node.GetTokens())
                {
                    builder.Add(token.GetLeadingTrivia());
                    if (token.Width > 0)
                    {
                        var text = Syntax.SkippedText(token.GetText());
                        var d = token.GetDiagnostics();
                        if (d.Length > 0)
                        {
                            text = text.WithDiagnostics(d);
                        }

                        if (nd != null && nd.Length > 0)
                        {
                            if (token != node)
                            {
                                text = text.WithAdditionalDiagnostics(nd);
                            }

                            nd = null;
                        }

                        builder.Add(text);
                    }

                    builder.Add(token.GetTrailingTrivia());
                }
            }

            return builder.ToListNode();
        }
コード例 #9
0
        private TNode CreateForGlobalFailure <TNode>(int position, TNode node) where TNode : LuaSyntaxNode
        {
            // Turn the complete input into a single skipped token. This avoids running the lexer, and therefore
            // the preprocessor directive parser, which may itself run into the same problem that caused the
            // original failure.
            var builder = new SyntaxListBuilder(1);

            builder.Add(SyntaxFactory.BadToken(null, _lexer.Text.ToString(), null));
            var fileAsTrivia = SyntaxFactory.SkippedTokensTrivia(builder.ToList <SyntaxToken>());

            node = AddLeadingSkippedSyntax(node, fileAsTrivia);
            ForceEndOfFile(); // force the scanner to report that it is at the end of the input.
            return(AddError(node, position, 0, ErrorCode.ERR_InsufficientStack));
        }
コード例 #10
0
ファイル: XmlCommentParser.cs プロジェクト: sperling/cskarp
        private XmlCDataSectionSyntax ParseXmlCDataSection()
        {
            var startCDataToken = this.EatToken(SyntaxKind.XmlCDataStartToken);
            var saveMode        = this.SetMode(LexMode.XmlCDataSectionText);
            var textTokens      = new SyntaxListBuilder <SyntaxToken>(10);

            while (this.CurrentToken.Kind == SyntaxKind.XmlTextLiteralToken ||
                   this.CurrentToken.Kind == SyntaxKind.XmlTextLiteralNewLineToken)
            {
                textTokens.Add(this.EatToken());
            }

            var endCDataToken = this.EatToken(SyntaxKind.XmlCDataEndToken);

            this.ResetMode(saveMode);
            return(Syntax.XmlCDataSection(startCDataToken, textTokens, endCDataToken));
        }
コード例 #11
0
ファイル: SyntaxNode.cs プロジェクト: sbauer/AspNetCore
        static void AddTokens(SyntaxNode current, SyntaxListBuilder <SyntaxToken> tokens)
        {
            if (current.SlotCount == 0 && current is SyntaxToken token)
            {
                // Token
                tokens.Add(token);
                return;
            }

            for (var i = 0; i < current.SlotCount; i++)
            {
                var child = current.GetNodeSlot(i);

                if (child != null)
                {
                    AddTokens(child, tokens);
                }
            }
        }
コード例 #12
0
        private HtmlNodeSyntax GetSyntaxNode(SyntaxKind syntaxKind)
        {
            if (syntaxKind == SyntaxKind.HtmlText)
            {
                var textTokens = new SyntaxListBuilder <SyntaxToken>(SyntaxListBuilder.Create());
                foreach (var token in Tokens)
                {
                    if (token.SyntaxKind == SyntaxKind.Unknown)
                    {
                        Debug.Assert(false, $"Unexpected html token {((HtmlToken)token).Type}");
                        continue;
                    }

                    textTokens.Add(token.SyntaxToken);
                }
                var textResult = textTokens.ToList();
                return(SyntaxFactory.HtmlText(new SyntaxList <SyntaxToken>(textResult.Node)));
            }

            return(null);
        }
コード例 #13
0
ファイル: SpanBuilder.cs プロジェクト: vyaspranjal33/Razor
        private Syntax.GreenNode GetSyntaxNode(SyntaxKind syntaxKind)
        {
            if (syntaxKind == SyntaxKind.HtmlTextLiteral)
            {
                var textTokens = new SyntaxListBuilder <SyntaxToken>(SyntaxListBuilder.Create());
                foreach (var token in Tokens)
                {
                    if (token.Kind == SyntaxKind.Unknown)
                    {
                        Debug.Assert(false, $"Unexpected token {token.Kind}");
                        continue;
                    }

                    textTokens.Add(token);
                }
                var textResult = textTokens.ToList();
                return(SyntaxFactory.HtmlTextLiteral(new SyntaxList <SyntaxToken>(textResult.Node)));
            }

            return(null);
        }
コード例 #14
0
        private static SyntaxList <RazorSyntaxNode> GetRewrittenMarkupEndTagChildren(MarkupEndTagSyntax node)
        {
            // Rewrites the children of the end tag to look like the legacy syntax tree.
            if (node.IsMarkupTransition)
            {
                var tokens       = node.DescendantNodes().Where(n => n is SyntaxToken token && !token.IsMissing).Cast <SyntaxToken>().ToArray();
                var tokenBuilder = SyntaxListBuilder <SyntaxToken> .Create();

                tokenBuilder.AddRange(tokens, 0, tokens.Length);
                var markupTransition = SyntaxFactory.MarkupTransition(tokenBuilder.ToList()).Green.CreateRed(node, node.Position);
                var spanContext      = node.GetSpanContext();
                if (spanContext != null)
                {
                    markupTransition = markupTransition.WithSpanContext(spanContext);
                }

                var builder = new SyntaxListBuilder(1);
                builder.Add(markupTransition);
                return(new SyntaxList <RazorSyntaxNode>(builder.ToListNode().CreateRed(node, node.Position)));
            }

            return(node.Children);
        }
コード例 #15
0
        private SyntaxToken ParseEndOfDirective(bool ignoreErrors, bool afterPragma = false, bool afterLineNumber = false, bool afterReference = false)
        {
            var skippedTokens = new SyntaxListBuilder<SyntaxToken>();

            // Consume all extranous tokens as leading SkippedTokens trivia.
            if (this.CurrentToken.Kind != SyntaxKind.EndOfDirectiveToken &&
                this.CurrentToken.Kind != SyntaxKind.EndOfFileToken)
            {
                skippedTokens = new SyntaxListBuilder<SyntaxToken>(10);

                if (!ignoreErrors)
                {
                    ErrorCode errorCode = ErrorCode.ERR_EndOfPPLineExpected;
                    if (afterPragma)
                    {
                        errorCode = ErrorCode.WRN_EndOfPPLineExpected;
                    }
                    else if (afterLineNumber)
                    {
                        errorCode = ErrorCode.ERR_MissingPPFile;
                    }
                    else if (afterReference)
                    {
                        errorCode = ErrorCode.ERR_ExpectedPPFile;
                    }

                    skippedTokens.Add(this.AddError(this.EatToken().WithoutDiagnosticsGreen(), errorCode));
                }

                while (this.CurrentToken.Kind != SyntaxKind.EndOfDirectiveToken &&
                       this.CurrentToken.Kind != SyntaxKind.EndOfFileToken)
                {
                    skippedTokens.Add(this.EatToken().WithoutDiagnosticsGreen());
                }
            }

            // attach text from extraneous tokens as trivia to EndOfDirective token
            SyntaxToken endOfDirective = this.CurrentToken.Kind == SyntaxKind.EndOfDirectiveToken
                                         ? this.EatToken()
                                         : SyntaxFactory.Token(SyntaxKind.EndOfDirectiveToken);

            if (!skippedTokens.IsNull)
            {
                endOfDirective = endOfDirective.WithLeadingTrivia(SyntaxFactory.SkippedTokensTrivia(skippedTokens.ToList()));
            }

            return endOfDirective;
        }
コード例 #16
0
 public SyntaxListBuilder <TNode> Add(TNode node)
 {
     _builder.Add(node);
     return(this);
 }
コード例 #17
0
        private static SyntaxList <RazorSyntaxNode> GetRewrittenMarkupStartTagChildren(MarkupStartTagSyntax node)
        {
            // Rewrites the children of the start tag to look like the legacy syntax tree.
            if (node.IsMarkupTransition)
            {
                var tokens       = node.DescendantNodes().Where(n => n is SyntaxToken token && !token.IsMissing).Cast <SyntaxToken>().ToArray();
                var tokenBuilder = SyntaxListBuilder <SyntaxToken> .Create();

                tokenBuilder.AddRange(tokens, 0, tokens.Length);
                var markupTransition = SyntaxFactory.MarkupTransition(tokenBuilder.ToList()).Green.CreateRed(node, node.Position);
                var spanContext      = node.GetSpanContext();
                if (spanContext != null)
                {
                    markupTransition = markupTransition.WithSpanContext(spanContext);
                }

                var builder = new SyntaxListBuilder(1);
                builder.Add(markupTransition);
                return(new SyntaxList <RazorSyntaxNode>(builder.ToListNode().CreateRed(node, node.Position)));
            }

            SpanContext latestSpanContext = null;
            var         children          = node.Children;
            var         newChildren       = new SyntaxListBuilder(children.Count);
            var         literals          = new List <MarkupTextLiteralSyntax>();

            foreach (var child in children)
            {
                if (child is MarkupTextLiteralSyntax literal)
                {
                    literals.Add(literal);
                    latestSpanContext = literal.GetSpanContext() ?? latestSpanContext;
                }
                else if (child is MarkupMiscAttributeContentSyntax miscContent)
                {
                    foreach (var contentChild in miscContent.Children)
                    {
                        if (contentChild is MarkupTextLiteralSyntax contentLiteral)
                        {
                            literals.Add(contentLiteral);
                            latestSpanContext = contentLiteral.GetSpanContext() ?? latestSpanContext;
                        }
                        else
                        {
                            // Pop stack
                            AddLiteralIfExists();
                            newChildren.Add(contentChild);
                        }
                    }
                }
                else
                {
                    AddLiteralIfExists();
                    newChildren.Add(child);
                }
            }

            AddLiteralIfExists();

            return(new SyntaxList <RazorSyntaxNode>(newChildren.ToListNode().CreateRed(node, node.Position)));

            void AddLiteralIfExists()
            {
                if (literals.Count > 0)
                {
                    var mergedLiteral = SyntaxUtilities.MergeTextLiterals(literals.ToArray());
                    mergedLiteral = mergedLiteral.WithSpanContext(latestSpanContext);
                    literals.Clear();
                    latestSpanContext = null;
                    newChildren.Add(mergedLiteral);
                }
            }
        }
コード例 #18
0
    private SyntaxList <RazorSyntaxNode> GetLegacyChildren()
    {
        // This method returns the children of this start tag in legacy format.
        // This is needed to generate the same classified spans as the legacy syntax tree.
        var builder = new SyntaxListBuilder(5);
        var tokens  = SyntaxListBuilder <SyntaxToken> .Create();

        var context = this.GetSpanContext();

        // We want to know if this tag contains non-whitespace attribute content to set the appropriate AcceptedCharacters.
        // The prefix of a start tag(E.g '|<foo| attr>') will have 'Any' accepted characters if non-whitespace attribute content exists.
        var acceptsAnyContext = new SpanContext(context.ChunkGenerator, SpanEditHandler.CreateDefault());

        acceptsAnyContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
        var containsAttributesContent = false;

        foreach (var attribute in Attributes)
        {
            if (!string.IsNullOrWhiteSpace(attribute.GetContent()))
            {
                containsAttributesContent = true;
                break;
            }
        }

        if (!OpenAngle.IsMissing)
        {
            tokens.Add(OpenAngle);
        }
        if (Bang != null)
        {
            builder.Add(SyntaxFactory.MarkupTextLiteral(tokens.Consume()).WithSpanContext(acceptsAnyContext));

            tokens.Add(Bang);
            var acceptsNoneContext = new SpanContext(context.ChunkGenerator, SpanEditHandler.CreateDefault());
            acceptsNoneContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
            builder.Add(SyntaxFactory.RazorMetaCode(tokens.Consume()).WithSpanContext(acceptsNoneContext));
        }
        if (!Name.IsMissing)
        {
            tokens.Add(Name);
        }

        builder.Add(SyntaxFactory.MarkupTextLiteral(tokens.Consume()).WithSpanContext(containsAttributesContent ? acceptsAnyContext : context));

        builder.AddRange(Attributes);

        if (ForwardSlash != null)
        {
            tokens.Add(ForwardSlash);
        }
        if (!CloseAngle.IsMissing)
        {
            tokens.Add(CloseAngle);
        }

        if (tokens.Count > 0)
        {
            builder.Add(SyntaxFactory.MarkupTextLiteral(tokens.Consume()).WithSpanContext(context));
        }

        return(new SyntaxList <RazorSyntaxNode>(builder.ToListNode().CreateRed(this, Position)));
    }