| Index: pkg/compiler/lib/src/scanner/scanner_task.dart
|
| diff --git a/pkg/compiler/lib/src/scanner/scanner_task.dart b/pkg/compiler/lib/src/scanner/scanner_task.dart
|
| index b40dbf7acb94c443d2fde6529d0be6df3b492765..3d694a3d7110d4762f94b5764be74e85461665d2 100644
|
| --- a/pkg/compiler/lib/src/scanner/scanner_task.dart
|
| +++ b/pkg/compiler/lib/src/scanner/scanner_task.dart
|
| @@ -8,13 +8,30 @@ import '../common/tasks.dart' show CompilerTask;
|
| import '../compiler.dart' show Compiler;
|
| import '../elements/elements.dart' show CompilationUnitElement, LibraryElement;
|
| import '../script.dart' show Script;
|
| +import '../parser/diet_parser_task.dart' show DietParserTask;
|
| import '../tokens/token.dart' show Token;
|
| +import '../tokens/token_constants.dart' as Tokens show COMMENT_TOKEN, EOF_TOKEN;
|
| +import '../tokens/token_map.dart' show TokenMap;
|
|
|
| import 'scanner.dart' show Scanner;
|
| import 'string_scanner.dart' show StringScanner;
|
|
|
| class ScannerTask extends CompilerTask {
|
| - ScannerTask(Compiler compiler) : super(compiler);
|
| + final DietParserTask _dietParser;
|
| + final bool _preserveComments;
|
| + final TokenMap _commentMap;
|
| +
|
| + ScannerTask(Compiler compiler, this._dietParser,
|
| + {bool preserveComments: false, TokenMap commentMap})
|
| + : _preserveComments = preserveComments,
|
| + _commentMap = commentMap,
|
| + super(compiler) {
|
| + if (_preserveComments && _commentMap == null) {
|
| + throw new ArgumentError(
|
| + "commentMap must be provided if preserveComments is true");
|
| + }
|
| + }
|
| +
|
| String get name => 'Scanner';
|
|
|
| void scanLibrary(LibraryElement library) {
|
| @@ -37,13 +54,12 @@ class ScannerTask extends CompilerTask {
|
|
|
| void scanElements(CompilationUnitElement compilationUnit) {
|
| Script script = compilationUnit.script;
|
| - Token tokens = new Scanner(script.file,
|
| - includeComments: compiler.options.preserveComments)
|
| - .tokenize();
|
| - if (compiler.options.preserveComments) {
|
| - tokens = compiler.processAndStripComments(tokens);
|
| + Token tokens =
|
| + new Scanner(script.file, includeComments: _preserveComments).tokenize();
|
| + if (_preserveComments) {
|
| + tokens = processAndStripComments(tokens);
|
| }
|
| - compiler.dietParser.dietParse(compilationUnit, tokens);
|
| + _dietParser.dietParse(compilationUnit, tokens);
|
| }
|
|
|
| /**
|
| @@ -59,4 +75,26 @@ class ScannerTask extends CompilerTask {
|
| .tokenize();
|
| });
|
| }
|
| +
|
| + Token processAndStripComments(Token currentToken) {
|
| + Token firstToken = currentToken;
|
| + Token prevToken;
|
| + while (currentToken.kind != Tokens.EOF_TOKEN) {
|
| + if (identical(currentToken.kind, Tokens.COMMENT_TOKEN)) {
|
| + Token firstCommentToken = currentToken;
|
| + while (identical(currentToken.kind, Tokens.COMMENT_TOKEN)) {
|
| + currentToken = currentToken.next;
|
| + }
|
| + _commentMap[currentToken] = firstCommentToken;
|
| + if (prevToken == null) {
|
| + firstToken = currentToken;
|
| + } else {
|
| + prevToken.next = currentToken;
|
| + }
|
| + }
|
| + prevToken = currentToken;
|
| + currentToken = currentToken.next;
|
| + }
|
| + return firstToken;
|
| + }
|
| }
|
|
|