Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(208)

Unified Diff: sdk/lib/_internal/compiler/implementation/compiler.dart

Issue 11726005: Dartdoc comments retrieved as metadata through dart2js mirrors. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated cf. comments. Created 7 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..06bc8a27ec79006f8669d8ef217debe92faad15d 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -103,6 +103,44 @@ abstract class Backend {
void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {}
}
+/**
+ * Key class used in [TokenKeyMap] in which the hash code for a token is based
+ * on the [charOffset].
+ */
+class TokenKey {
+ final Token token;
+ TokenKey(this.token);
+ int get hashCode => token.charOffset;
+ operator==(other) => other is TokenKey && token == other.token;
+}
+
+/**
+ * Map of tokens and the first associated comment.
+ *
+ * This implementation was chosen among several candidates for its space/time
Andrei Mouravski 2013/01/04 17:46:24 Since it is an implementation detail, this rationa
Johnni Winther 2013/01/08 13:39:46 Done.
+ * efficiency by empirical tests of running dartdoc on dartdoc itself. Time
+ * measurements for the use of [Compiler.commentMap]:
+ *
+ * 1) Using [TokenKey] as key (this class): ~80 msec
+ * 2) Using [TokenKey] as key + storing a separate map in each script: ~120 msec
+ * 3) Using [Token] as key in a [Map]: ~38000 msec
+ * 4) Storing comments is new field in [Token]: ~20 msec
+ * (Abandoned due to the increased memory usage)
+ * 5) Storing comments in an [Expando]: ~14000 msec
+ * 6) Storing token/comments pairs in a linked list: ~5400 msec
+ */
+class TokenKeyMap {
ahe 2013/01/08 11:59:43 This really is a TokenMap.
Johnni Winther 2013/01/08 13:39:46 Done.
+ Map<TokenKey,Token> comments = new Map<TokenKey,Token>();
+
+ Token operator[] (Token key) {
+ return comments[new TokenKey(key)];
+ }
+
+ void operator[]= (Token key, Token value) {
+ comments[new TokenKey(key)] = value;
+ }
+}
+
abstract class Compiler implements DiagnosticListener {
final Map<String, LibraryElement> libraries;
final Stopwatch totalCompileTime = new Stopwatch();
@@ -111,6 +149,11 @@ abstract class Compiler implements DiagnosticListener {
String assembledCode;
Types types;
+ /**
+ * Map from token to the first preceeding comment token.
+ */
+ final TokenKeyMap commentMap = new TokenKeyMap();
+
final bool enableMinification;
final bool enableTypeAssertions;
final bool enableUserAssertions;
@@ -125,6 +168,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;
@@ -153,6 +201,8 @@ abstract class Compiler implements DiagnosticListener {
ClassElement typeClass;
ClassElement mapClass;
ClassElement jsInvocationMirrorClass;
+ /// Document class from dart:mirrors.
+ ClassElement documentClass;
Element assertMethod;
Element identicalFunction;
Element functionApplyMethod;
@@ -247,6 +297,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() {
@@ -503,6 +554,13 @@ abstract class Compiler implements DiagnosticListener {
jsInvocationMirrorClass.ensureResolved(this);
invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(
const SourceString('invokeOn'));
+
+ if (preserveComments) {
+ var uri = new Uri.fromComponents(scheme: 'dart', path: 'mirrors');
+ LibraryElement libraryElement =
+ libraryLoader.loadLibrary(uri, null, uri);
+ documentClass = libraryElement.find(const SourceString('Comment'));
+ }
}
void importHelperLibrary(LibraryElement library) {
@@ -898,6 +956,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 {

Powered by Google App Engine
This is Rietveld 408576698