Index: utils/dartdoc/dartdoc.dart |
diff --git a/utils/dartdoc/dartdoc.dart b/utils/dartdoc/dartdoc.dart |
index 2ca8cff4932ec32a08d38332a14b3ceb66b6f087..6ed5d33e04476e8b3d258bd0a15b3b9e98e1a123 100644 |
--- a/utils/dartdoc/dartdoc.dart |
+++ b/utils/dartdoc/dartdoc.dart |
@@ -6,6 +6,7 @@ |
#library('dartdoc'); |
#import('../../frog/lang.dart'); |
+#import('../../frog/file_system.dart'); |
#import('../../frog/file_system_node.dart'); |
#source('classify.dart'); |
@@ -35,6 +36,8 @@ int _totalLibraries = 0; |
int _totalTypes = 0; |
int _totalMembers = 0; |
+FileSystem files; |
+ |
/** |
* Run this from the frog/samples directory. Before running, you need |
* to create a docs dir with 'mkdir docs' - since Dart currently doesn't |
@@ -44,19 +47,30 @@ void main() { |
// The entrypoint of the library to generate docs for. |
final libPath = process.argv[2]; |
- // TODO(rnystrom): Get options and homedir like frog.dart does. |
- final files = new NodeFileSystem(); |
+ files = new NodeFileSystem(); |
parseOptions('../../frog', [] /* args */, files); |
final elapsed = time(() { |
+ _comments = <String, Map<int, String>>{}; |
+ |
initializeWorld(files); |
world.processScript(libPath); |
world.resolveAll(); |
- _comments = <String, Map<int, String>>{}; |
+ // Clean the output directory. |
+ if (files.fileExists(outdir)) { |
+ files.removeDirectory(outdir, recursive: true); |
+ } |
+ files.createDirectory(outdir, recursive: true); |
- for (var library in world.libraries.getValues()) { |
+ // Copy over the static files. |
+ for (final file in ['interact.js', 'styles.css']) { |
+ copyStatic(file); |
+ } |
+ |
+ // Generate the docs. |
+ for (final library in world.libraries.getValues()) { |
docLibrary(library); |
} |
@@ -67,6 +81,12 @@ void main() { |
'$_totalMembers members in ${elapsed}msec.'); |
} |
+/** Copies the static file at 'static/file' to the output directory. */ |
+copyStatic(String file) { |
+ var contents = files.readAll(joinPaths('static', file)); |
+ files.writeString(joinPaths(outdir, file), contents); |
+} |
+ |
num time(callback()) { |
// Unlike world.withTiming, returns the elapsed time. |
final watch = new Stopwatch(); |
@@ -111,10 +131,10 @@ docIndex(List<Library> libraries) { |
<ul> |
'''); |
- var sorted = new List<Library>.from(libraries); |
+ final sorted = new List<Library>.from(libraries); |
sorted.sort((a, b) => a.name.compareTo(b.name)); |
- for (var library in sorted) { |
+ for (final library in sorted) { |
writeln( |
''' |
<li><a href="${sanitize(library.name)}.html"> |
@@ -160,7 +180,7 @@ docLibrary(Library library) { |
needsSeparator = true; |
} |
- for (var type in library.types.getValues()) { |
+ for (final type in library.types.getValues()) { |
if (needsSeparator) writeln('<hr/>'); |
if (docType(type)) needsSeparator = true; |
} |
@@ -201,10 +221,10 @@ bool docType(Type type) { |
} |
// Collect the different kinds of members. |
- var methods = []; |
- var fields = []; |
+ final methods = []; |
+ final fields = []; |
- for (var member in orderValuesByKeys(type.members)) { |
+ for (final member in orderValuesByKeys(type.members)) { |
if (member.isMethod && |
(member.definition != null) && |
!member.name.startsWith('_')) { |
@@ -219,12 +239,12 @@ bool docType(Type type) { |
if (methods.length > 0) { |
writeln('<h3>Methods</h3>'); |
- for (var method in methods) docMethod(type.name, method); |
+ for (final method in methods) docMethod(type.name, method); |
} |
if (fields.length > 0) { |
writeln('<h3>Fields</h3>'); |
- for (var field in fields) docField(type.name, field); |
+ for (final field in fields) docField(type.name, field); |
} |
return wroteSomething || methods.length > 0 || fields.length > 0; |
@@ -242,7 +262,7 @@ docInheritance(Type type) { |
} |
if (type.interfaces != null) { |
- var interfaces = []; |
+ final interfaces = []; |
switch (type.interfaces.length) { |
case 0: |
// Do nothing. |
@@ -259,7 +279,7 @@ docInheritance(Type type) { |
default: |
write('Implements '); |
- for (var i = 0; i < type.interfaces.length; i++) { |
+ for (final i = 0; i < type.interfaces.length; i++) { |
write('${typeRef(type.interfaces[i])}'); |
if (i < type.interfaces.length - 1) { |
write(', '); |
@@ -278,8 +298,8 @@ docInheritance(Type type) { |
docConstructors(Type type) { |
if (type.constructors.length > 0) { |
writeln('<h3>Constructors</h3>'); |
- for (var name in type.constructors.getKeys()) { |
- var constructor = type.constructors[name]; |
+ for (final name in type.constructors.getKeys()) { |
+ final constructor = type.constructors[name]; |
docMethod(type.name, constructor, namedConstructor: name); |
} |
} |
@@ -340,9 +360,9 @@ docMethod(String typeName, MethodMember method, |
} |
write('('); |
- var paramList = []; |
+ final paramList = []; |
if (method.parameters == null) print(method.name); |
- for (var p in method.parameters) { |
+ for (final p in method.parameters) { |
paramList.add('${optionalTypeRef(p.type)}${p.name}'); |
} |
write(Strings.join(paramList, ", ")); |
@@ -398,7 +418,7 @@ docField(String typeName, FieldMember field) { |
*/ |
typeRef(Type type) { |
if (type.library != null) { |
- var library = sanitize(type.library.name); |
+ final library = sanitize(type.library.name); |
return '<a href="${library}.html#${type.name}">${type.name}</a>'; |
} else { |
return type.name; |
@@ -426,7 +446,7 @@ docCode(SourceSpan span, [bool showCode = false]) { |
if (span == null) return; |
writeln('<div class="doc">'); |
- var comment = findComment(span); |
+ final comment = findComment(span); |
if (comment != null) { |
writeln('<p>$comment</p>'); |
} |
@@ -446,24 +466,24 @@ findComment(SourceSpan span) => findCommentInFile(span.file, span.start); |
/** Finds the doc comment preceding the given source span, if there is one. */ |
findCommentInFile(SourceFile file, int position) { |
// Get the doc comments for this file. |
- var fileComments = _comments.putIfAbsent(file.filename, |
+ final fileComments = _comments.putIfAbsent(file.filename, |
() => parseDocComments(file)); |
return fileComments[position]; |
} |
parseDocComments(SourceFile file) { |
- var comments = <int, String>{}; |
+ final comments = <int, String>{}; |
- var tokenizer = new Tokenizer(file, false); |
+ final tokenizer = new Tokenizer(file, false); |
var lastComment = null; |
while (true) { |
- var token = tokenizer.next(); |
+ final token = tokenizer.next(); |
if (token.kind == TokenKind.END_OF_FILE) break; |
if (token.kind == TokenKind.COMMENT) { |
- var text = token.text; |
+ final text = token.text; |
if (text.startsWith('/**')) { |
// Remember that we've encountered a doc comment. |
lastComment = stripComment(token.text); |
@@ -472,7 +492,7 @@ parseDocComments(SourceFile file) { |
// Ignore whitespace tokens. |
} else if (token.kind == TokenKind.HASH) { |
// Look for #library() to find the library comment. |
- var next = tokenizer.next(); |
+ final next = tokenizer.next(); |
if ((lastComment != null) && (next.kind == TokenKind.LIBRARY)) { |
comments[_libraryDoc] = lastComment; |
lastComment = null; |
@@ -495,14 +515,14 @@ parseDocComments(SourceFile file) { |
*/ |
formatCode(SourceSpan span) { |
// Remove leading indentation to line up with first line. |
- var column = getSpanColumn(span); |
- var lines = span.text.split('\n'); |
+ final column = getSpanColumn(span); |
+ final lines = span.text.split('\n'); |
// TODO(rnystrom): Dirty hack. |
- for (int i = 1; i < lines.length; i++) { |
+ for (final i = 1; i < lines.length; i++) { |
lines[i] = unindent(lines[i], column); |
} |
- var code = Strings.join(lines, '\n'); |
+ final code = Strings.join(lines, '\n'); |
// Syntax highlight. |
return classifySource(new SourceFile('', code)); |
@@ -510,7 +530,7 @@ formatCode(SourceSpan span) { |
// TODO(rnystrom): Move into SourceSpan? |
int getSpanColumn(SourceSpan span) { |
- var line = span.file.getLine(span.start); |
+ final line = span.file.getLine(span.start); |
return span.file.getColumn(line, span.start); |
} |
@@ -536,7 +556,7 @@ unindent(String text, int indentation) { |
stripComment(comment) { |
StringBuffer buf = new StringBuffer(); |
- for (var line in comment.split('\n')) { |
+ for (final line in comment.split('\n')) { |
line = line.trim(); |
if (line.startsWith('/**')) line = line.substring(3, line.length); |
if (line.endsWith('*/')) line = line.substring(0, line.length-2); |