Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/compiler.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart |
| index 636fcc530952bc44532781cfc2215c708c93adf1..220b9fe613f88d1786b292099b0f0d550a55915c 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/compiler.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/compiler.dart |
| @@ -103,6 +103,32 @@ abstract class Backend { |
| void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {} |
| } |
| +class CommentTokenMapEntry { |
|
ahe
2013/01/03 13:04:09
Document class please. How about:
/// An entry in
|
| + final key; |
|
ahe
2013/01/03 13:04:09
Add types one these two fields please.
|
| + final value; |
| + |
| + CommentTokenMapEntry(this.key, this.value); |
| +} |
| + |
| +/** |
| + * Map of tokens and the first associated comment. |
|
ahe
2013/01/03 13:04:09
One line comment?
|
| + */ |
| +class CommentTokenMap { |
| + Link<CommentTokenMapEntry> entries = const Link<CommentTokenMapEntry>(); |
| + |
| + Token operator[] (Token key) { |
| + for (CommentTokenMapEntry entry in entries) { |
|
ahe
2013/01/03 13:04:09
This seems like a sub-optimal implementation. I wo
|
| + if (entry.key == key) { |
| + return entry.value; |
| + } |
| + } |
| + } |
| + |
| + void operator[]= (Token key, Token value) { |
| + entries = entries.prepend(new CommentTokenMapEntry(key, value)); |
| + } |
| +} |
| + |
| abstract class Compiler implements DiagnosticListener { |
| final Map<String, LibraryElement> libraries; |
| final Stopwatch totalCompileTime = new Stopwatch(); |
| @@ -111,6 +137,11 @@ abstract class Compiler implements DiagnosticListener { |
| String assembledCode; |
| Types types; |
| + /** |
| + * Map from token to the first preceeding comment token. |
| + */ |
| + final CommentTokenMap commentMap = new CommentTokenMap(); |
| + |
| final bool enableMinification; |
| final bool enableTypeAssertions; |
| final bool enableUserAssertions; |
| @@ -125,6 +156,11 @@ abstract class Compiler implements DiagnosticListener { |
| final bool rejectDeprecatedFeatures; |
| final bool checkDeprecationInSdk; |
| + /** |
| + * If [:true:], comment tokens are collected in [commentMap] during scanning. |
| + */ |
| + final bool preserveComments; |
| + |
| bool disableInlining = false; |
| final Tracer tracer; |
| @@ -247,6 +283,7 @@ abstract class Compiler implements DiagnosticListener { |
| this.analyzeAll: false, |
| this.rejectDeprecatedFeatures: false, |
| this.checkDeprecationInSdk: false, |
| + this.preserveComments: false, |
| List<String> strips: const []}) |
| : libraries = new Map<String, LibraryElement>(), |
| progress = new Stopwatch() { |
| @@ -898,6 +935,28 @@ abstract class Compiler implements DiagnosticListener { |
| => interceptorsLibrary.findLocal(name); |
| bool get isMockCompilation => false; |
| + |
| + Token processAndStripComments(Token currentToken) { |
| + Token firstToken = currentToken; |
| + Token prevToken; |
| + while (currentToken.kind != EOF_TOKEN) { |
| + if (identical(currentToken.kind, COMMENT_TOKEN)) { |
| + Token firstCommentToken = currentToken; |
| + while (identical(currentToken.kind, COMMENT_TOKEN)) { |
| + currentToken = currentToken.next; |
| + } |
| + commentMap[currentToken] = firstCommentToken; |
| + if (prevToken == null) { |
| + firstToken = currentToken; |
| + } else { |
| + prevToken.next = currentToken; |
| + } |
| + } |
| + prevToken = currentToken; |
| + currentToken = currentToken.next; |
| + } |
| + return firstToken; |
| + } |
| } |
| class CompilerTask { |