Exemple #1
0
        private LineColumnDelta FormatStructuredTrivia(
            LineColumn lineColumn, SyntaxTrivia trivia, List <SyntaxTrivia> changes, CancellationToken cancellationToken)
        {
            if (trivia.CSharpKind() == SyntaxKind.SkippedTokensTrivia)
            {
                // don't touch anything if it contains skipped tokens
                this.succeeded = false;
                changes.Add(trivia);

                return(GetLineColumnDelta(lineColumn, trivia));
            }

            // TODO : make document comment to be formatted by structured trivia formatter as well.
            if (!trivia.IsDocComment())
            {
                var result = CSharpStructuredTriviaFormatEngine.Format(
                    trivia, this.InitialLineColumn.Column, this.OptionSet, this.FormattingRules, cancellationToken);
                var formattedTrivia = SyntaxFactory.Trivia((StructuredTriviaSyntax)result.GetFormattedRoot(cancellationToken));

                changes.Add(formattedTrivia);
                return(GetLineColumnDelta(lineColumn, formattedTrivia));
            }

            var docComment = FormatDocumentComment(lineColumn, trivia);

            changes.Add(docComment);

            return(GetLineColumnDelta(lineColumn, docComment));
        }
Exemple #2
0
        private bool TryFormatMultiLineCommentTrivia(LineColumn lineColumn, SyntaxTrivia trivia, out SyntaxTrivia result)
        {
            if (trivia.Kind() == SyntaxKind.MultiLineCommentTrivia)
            {
                var indentation      = lineColumn.Column;
                var indentationDelta = indentation - GetExistingIndentation(trivia);
                if (indentationDelta != 0)
                {
                    var multiLineComment = trivia.ToFullString().ReindentStartOfXmlDocumentationComment(
                        false /* forceIndentation */,
                        indentation,
                        indentationDelta,
                        this.Options.GetOption(FormattingOptions2.UseTabs),
                        this.Options.GetOption(FormattingOptions2.TabSize),
                        this.Options.GetOption(FormattingOptions2.NewLine));

                    var multilineCommentTrivia = SyntaxFactory.ParseLeadingTrivia(multiLineComment);
                    Contract.ThrowIfFalse(multilineCommentTrivia.Count == 1);

                    // Preserve annotations on this comment as the formatter is only supposed to touch whitespace, and
                    // thus should make it appear as if the original comment trivia (with annotations) is still there in
                    // the resultant formatted tree.
                    var firstTrivia = multilineCommentTrivia.First();
                    result = trivia.CopyAnnotationsTo(firstTrivia);
                    return(true);
                }
            }

            result = default;
            return(false);
        }
Exemple #3
0
        private LineColumnDelta FormatStructuredTrivia(
            LineColumn lineColumn, SyntaxTrivia trivia, ArrayBuilder <TextChange> changes, CancellationToken cancellationToken)
        {
            if (trivia.Kind() == SyntaxKind.SkippedTokensTrivia)
            {
                // don't touch anything if it contains skipped tokens
                _succeeded = false;
                return(GetLineColumnDelta(lineColumn, trivia));
            }

            // TODO : make document comment to be formatted by structured trivia formatter as well.
            if (!trivia.IsDocComment())
            {
                var result = CSharpStructuredTriviaFormatEngine.Format(
                    trivia, this.InitialLineColumn.Column, this.Options, this.FormattingRules, cancellationToken);
                if (result.GetTextChanges(cancellationToken).Count == 0)
                {
                    return(GetLineColumnDelta(lineColumn, trivia));
                }

                changes.AddRange(result.GetTextChanges(cancellationToken));

                var formattedTrivia = SyntaxFactory.Trivia((StructuredTriviaSyntax)result.GetFormattedRoot(cancellationToken));
                return(GetLineColumnDelta(lineColumn, formattedTrivia));
            }

            var docComment = FormatDocumentComment(lineColumn, trivia);

            if (docComment != trivia)
            {
                changes.Add(new TextChange(trivia.FullSpan, docComment.ToFullString()));
            }

            return(GetLineColumnDelta(lineColumn, docComment));
        }
Exemple #4
0
        private bool TryFormatMultiLineCommentTrivia(LineColumn lineColumn, SyntaxTrivia trivia, out SyntaxTrivia result)
        {
            result = default(SyntaxTrivia);

            if (trivia.CSharpKind() != SyntaxKind.MultiLineCommentTrivia)
            {
                return(false);
            }

            var indentation      = lineColumn.Column;
            var indentationDelta = indentation - GetExistingIndentation(trivia);

            if (indentationDelta != 0)
            {
                var multiLineComment = trivia.ToFullString().ReindentStartOfXmlDocumentationComment(
                    false /* forceIndentation */,
                    indentation,
                    indentationDelta,
                    this.OptionSet.GetOption(FormattingOptions.UseTabs, LanguageNames.CSharp),
                    this.OptionSet.GetOption(FormattingOptions.TabSize, LanguageNames.CSharp));

                var multilineCommentTrivia = SyntaxFactory.ParseLeadingTrivia(multiLineComment);
                Contract.ThrowIfFalse(multilineCommentTrivia.Count == 1);

                result = multilineCommentTrivia.ElementAt(0);
                return(true);
            }

            return(false);
        }
Exemple #5
0
 public void LineColumnEquality()
 {
     var a1 = new LineColumn(1, 2);
     var a2 = new LineColumn(1, 2);
     var b = new LineColumn(2, 1);
     (a1 == a2).ShouldBe(true);
     (a1 != b).ShouldBe(true);
     Equals(a1, b).ShouldBe(false);
     a1.GetHashCode().ShouldBe(a2.GetHashCode());
 }
Exemple #6
0
        private SyntaxTrivia FormatDocumentComment(LineColumn lineColumn, SyntaxTrivia trivia)
        {
            var indentation = lineColumn.Column;

            if (trivia.IsSingleLineDocComment())
            {
                var text = trivia.ToFullString();

                // When the doc comment is parsed from source, even if it is only one
                // line long, the end-of-line will get included into the trivia text.
                // If the doc comment was parsed from a text fragment, there may not be
                // an end-of-line at all. We need to trim the end before we check the
                // number of line breaks in the text.
                var textWithoutFinalNewLine = text.TrimEnd(null);
                if (!textWithoutFinalNewLine.ContainsLineBreak())
                {
                    return(trivia);
                }

                var singleLineDocumentationCommentExteriorCommentRewriter =
                    new DocumentationCommentExteriorCommentRewriter(
                        true /* forceIndentation */
                        ,
                        indentation,
                        0 /* indentationDelta */
                        ,
                        this.Options
                        );
                var newTrivia = singleLineDocumentationCommentExteriorCommentRewriter.VisitTrivia(
                    trivia
                    );

                return(newTrivia);
            }

            var indentationDelta = indentation - GetExistingIndentation(trivia);

            if (indentationDelta == 0)
            {
                return(trivia);
            }

            var multiLineDocumentationCommentExteriorCommentRewriter =
                new DocumentationCommentExteriorCommentRewriter(
                    false /* forceIndentation */
                    ,
                    indentation,
                    indentationDelta,
                    this.Options
                    );
            var newMultiLineTrivia =
                multiLineDocumentationCommentExteriorCommentRewriter.VisitTrivia(trivia);

            return(newMultiLineTrivia);
        }
Exemple #7
0
        public void LineColumnEquality()
        {
            var a1 = new LineColumn(1, 2);
            var a2 = new LineColumn(1, 2);
            var b  = new LineColumn(2, 1);

            (a1 == a2).ShouldBe(true);
            (a1 != b).ShouldBe(true);
            Equals(a1, b).ShouldBe(false);
            a1.GetHashCode().ShouldBe(a2.GetHashCode());
        }
Exemple #8
0
        protected override LineColumnDelta Format(
            LineColumn lineColumn, SyntaxTrivia trivia, ArrayBuilder <TextChange> changes, CancellationToken cancellationToken)
        {
            if (trivia.HasStructure)
            {
                return(FormatStructuredTrivia(lineColumn, trivia, changes, cancellationToken));
            }

            if (TryFormatMultiLineCommentTrivia(lineColumn, trivia, out var newComment))
            {
                changes.Add(new TextChange(trivia.FullSpan, newComment.ToFullString()));
                return(GetLineColumnDelta(lineColumn, newComment));
            }

            return(GetLineColumnDelta(lineColumn, trivia));
        }
        protected override LineColumnDelta Format(
            LineColumn lineColumn, SyntaxTrivia trivia, List <SyntaxTrivia> changes,
            CancellationToken cancellationToken)
        {
            if (trivia.HasStructure)
            {
                return(FormatStructuredTrivia(lineColumn, trivia, changes, cancellationToken));
            }

            if (TryFormatMultiLineCommentTrivia(lineColumn, trivia, out var newComment))
            {
                changes.Add(newComment);
                return(GetLineColumnDelta(lineColumn, newComment));
            }

            changes.Add(trivia);
            return(GetLineColumnDelta(lineColumn, trivia));
        }
Exemple #10
0
        protected override LineColumnDelta Format(
            LineColumn lineColumn, SyntaxTrivia commonTrivia, List <TextChange> changes, CancellationToken cancellationToken)
        {
            var trivia = (SyntaxTrivia)commonTrivia;

            if (trivia.HasStructure)
            {
                return(FormatStructuredTrivia(lineColumn, trivia, changes, cancellationToken));
            }

            var newComment = default(SyntaxTrivia);

            if (TryFormatMultiLineCommentTrivia(lineColumn, trivia, out newComment))
            {
                changes.Add(new TextChange(trivia.FullSpan, newComment.ToFullString()));
                return(GetLineColumnDelta(lineColumn, newComment));
            }

            return(GetLineColumnDelta(lineColumn, commonTrivia));
        }
Exemple #11
0
 public static LexerException UnexpectedToken(string expected, string token, LineColumn lc) => new LexerException("Unexpected token '" + token + "' at " + lc + "! Expected " + expected);
Exemple #12
0
 internal static System.Exception InvalidToken(string reason, string token, LineColumn lc) => new LexerException("Invalid token '" + token + "' at " + lc + "! " + reason);
Exemple #13
0
        private string ct = string.Empty; // Current Token
        public Token[] Tokenize()
        {
            lc     = new LineColumn();
            tokens = new List <Token>();

            bool isBody        = false,
                 isInstruction = false,
                 isEOF         = false;

            int  r;
            char cc; // Current Character

            while (true)
            {
                r  = sourceStream.Read();
                cc = (char)r;

                if (r == -1)
                {
                    cc    = '\r'; // End of file is represented as a clear line
                    isEOF = true;
                }

                lc.NextColumn();

                switch (cc)
                {
                case ' ':
                case '\n':
                case '\t':
                case '\r':
                    addPrevToken(isBody, ref isInstruction);

                    if (cc == '\n')
                    {
                        lc.NextLine();
                        isInstruction = true;
                    }
                    else if (isEOF)
                    {
                        break;
                    }

                    continue;

                case '+':
                case '-':
                case '*':
                case '/':
                case '&':       //Bitwise and
                case '|':       // or
                case '^':       // xor
                    addPrevToken(isBody, ref isInstruction);
                    addToken(TokenType.Operation, cc);
                    continue;

                case '.':
                    if (!isBody)
                    {
                        readWord(); addToken(TokenType.Directive);
                    }
                    else
                    {
                        addToken(TokenType.Variable);
                    }
                    isBody        = false;
                    isInstruction = false;
                    continue;

                case '$':
                    if (isBody)
                    {
                        readRegister(); addToken(TokenType.Register);
                    }
                    continue;

                case '"':
                    readString();
                    addToken(TokenType.String);
                    continue;

                case '\'':
                    readChar();
                    addToken(TokenType.Char);
                    continue;

                case ':':
                    if (isBody)
                    {
                        addToken(TokenType.Label);
                    }
                    continue;

                case ';':
                    readComment();
                    addToken(TokenType.Comment);
                    continue;

                case '(':
                    addToken(TokenType.FunctionDeclaration);
                    isBody        = false;
                    isInstruction = false;
                    continue;

                case ')':
                    if (ct.Length > 0)
                    {
                        addToken(TokenType.Literal);                    // Add the last argument name
                    }
                    addToken(TokenType.FunctionBody);                   // Add token for start of function body
                    isBody        = true;
                    isInstruction = true;
                    continue;

                default:
                    if (ct.Length == 0 && char.IsDigit(cc))
                    {
                        readNumber(cc); addToken(TokenType.Number); continue;
                    }

                    break;
                }

                if (isEOF)
                {
                    break;
                }
                ct += cc;
            }

            return(tokens.ToArray());
        }
 public Range(LineColumn start, LineColumn end)
 {
     Start = start;
     End = end;
 }
 public bool Equals(LineColumn other)
 {
     return this.Line.Equals(other.Line) &&
            this.Column.Equals(other.Column);
 }
 public bool Equals(LineColumn other)
 {
     return(this.Line.Equals(other.Line) &&
            this.Column.Equals(other.Column));
 }
 public Range(LineColumn start, LineColumn end)
 {
     Start = start;
     End   = end;
 }