| Index: pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart | 
| diff --git a/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart | 
| index dba3246a6672aefeb3a34008c56fbe292eb49e4e..48933b1222debe45b4ec49b3fffedd0a87c2e492 100644 | 
| --- a/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart | 
| +++ b/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart | 
| @@ -11,7 +11,14 @@ import 'keyword.dart' show Keyword; | 
| import 'precedence.dart' show EOF_INFO, PrecedenceInfo; | 
|  | 
| import 'token.dart' | 
| -    show BeginGroupToken, KeywordToken, StringToken, SymbolToken, Token; | 
| +    show | 
| +        BeginGroupToken, | 
| +        CommentToken, | 
| +        DartDocToken, | 
| +        KeywordToken, | 
| +        StringToken, | 
| +        SymbolToken, | 
| +        Token; | 
|  | 
| import 'token_constants.dart' | 
| show | 
| @@ -47,7 +54,7 @@ abstract class ArrayBasedScanner extends AbstractScanner { | 
| tail.next.previousToken = tail; | 
| tail = tail.next; | 
| if (comments != null) { | 
| -      tail.precedingComments = comments; | 
| +      tail.precedingCommentTokens = comments; | 
| comments = null; | 
| commentsTail = null; | 
| } | 
| @@ -227,7 +234,17 @@ abstract class ArrayBasedScanner extends AbstractScanner { | 
|  | 
| void appendComment(start, PrecedenceInfo info, bool asciiOnly) { | 
| if (!includeComments) return; | 
| -    Token newComment = createSubstringToken(info, start, asciiOnly); | 
| +    Token newComment = createCommentToken(info, start, asciiOnly); | 
| +    _appendToCommentStream(newComment); | 
| +  } | 
| + | 
| +  void appendDartDoc(start, PrecedenceInfo info, bool asciiOnly) { | 
| +    if (!includeComments) return; | 
| +    Token newComment = createDartDocToken(info, start, asciiOnly); | 
| +    _appendToCommentStream(newComment); | 
| +  } | 
| + | 
| +  void _appendToCommentStream(Token newComment) { | 
| if (comments == null) { | 
| comments = newComment; | 
| commentsTail = comments; | 
| @@ -262,6 +279,32 @@ abstract class ArrayBasedScanner extends AbstractScanner { | 
| [int extraOffset = 0]); | 
|  | 
| /** | 
| +   * Returns a new comment from the scan offset [start] to the current | 
| +   * [scanOffset] plus the [extraOffset]. For example, if the current | 
| +   * scanOffset is 10, then [appendSubstringToken(5, -1)] will append the | 
| +   * substring string [5,9). | 
| +   * | 
| +   * Note that [extraOffset] can only be used if the covered character(s) are | 
| +   * known to be ASCII. | 
| +   */ | 
| +  CommentToken createCommentToken( | 
| +      PrecedenceInfo info, int start, bool asciiOnly, | 
| +      [int extraOffset = 0]); | 
| + | 
| +  /** | 
| +   * Returns a new dartdoc from the scan offset [start] to the current | 
| +   * [scanOffset] plus the [extraOffset]. For example, if the current | 
| +   * scanOffset is 10, then [appendSubstringToken(5, -1)] will append the | 
| +   * substring string [5,9). | 
| +   * | 
| +   * Note that [extraOffset] can only be used if the covered character(s) are | 
| +   * known to be ASCII. | 
| +   */ | 
| +  DartDocToken createDartDocToken( | 
| +      PrecedenceInfo info, int start, bool asciiOnly, | 
| +      [int extraOffset = 0]); | 
| + | 
| +  /** | 
| * This method is called to discard '<' from the "grouping" stack. | 
| * | 
| * [PartialParser.skipExpression] relies on the fact that we do not | 
|  |