| Index: utils/apidoc/apidoc.dart
|
| diff --git a/utils/apidoc/apidoc.dart b/utils/apidoc/apidoc.dart
|
| index 38872318a14d41ec24d8a37677cdf8ecf1268ec0..38bd7f17836bc2a3abf94d69386f993bd683f8e8 100644
|
| --- a/utils/apidoc/apidoc.dart
|
| +++ b/utils/apidoc/apidoc.dart
|
| @@ -18,16 +18,12 @@
|
| #import('dart:io');
|
| #import('dart:json');
|
| #import('html_diff.dart');
|
| -
|
| -#import('../../lib/dartdoc/frog/lang.dart');
|
| -#import('../../lib/dartdoc/frog/file_system_vm.dart');
|
| -#import('../../lib/dartdoc/frog/file_system.dart');
|
| +#import('../../lib/dartdoc/mirrors/mirrors.dart');
|
| +#import('../../lib/dartdoc/mirrors/mirrors_util.dart');
|
| #import('../../lib/dartdoc/dartdoc.dart', prefix: 'doc');
|
|
|
| HtmlDiff _diff;
|
|
|
| -final GET_PREFIX = 'get:';
|
| -
|
| void main() {
|
| final args = new Options().arguments;
|
|
|
| @@ -66,12 +62,7 @@ void main() {
|
| }
|
| }
|
|
|
| - final frogPath = joinPaths(doc.scriptDir, '../../lib/dartdoc/frog/');
|
| -
|
| - if (compilerPath === null) {
|
| - compilerPath
|
| - = Platform.operatingSystem == 'windows' ? 'dart2js.bat' : 'dart2js';
|
| - }
|
| + final libPath = '${doc.scriptDir}/../../';
|
|
|
| doc.cleanOutputDirectory(outputDir);
|
|
|
| @@ -80,7 +71,7 @@ void main() {
|
|
|
| final clientScript = (mode == doc.MODE_STATIC) ?
|
| 'static' : 'live-nav';
|
| - final Future scriptCompiled = doc.compileScript(compilerPath,
|
| + doc.compileScript(
|
| '${doc.scriptDir}/../../lib/dartdoc/client-$clientScript.dart',
|
| '${outputDir}/client-$clientScript.js');
|
|
|
| @@ -93,54 +84,61 @@ void main() {
|
| final Future copiedApiDocStatic = doc.copyFiles('${doc.scriptDir}/static',
|
| outputDir);
|
|
|
| - var files = new VMFileSystem();
|
| - parseOptions(frogPath, ['', '', '--libdir=../../lib'], files);
|
| - initializeWorld(files);
|
| -
|
| print('Parsing MDN data...');
|
| final mdnFile = new File('${doc.scriptDir}/mdn/database.json');
|
| final mdn = JSON.parse(mdnFile.readAsTextSync());
|
|
|
| print('Cross-referencing dart:html...');
|
| - HtmlDiff.initialize();
|
| + HtmlDiff.initialize(libPath);
|
| _diff = new HtmlDiff(printWarnings:false);
|
| _diff.run();
|
|
|
| // Process handwritten HTML documentation.
|
| - world.reset();
|
| - world.getOrAddLibrary('${doc.scriptDir}/../../lib/html/doc/html.dartdoc');
|
| - world.process();
|
| final htmldoc = new Htmldoc();
|
| - htmldoc.document();
|
| + htmldoc.documentLibraries(
|
| + <String>['${doc.scriptDir}/../../lib/html/doc/html.dartdoc'],
|
| + libPath);
|
| print('Processing handwritten HTML documentation...');
|
|
|
| // Process libraries.
|
|
|
| - // Note, Frog has global internal state. We need to clear away the
|
| - // HTML documentation classes above first.
|
| - world.reset();
|
| -
|
| // Add all of the core libraries.
|
| - world.getOrAddLibrary('dart:core');
|
| - world.getOrAddLibrary('dart:coreimpl');
|
| - world.getOrAddLibrary('dart:crypto');
|
| - world.getOrAddLibrary('dart:html');
|
| - world.getOrAddLibrary('dart:io');
|
| - world.getOrAddLibrary('dart:isolate');
|
| - world.getOrAddLibrary('dart:json');
|
| - world.getOrAddLibrary('${doc.scriptDir}/../../lib/math/math.dart');
|
| - world.getOrAddLibrary('${doc.scriptDir}/../../lib/unittest/unittest.dart');
|
| - world.getOrAddLibrary('${doc.scriptDir}/../../lib/i18n/intl.dart');
|
| - world.getOrAddLibrary('dart:uri');
|
| - world.getOrAddLibrary('dart:utf');
|
| - world.getOrAddLibrary('dart:web');
|
| - world.process();
|
| -
|
| + var apidocLibraries = <String>[
|
| + 'dart:core',
|
| + 'dart:coreimpl',
|
| + 'dart:crypto',
|
| + 'dart:html',
|
| + 'dart:io',
|
| + 'dart:isolate',
|
| + 'dart:json',
|
| + '${doc.scriptDir}/../../lib/math/math.dart',
|
| + '${doc.scriptDir}/../../lib/unittest/unittest.dart',
|
| + '${doc.scriptDir}/../../lib/i18n/intl.dart',
|
| + 'dart:uri',
|
| + 'dart:utf',
|
| + 'dart:web',
|
| + ];
|
| print('Generating docs...');
|
| final apidoc = new Apidoc(mdn, htmldoc, outputDir, mode, generateAppCache);
|
| -
|
| - Futures.wait([scriptCompiled, copiedStatic, copiedApiDocStatic]).then((_) {
|
| - apidoc.document();
|
| + // Select the libraries to include in the produced documentation:
|
| + apidoc.libraries = <String>[
|
| + 'core',
|
| + 'coreimpl',
|
| + 'crypto',
|
| + 'html',
|
| + 'io',
|
| + 'dart:isolate',
|
| + 'json',
|
| + 'math',
|
| + 'unittest',
|
| + 'intl',
|
| + 'uri',
|
| + 'utf',
|
| + 'web',
|
| + ];
|
| +
|
| + Futures.wait([copiedStatic, copiedApiDocStatic]).then((_) {
|
| + apidoc.documentLibraries(apidocLibraries, libPath);
|
| });
|
| }
|
|
|
| @@ -151,12 +149,20 @@ void main() {
|
| */
|
| class Htmldoc extends doc.Dartdoc {
|
| String libraryComment;
|
| +
|
| + /**
|
| + * Map from qualified type names to comments.
|
| + */
|
| Map<String, String> typeComments;
|
| - Map<String, Map<String, String>> memberComments;
|
| +
|
| + /**
|
| + * Map from qualified member names to comments.
|
| + */
|
| + Map<String, String> memberComments;
|
|
|
| Htmldoc() {
|
| typeComments = new Map<String, String>();
|
| - memberComments = new Map<String, Map<String, String>>();
|
| + memberComments = new Map<String, String>();
|
| }
|
|
|
| // Suppress any actual writing to file. This is only for analysis.
|
| @@ -166,88 +172,67 @@ class Htmldoc extends doc.Dartdoc {
|
| void write(String s) {
|
| }
|
|
|
| - String getRecordedLibraryComment(Library library) {
|
| - if (library.name == 'html') {
|
| + String getRecordedLibraryComment(LibraryMirror library) {
|
| + if (library.simpleName() == 'html') {
|
| return libraryComment;
|
| }
|
| return null;
|
| }
|
|
|
| - String getRecordedTypeComment(Type type) {
|
| - if (type.library.name == 'html') {
|
| - if (typeComments.containsKey(type.name)) {
|
| - return typeComments[type.name];
|
| - }
|
| + String getRecordedTypeComment(TypeMirror type) {
|
| + if (typeComments.containsKey(type.qualifiedName())) {
|
| + return typeComments[type.qualifiedName()];
|
| }
|
| return null;
|
| }
|
|
|
| - String getRecordedMemberComment(Member member) {
|
| - if (member.library.name == 'html') {
|
| - String typeName;
|
| - if (member.declaringType != null) {
|
| - typeName = member.declaringType.name;
|
| - }
|
| - if (typeName == null) {
|
| - typeName = '';
|
| - }
|
| - if (memberComments.containsKey(typeName)) {
|
| - Map<String, String> memberMap = memberComments[typeName];
|
| - if (memberMap.containsKey(member.name)) {
|
| - return memberMap[member.name];
|
| - }
|
| - }
|
| + String getRecordedMemberComment(MemberMirror member) {
|
| + if (memberComments.containsKey(member.qualifiedName())) {
|
| + return memberComments[member.qualifiedName()];
|
| }
|
| return null;
|
| }
|
|
|
| // These methods are subclassed and used for internal processing.
|
| // Do not invoke outside of this class.
|
| - String getLibraryComment(Library library) {
|
| + String getLibraryComment(LibraryMirror library) {
|
| String comment = super.getLibraryComment(library);
|
| libraryComment = comment;
|
| return comment;
|
| }
|
|
|
| - String getTypeComment(Type type) {
|
| + String getTypeComment(TypeMirror type) {
|
| String comment = super.getTypeComment(type);
|
| recordTypeComment(type, comment);
|
| return comment;
|
| }
|
|
|
| - String getMethodComment(MethodMember method) {
|
| + String getMethodComment(MethodMirror method) {
|
| String comment = super.getMethodComment(method);
|
| recordMemberComment(method, comment);
|
| return comment;
|
| }
|
|
|
| - String getFieldComment(FieldMember field) {
|
| + String getFieldComment(FieldMirror field) {
|
| String comment = super.getFieldComment(field);
|
| recordMemberComment(field, comment);
|
| return comment;
|
| }
|
|
|
| - void recordTypeComment(Type type, String comment) {
|
| + void recordTypeComment(TypeMirror type, String comment) {
|
| if (comment != null && comment.contains('@domName')) {
|
| // This is not a handwritten comment.
|
| return;
|
| }
|
| - typeComments[type.name] = comment;
|
| + typeComments[type.qualifiedName()] = comment;
|
| }
|
|
|
| - void recordMemberComment(Member member, String comment) {
|
| + void recordMemberComment(MemberMirror member, String comment) {
|
| if (comment != null && comment.contains('@domName')) {
|
| // This is not a handwritten comment.
|
| return;
|
| }
|
| - String typeName = member.declaringType.name;
|
| - if (typeName == null)
|
| - typeName = '';
|
| - if (!memberComments.containsKey(typeName)) {
|
| - memberComments[typeName] = new Map<String, String>();
|
| - }
|
| - Map<String, String> memberMap = memberComments[typeName];
|
| - memberMap[member.name] = comment;
|
| + memberComments[member.qualifiedName()] = comment;
|
| }
|
| }
|
|
|
| @@ -352,24 +337,24 @@ class Apidoc extends doc.Dartdoc {
|
| ''');
|
| }
|
|
|
| - void docIndexLibrary(Library library) {
|
| + void docIndexLibrary(LibraryMirror library) {
|
| // TODO(rnystrom): Hackish. The IO libraries reference this but we don't
|
| // want it in the docs.
|
| - if (library.name == 'dart:nativewrappers') return;
|
| + if (library.simpleName() == 'dart:nativewrappers') return;
|
| super.docIndexLibrary(library);
|
| }
|
|
|
| - void docLibraryNavigationJson(Library library, Map libraries) {
|
| + void docLibraryNavigationJson(LibraryMirror library, Map libraryMap) {
|
| // TODO(rnystrom): Hackish. The IO libraries reference this but we don't
|
| // want it in the docs.
|
| - if (library.name == 'dart:nativewrappers') return;
|
| - super.docLibraryNavigationJson(library, libraries);
|
| + if (library.simpleName() == 'dart:nativewrappers') return;
|
| + super.docLibraryNavigationJson(library, libraryMap);
|
| }
|
|
|
| - void docLibrary(Library library) {
|
| + void docLibrary(LibraryMirror library) {
|
| // TODO(rnystrom): Hackish. The IO libraries reference this but we don't
|
| // want it in the docs.
|
| - if (library.name == 'dart:nativewrappers') return;
|
| + if (library.simpleName() == 'dart:nativewrappers') return;
|
| super.docLibrary(library);
|
| }
|
|
|
| @@ -379,26 +364,26 @@ class Apidoc extends doc.Dartdoc {
|
| comment.replaceAll(const RegExp("@([a-zA-Z]+) ([^;]+)(?:;|\$)"), ''));
|
| }
|
|
|
| - String getLibraryComment(Library library) {
|
| - if (library.name == 'html') {
|
| + String getLibraryComment(LibraryMirror library) {
|
| + if (library.simpleName() == 'html') {
|
| return htmldoc.libraryComment;
|
| }
|
| return super.getLibraryComment(library);
|
| }
|
|
|
| - String getTypeComment(Type type) {
|
| + String getTypeComment(TypeMirror type) {
|
| return _mergeDocs(
|
| includeMdnTypeComment(type), super.getTypeComment(type),
|
| htmldoc.getRecordedTypeComment(type));
|
| }
|
|
|
| - String getMethodComment(MethodMember method) {
|
| + String getMethodComment(MethodMirror method) {
|
| return _mergeDocs(
|
| includeMdnMemberComment(method), super.getMethodComment(method),
|
| htmldoc.getRecordedMemberComment(method));
|
| }
|
|
|
| - String getFieldComment(FieldMember field) {
|
| + String getFieldComment(FieldMirror field) {
|
| return _mergeDocs(
|
| includeMdnMemberComment(field), super.getFieldComment(field),
|
| htmldoc.getRecordedMemberComment(field));
|
| @@ -431,7 +416,7 @@ class Apidoc extends doc.Dartdoc {
|
| return '';
|
| }
|
|
|
| - void docType(Type type) {
|
| + void docType(TypeMirror type) {
|
| // Track whether we've inserted MDN content into this page.
|
| mdnUrl = null;
|
|
|
| @@ -467,11 +452,11 @@ class Apidoc extends doc.Dartdoc {
|
| * Gets the MDN-scraped docs for [type], or `null` if this type isn't
|
| * scraped from MDN.
|
| */
|
| - includeMdnTypeComment(Type type) {
|
| - if (type.library.name == 'html') {
|
| + includeMdnTypeComment(TypeMirror type) {
|
| + if (type.library().simpleName() == 'html') {
|
| // If it's an HTML type, try to map it to a base DOM type so we can find
|
| // the MDN docs.
|
| - final domTypes = _diff.htmlTypesToDom[type];
|
| + final domTypes = _diff.htmlTypesToDom[type.qualifiedName()];
|
|
|
| // Couldn't find a DOM type.
|
| if ((domTypes == null) || (domTypes.length != 1)) return null;
|
| @@ -480,12 +465,12 @@ class Apidoc extends doc.Dartdoc {
|
| // TODO(rnystrom): Shame there isn't a simpler way to get the one item
|
| // out of a singleton Set.
|
| type = domTypes.iterator().next();
|
| - } else if (type.library.name != 'dom') {
|
| + } else if (type.library().simpleName() != 'dom') {
|
| // Not a DOM type.
|
| return null;
|
| }
|
|
|
| - final mdnType = mdn[type.name];
|
| + final mdnType = mdn[type.simpleName()];
|
| if (mdnType == null) return null;
|
| if (mdnType['skipped'] != null) return null;
|
|
|
| @@ -498,8 +483,9 @@ class Apidoc extends doc.Dartdoc {
|
| * Gets the MDN-scraped docs for [member], or `null` if this type isn't
|
| * scraped from MDN.
|
| */
|
| - includeMdnMemberComment(Member member) {
|
| - if (member.library.name == 'html') {
|
| + includeMdnMemberComment(MemberMirror member) {
|
| + var library = findLibrary(member);
|
| + if (library.simpleName() == 'html') {
|
| // If it's an HTML type, try to map it to a base DOM type so we can find
|
| // the MDN docs.
|
| final domMembers = _diff.htmlToDom[member];
|
| @@ -511,17 +497,17 @@ class Apidoc extends doc.Dartdoc {
|
| // TODO(rnystrom): Shame there isn't a simpler way to get the one item
|
| // out of a singleton Set.
|
| member = domMembers.iterator().next();
|
| - } else if (member.library.name != 'dom') {
|
| + } else if (library.simpleName() != 'dom') {
|
| // Not a DOM type.
|
| return null;
|
| }
|
|
|
| // Ignore top-level functions.
|
| - if (member.declaringType.isTop) return null;
|
| + if (member.isTopLevel) return null;
|
|
|
| - final mdnType = mdn[member.declaringType.name];
|
| + final mdnType = mdn[member.surroundingDeclaration().simpleName()];
|
| if (mdnType == null) return null;
|
| - var nameToFind = member.name;
|
| + var nameToFind = member.simpleName();
|
| if (nameToFind.startsWith(GET_PREFIX)) {
|
| nameToFind = nameToFind.substring(GET_PREFIX.length);
|
| }
|
| @@ -544,14 +530,12 @@ class Apidoc extends doc.Dartdoc {
|
| * Returns a link to [member], relative to a type page that may be in a
|
| * different library than [member].
|
| */
|
| - String _linkMember(Member member) {
|
| - final typeName = member.declaringType.name;
|
| - var memberName = '$typeName.${member.name}';
|
| + String _linkMember(MemberMirror member) {
|
| + final typeName = member.surroundingDeclaration().simpleName();
|
| + var memberName = '$typeName.${member.simpleName()}';
|
| if (member.isConstructor || member.isFactory) {
|
| final separator = member.constructorName == '' ? '' : '.';
|
| memberName = 'new $typeName$separator${member.constructorName}';
|
| - } else if (member.name.startsWith(GET_PREFIX)) {
|
| - memberName = '$typeName.${member.name.substring(GET_PREFIX.length)}';
|
| }
|
|
|
| return a(memberUrl(member), memberName);
|
|
|