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; |
+ } |
} |