| Index: pkg/front_end/lib/src/fasta/scanner/token.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/scanner/token.dart b/pkg/front_end/lib/src/fasta/scanner/token.dart
|
| index 003f16b8840049f9354c0ad62a56cd9b6f1e1b8c..e6d6b3498943b02de498a27d364c083ca25f970a 100644
|
| --- a/pkg/front_end/lib/src/fasta/scanner/token.dart
|
| +++ b/pkg/front_end/lib/src/fasta/scanner/token.dart
|
| @@ -17,7 +17,7 @@ import 'string_canonicalizer.dart';
|
| /**
|
| * A token that doubles as a linked list.
|
| */
|
| -abstract class Token implements analyzer.Token {
|
| +abstract class Token implements analyzer.TokenWithComment {
|
| /**
|
| * The character offset of the start of this token within the source text.
|
| */
|
| @@ -45,7 +45,15 @@ abstract class Token implements analyzer.Token {
|
| * comments can be reached by following the token stream using [next] until
|
| * `null` is returned.
|
| */
|
| - Token precedingComments;
|
| + CommentToken precedingCommentTokens;
|
| +
|
| + @override
|
| + analyzer.CommentToken get precedingComments => precedingCommentTokens;
|
| +
|
| + @override
|
| + void set precedingComments(analyzer.CommentToken token) {
|
| + precedingCommentTokens = token;
|
| + }
|
|
|
| /**
|
| * The precedence info for this token. [info] determines the kind and the
|
| @@ -164,7 +172,7 @@ abstract class Token implements analyzer.Token {
|
| @override
|
| void applyDelta(int delta) {
|
| charOffset += delta;
|
| - Token token = precedingComments;
|
| + CommentToken token = precedingComments;
|
| while (token != null) {
|
| token.applyDelta(delta);
|
| token = token.next;
|
| @@ -174,7 +182,7 @@ abstract class Token implements analyzer.Token {
|
| @override
|
| analyzer.Token copy() {
|
| return copyWithoutComments()
|
| - ..precedingComments = copyComments(precedingComments) as Token;
|
| + ..precedingComments = copyComments(precedingComments);
|
| }
|
|
|
| @override
|
| @@ -302,7 +310,7 @@ class KeywordToken extends Token {
|
| * number literals, comments, and error tokens, using the corresponding
|
| * precedence info.
|
| */
|
| -class StringToken extends Token {
|
| +class StringToken extends Token implements analyzer.StringToken {
|
| /**
|
| * The length threshold above which substring tokens are computed lazily.
|
| *
|
| @@ -404,6 +412,95 @@ class StringToken extends Token {
|
| @override
|
| Token copyWithoutComments() =>
|
| new StringToken._(info, valueOrLazySubstring, charOffset);
|
| +
|
| + @override
|
| + String value() => lexeme;
|
| +}
|
| +
|
| +class CommentToken extends StringToken implements analyzer.CommentToken {
|
| + /**
|
| + * Creates a lazy comment token. If [canonicalize] is true, the string
|
| + * is canonicalized before the token is created.
|
| + */
|
| + CommentToken.fromSubstring(
|
| + PrecedenceInfo info, String data, int start, int end, int charOffset,
|
| + {bool canonicalize: false})
|
| + : super.fromSubstring(info, data, start, end, charOffset,
|
| + canonicalize: canonicalize);
|
| +
|
| + /**
|
| + * Creates a lazy string token. If [asciiOnly] is false, the byte array
|
| + * is passed through a UTF-8 decoder.
|
| + */
|
| + CommentToken.fromUtf8Bytes(PrecedenceInfo info, List<int> data, int start,
|
| + int end, bool asciiOnly, int charOffset)
|
| + : super.fromUtf8Bytes(info, data, start, end, asciiOnly, charOffset);
|
| +
|
| + CommentToken._(PrecedenceInfo info, valueOrLazySubstring, int charOffset)
|
| + : super._(info, valueOrLazySubstring, charOffset);
|
| +
|
| + @override
|
| + CommentToken copy() =>
|
| + new CommentToken._(info, valueOrLazySubstring, charOffset);
|
| +
|
| + @override
|
| + analyzer.TokenWithComment get parent {
|
| + Token token = next;
|
| + while (token is CommentToken) {
|
| + token = token.next;
|
| + }
|
| + return token;
|
| + }
|
| +
|
| + @override
|
| + void set parent(analyzer.TokenWithComment ignored) {
|
| + throw 'unsupported operation';
|
| + }
|
| +
|
| + @override
|
| + void remove() {
|
| + // TODO: implement remove
|
| + throw 'not implemented yet';
|
| + }
|
| +}
|
| +
|
| +class DartDocToken extends CommentToken
|
| + implements analyzer.DocumentationCommentToken {
|
| + /**
|
| + * The references embedded within the documentation comment.
|
| + * This list will be empty unless this is a documentation comment that has
|
| + * references embedded within it.
|
| + */
|
| + final List<Token> references = <Token>[];
|
| +
|
| + /**
|
| + * Creates a lazy comment token. If [canonicalize] is true, the string
|
| + * is canonicalized before the token is created.
|
| + */
|
| + DartDocToken.fromSubstring(
|
| + PrecedenceInfo info, String data, int start, int end, int charOffset,
|
| + {bool canonicalize: false})
|
| + : super.fromSubstring(info, data, start, end, charOffset,
|
| + canonicalize: canonicalize);
|
| +
|
| + /**
|
| + * Creates a lazy string token. If [asciiOnly] is false, the byte array
|
| + * is passed through a UTF-8 decoder.
|
| + */
|
| + DartDocToken.fromUtf8Bytes(PrecedenceInfo info, List<int> data, int start,
|
| + int end, bool asciiOnly, int charOffset)
|
| + : super.fromUtf8Bytes(info, data, start, end, asciiOnly, charOffset);
|
| +
|
| + DartDocToken._(PrecedenceInfo info, valueOrLazySubstring, int charOffset)
|
| + : super._(info, valueOrLazySubstring, charOffset);
|
| +
|
| + @override
|
| + DartDocToken copy() {
|
| + DartDocToken copy =
|
| + new DartDocToken._(info, valueOrLazySubstring, charOffset);
|
| + references.forEach((ref) => copy.references.add(ref.copy()));
|
| + return copy;
|
| + }
|
| }
|
|
|
| /**
|
|
|