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

Unified Diff: lib/dartdoc/mirrors/dart2js_mirror.dart

Issue 10701091: Dartdoc and Apidoc updated to use dart2js through the mirror system. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: create-sdk.py updated Created 8 years, 5 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: lib/dartdoc/mirrors/dart2js_mirror.dart
diff --git a/lib/dartdoc/mirrors/dart2js_mirror.dart b/lib/dartdoc/mirrors/dart2js_mirror.dart
index 5bc3a9cf79e07d2e69251c96f838ce69cfe6ad57..d86c6eea6806769d473324b38a637d75780a9f39 100644
--- a/lib/dartdoc/mirrors/dart2js_mirror.dart
+++ b/lib/dartdoc/mirrors/dart2js_mirror.dart
@@ -170,6 +170,109 @@ class Dart2jsDiagnosticListener implements DiagnosticListener {
}
//------------------------------------------------------------------------------
+// Compiler extension for apidoc
kasperl 2012/07/06 12:40:41 Terminate comment with .
Johnni Winther 2012/07/09 14:57:18 Done.
+//------------------------------------------------------------------------------
+
+/**
+ * Extension of the compiler that enables the analysis of several libraries with
+ * no particular entry point.
+ */
+class LibraryCompiler extends api.Compiler {
+ LibraryCompiler(diagnostics.ReadStringFromUri provider,
+ diagnostics.DiagnosticHandler handler,
+ Uri libraryRoot, Uri packageRoot,
+ List<String> options)
+ : super(provider, handler, libraryRoot, packageRoot, options) {
+ checker = new LibraryTypeCheckerTask(this);
+ resolver = new LibraryResolverTask(this);
+ }
+
+ // TODO(johnniwinther): The following methods are added to enable the analysis
+ // of a collection of libraries to be used for apidoc. Most of the methods
+ // are based on copies of existing methods and could probably be implemented
+ // such that the duplicate code is avoided. Not to affect the correctness and
+ // speed of dart2js as is, the redundancy is accepted temporarily.
+
+ /**
+ * Run the compiler on a list of libraries. No entry point is used.
+ */
+ bool runList(List<Uri> uriList) {
+ bool success = _runList(uriList);
+ for (final task in tasks) {
+ log('${task.name} took ${task.timing}msec');
+ }
+ return success;
+ }
+
+ bool _runList(List<Uri> uriList) {
+ try {
+ runCompilerList(uriList);
+ } catch (CompilerCancelledException exception) {
+ log(exception.toString());
+ log('compilation failed');
+ return false;
+ }
+ tracer.close();
+ log('compilation succeeded');
+ return true;
+ }
+
+ void runCompilerList(List<Uri> uriList) {
+ scanBuiltinLibraries();
+ var elementList = <LibraryElement>[];
+ for (var uri in uriList) {
+ elementList.add(scanner.loadLibrary(uri, null));
+ }
+
+ world.populate(this, libraries.getValues());
+
+ log('Resolving...');
+ phase = Compiler.PHASE_RESOLVING;
+ backend.enqueueHelpers(enqueuer.resolution);
+ processQueueList(enqueuer.resolution, elementList);
+ log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.');
+ }
+
+ void processQueueList(Enqueuer world, List<LibraryElement> elements) {
+ backend.processNativeClasses(world, libraries.getValues());
+ for (var library in elements) {
+ library.elements.forEach((_, element) {
+ world.addToWorkList(element);
+ });
+ }
+ progress.reset();
+ world.forEach((WorkItem work) {
+ withCurrentElement(work.element, () => work.run(this, world));
+ });
+ //world.queueIsClosed = true;
+ assert(world.checkNoEnqueuedInvokedInstanceMethods());
+ world.registerFieldClosureInvocations();
+ }
+
+ String codegen(WorkItem work, Enqueuer world) {
+ return null;
+ }
+}
+
+// TODO(johnniwinther): The source for the apidoc includes calls to methods on
+// for instance [MathPrimitives] which are not resolved by dart2js. Since we
+// do not need to analyse the body of functions to produce the documenation
+// we use a specialized resolver which bypasses method bodies.
Lasse Reichstein Nielsen 2012/07/09 10:39:33 Good choice. I expect to see MathNatives go away f
+class LibraryResolverTask extends ResolverTask {
+ LibraryResolverTask(api.Compiler compiler) : super(compiler);
+
+ void visitBody(ResolverVisitor visitor, Statement body) {}
+}
+
+// TODO(johnniwinther): As a side-effect of bypassing method bodies in
+// [LibraryResolveTask] we can not perform the typecheck.
+class LibraryTypeCheckerTask extends TypeCheckerTask {
+ LibraryTypeCheckerTask(api.Compiler compiler) : super(compiler);
+
+ void check(Node tree, TreeElements elements) {}
+}
+
+//------------------------------------------------------------------------------
// Compilation implementation
//------------------------------------------------------------------------------
@@ -230,6 +333,28 @@ class Dart2jsCompilation implements Compilation {
_compiler.run(scriptUri);
}
+ Dart2jsCompilation.library(List<String> libraries, String libraryRoot,
+ [String packageRoot, List<String> opts = const []])
+ : cwd = getCurrentDirectory(),
+ sourceFiles = <SourceFile>{}
+ {
Lasse Reichstein Nielsen 2012/07/09 10:39:33 Brace on previous line.
Johnni Winther 2012/07/09 14:57:18 Done.
+ var libraryUri = cwd.resolve(nativeToUriPath(libraryRoot));
+ var packageUri;
+ if (packageRoot !== null) {
+ packageUri = cwd.resolve(nativeToUriPath(packageRoot));
+ } else {
+ packageUri = libraryUri;
+ }
+ _compiler = new LibraryCompiler(provider, handler,
+ libraryUri, packageUri, <String>[]);
+ var librariesUri = <Uri>[];
+ for (var library in libraries) {
+ librariesUri.add(cwd.resolve(nativeToUriPath(library)));
+ // TODO(johnniwinther): Detect file not found
+ }
+ _compiler.runList(librariesUri);
+ }
+
void addLibrary(String path) {
var uri = cwd.resolve(nativeToUriPath(path));
_compiler.scanner.loadLibrary(uri, null);
@@ -275,12 +400,16 @@ abstract class Dart2jsElementMirror implements Dart2jsMirror {
system.compiler.spanFromElement(_element));
String toString() => _element.toString();
+
+ int hashCode() => qualifiedName().hashCode();
}
abstract class Dart2jsProxyMirror implements Dart2jsMirror {
final Dart2jsMirrorSystem system;
Dart2jsProxyMirror(this.system);
+
+ int hashCode() => qualifiedName().hashCode();
}
///////////////////////////////////////////////////////
@@ -321,6 +450,9 @@ class Dart2jsMirrorSystem implements MirrorSystem, Dart2jsMirror {
String qualifiedName() => simpleName();
String get canonicalName() => simpleName();
+
+ // TODO(johnniwinther): Hack! Dart2jsMirrorSystem need not be a Mirror.
+ int hashCode() => qualifiedName().hashCode();
}
abstract class Dart2jsObjectMirror extends Dart2jsElementMirror
@@ -339,6 +471,8 @@ class Dart2jsLibraryMirror extends Dart2jsObjectMirror
LibraryElement get _library() => _element;
+ LibraryMirror library() => this;
+
String get canonicalName() => simpleName();
/**

Powered by Google App Engine
This is Rietveld 408576698