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)); }
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); }
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)); }
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); }
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()); }
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); }
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)); }
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)); }
public static LexerException UnexpectedToken(string expected, string token, LineColumn lc) => new LexerException("Unexpected token '" + token + "' at " + lc + "! Expected " + expected);
internal static System.Exception InvalidToken(string reason, string token, LineColumn lc) => new LexerException("Invalid token '" + token + "' at " + lc + "! " + reason);
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)); }