| Index: sdk/lib/_internal/dartdoc/lib/dartdoc.dart
|
| diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
|
| index 5ba7f0ea8dfb8569f5b8118b468b4436cfefe8b4..19ab648cd395d1b32438d14a052248387152312b 100644
|
| --- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
|
| +++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
|
| @@ -19,8 +19,6 @@ library dartdoc;
|
| import 'dart:async';
|
| import 'dart:convert';
|
| import 'dart:io';
|
| -import 'dart:isolate';
|
| -import 'dart:math';
|
|
|
| import 'package:path/path.dart' as path;
|
|
|
| @@ -35,7 +33,7 @@ import 'src/json_serializer.dart' as json_serializer;
|
|
|
| // TODO(rnystrom): Use "package:" URL (#4968).
|
| import 'src/dart2js_mirrors.dart' as dart2js;
|
| -import '../../compiler/implementation/mirrors/mirrors.dart';
|
| +import '../../compiler/implementation/mirrors/source_mirrors.dart';
|
| import '../../compiler/implementation/mirrors/mirrors_util.dart';
|
| import '../../libraries.dart';
|
|
|
| @@ -281,14 +279,17 @@ class Dartdoc {
|
| */
|
| Map<LibraryMirror, List<Export>> _hiddenLibraryExports;
|
|
|
| + /** The mirror system that we're currently generating docs for. */
|
| + MirrorSystem _currentMirrorSystem;
|
| +
|
| /** The library that we're currently generating docs for. */
|
| LibraryMirror _currentLibrary;
|
|
|
| /** The type that we're currently generating docs for. */
|
| - ClassMirror _currentType;
|
| + TypeMirror _currentType;
|
|
|
| /** The member that we're currently generating docs for. */
|
| - MemberMirror _currentMember;
|
| + DeclarationMirror _currentMember;
|
|
|
| /** The path to the file currently being written to, relative to [outdir]. */
|
| String _filePath;
|
| @@ -444,6 +445,7 @@ class Dartdoc {
|
| }
|
|
|
| void _document(MirrorSystem mirrors) {
|
| + _currentMirrorSystem = mirrors;
|
| _exports = new ExportMap(mirrors);
|
| _started = true;
|
|
|
| @@ -519,6 +521,7 @@ class Dartdoc {
|
| endFile();
|
|
|
| _finished = true;
|
| + _currentMirrorSystem = null;
|
| }
|
|
|
| /**
|
| @@ -817,31 +820,35 @@ class Dartdoc {
|
| void docLibraryNavigationJson(LibraryMirror library, List libraryList) {
|
| var libraryInfo = {};
|
| libraryInfo[NAME] = displayName(library);
|
| - final List members = docMembersJson(library.members);
|
| + final List members = docMembersJson(membersOf(library.declarations));
|
| if (!members.isEmpty) {
|
| libraryInfo[MEMBERS] = members;
|
| }
|
|
|
| final types = [];
|
| - for (ClassMirror type in orderByName(library.classes.values)) {
|
| + var classes =
|
| + library.declarations.values.where((mirror) => mirror is TypeMirror);
|
| + for (TypeMirror type in orderByName(classes)) {
|
| +
|
| if (!showPrivate && type.isPrivate) continue;
|
|
|
| var typeInfo = {};
|
| typeInfo[NAME] = displayName(type);
|
| - if (type.isClass) {
|
| + if (type is ClassMirror) {
|
| typeInfo[KIND] = CLASS;
|
| +
|
| + final List typeMembers = docMembersJson(membersOf(type.declarations));
|
| + if (!typeMembers.isEmpty) {
|
| + typeInfo[MEMBERS] = typeMembers;
|
| + }
|
| } else {
|
| - assert(type.isTypedef);
|
| + assert(type is TypedefMirror);
|
| typeInfo[KIND] = TYPEDEF;
|
| }
|
| - final List typeMembers = docMembersJson(type.members);
|
| - if (!typeMembers.isEmpty) {
|
| - typeInfo[MEMBERS] = typeMembers;
|
| - }
|
|
|
| - if (!type.originalDeclaration.typeVariables.isEmpty) {
|
| + if (!type.typeVariables.isEmpty) {
|
| final typeVariables = [];
|
| - for (final typeVariable in type.originalDeclaration.typeVariables) {
|
| + for (final typeVariable in type.typeVariables) {
|
| typeVariables.add(displayName(typeVariable));
|
| }
|
| typeInfo[ARGS] = typeVariables.join(', ');
|
| @@ -855,13 +862,13 @@ class Dartdoc {
|
| libraryList.add(libraryInfo);
|
| }
|
|
|
| - List docMembersJson(Map<Object,MemberMirror> memberMap) {
|
| + List docMembersJson(Iterable<DeclarationMirror> declarations) {
|
| final members = [];
|
| - for (MemberMirror member in orderByName(memberMap.values)) {
|
| + for (DeclarationMirror member in orderByName(declarations)) {
|
| if (!showPrivate && member.isPrivate) continue;
|
|
|
| var memberInfo = {};
|
| - if (member.isVariable) {
|
| + if (member is VariableMirror) {
|
| memberInfo[KIND] = FIELD;
|
| } else {
|
| MethodMirror method = member;
|
| @@ -916,10 +923,10 @@ class Dartdoc {
|
| /** Writes the navigation for the types contained by the given library. */
|
| void docLibraryNavigation(LibraryMirror library) {
|
| // Show the exception types separately.
|
| - final types = <ClassMirror>[];
|
| - final exceptions = <ClassMirror>[];
|
| + final types = <TypeMirror>[];
|
| + final exceptions = <TypeMirror>[];
|
|
|
| - for (ClassMirror type in orderByName(library.classes.values)) {
|
| + for (TypeMirror type in orderByName(typesOf(library.declarations))) {
|
| if (!showPrivate && type.isPrivate) continue;
|
|
|
| if (isException(type)) {
|
| @@ -938,11 +945,11 @@ class Dartdoc {
|
| }
|
|
|
| /** Writes a linked navigation list item for the given type. */
|
| - void docTypeNavigation(ClassMirror type) {
|
| + void docTypeNavigation(TypeMirror type) {
|
| var icon = 'interface';
|
| if (isException(type)) {
|
| icon = 'exception';
|
| - } else if (type.isClass) {
|
| + } else if (type is ClassMirror) {
|
| icon = 'class';
|
| }
|
|
|
| @@ -988,19 +995,19 @@ class Dartdoc {
|
| final exceptions = <ClassMirror>[];
|
|
|
| var allClasses = _libraryClasses(library);
|
| - for (ClassMirror type in orderByName(allClasses)) {
|
| + for (TypeMirror type in orderByName(allClasses)) {
|
| if (!showPrivate && type.isPrivate) continue;
|
|
|
| if (isException(type)) {
|
| exceptions.add(type);
|
| - } else if (type.isClass) {
|
| + } else if (type is TypedefMirror) {
|
| + typedefs.add(type);
|
| + } else if (type is ClassSourceMirror) {
|
| if (type.isAbstract) {
|
| abstractClasses.add(type);
|
| } else {
|
| classes.add(type);
|
| }
|
| - } else if (type is TypedefMirror) {
|
| - typedefs.add(type);
|
| } else {
|
| throw new InternalError("internal error: unknown type $type.");
|
| }
|
| @@ -1042,9 +1049,9 @@ class Dartdoc {
|
| writeln('</div>');
|
| }
|
|
|
| - void docType(ClassMirror type) {
|
| + void docType(TypeMirror type) {
|
| if (verbose) {
|
| - print('- ${type.simpleName}');
|
| + print('- ${nameOf(type)}');
|
| }
|
| _totalTypes++;
|
| _currentType = type;
|
| @@ -1052,15 +1059,16 @@ class Dartdoc {
|
| startFile(typePath(type));
|
|
|
| var kind;
|
| - if (type.isTypedef) {
|
| + if (type is TypedefMirror) {
|
| kind = 'typedef';
|
| - } else {
|
| - assert(type.isClass);
|
| + } else if (type is ClassSourceMirror) {
|
| if (type.isAbstract) {
|
| kind = 'abstract class';
|
| } else {
|
| kind = 'class';
|
| }
|
| + } else {
|
| + assert(false);
|
| }
|
|
|
| final typeTitle =
|
| @@ -1083,10 +1091,13 @@ class Dartdoc {
|
| docCode(type.location);
|
| writeln('</div>');
|
|
|
| - docInheritance(type);
|
| - docTypedef(type);
|
|
|
| - docMembers(type);
|
| + if (type is TypedefMirror) {
|
| + docTypedef(type);
|
| + } else {
|
| + docInheritance(type);
|
| + docMembers(type);
|
| + }
|
|
|
| writeTypeFooter();
|
| writeFooter();
|
| @@ -1105,11 +1116,11 @@ class Dartdoc {
|
| * an icon and the type's name. It's similar to how types appear in the
|
| * navigation, but is suitable for inline (as opposed to in a `<ul>`) use.
|
| */
|
| - void typeSpan(ClassMirror type) {
|
| + void typeSpan(TypeMirror type) {
|
| var icon = 'interface';
|
| if (isException(type)) {
|
| icon = 'exception';
|
| - } else if (type.isClass) {
|
| + } else if (type is ClassMirror) {
|
| icon = 'class';
|
| }
|
|
|
| @@ -1130,8 +1141,7 @@ class Dartdoc {
|
| void docInheritance(ClassMirror type) {
|
| // Don't show the inheritance details for Object. It doesn't have any base
|
| // class (obviously) and it has too many subclasses to be useful.
|
| - if (type.isObject) return;
|
| - if (type.isTypedef) return;
|
| + if (isObject(type)) return;
|
|
|
| // Writes an unordered list of references to types with an optional header.
|
| listTypes(types, header) {
|
| @@ -1161,14 +1171,18 @@ class Dartdoc {
|
| }
|
|
|
| final subtypes = [];
|
| - for (final subtype in computeSubdeclarations(type)) {
|
| + for (final subtype in computeSubdeclarations(_currentMirrorSystem, type)) {
|
| subtypes.add(subtype);
|
| }
|
| - subtypes.sort((x, y) => x.simpleName.compareTo(y.simpleName));
|
| + subtypes.sort((x, y) {
|
| + String xName = nameOf(x);
|
| + String yName = nameOf(y);
|
| + return xName.compareTo(yName);
|
| + });
|
|
|
| // Show the chain of superclasses.
|
| var superclass = getSuperclass(type);
|
| - if (!superclass.isObject) {
|
| + if (!isObject(superclass)) {
|
| final supertypes = [];
|
| var thisType = superclass;
|
| do {
|
| @@ -1176,7 +1190,7 @@ class Dartdoc {
|
| supertypes.add(thisType);
|
| }
|
| thisType = getSuperclass(thisType);
|
| - } while (!thisType.isObject);
|
| + } while (!isObject(thisType));
|
|
|
| writeln('<h3>Extends</h3>');
|
| writeln('<p>');
|
| @@ -1198,21 +1212,20 @@ class Dartdoc {
|
| /**
|
| * Documents the definition of [type] if it is a typedef.
|
| */
|
| - void docTypedef(TypeMirror type) {
|
| - if (type is! TypedefMirror) {
|
| - return;
|
| - }
|
| - writeln('<div class="method"><h4 id="${type.simpleName}">');
|
| + void docTypedef(TypedefMirror type) {
|
| + String name = nameOf(type);
|
| +
|
| + writeln('<div class="method"><h4 id="${name}">');
|
|
|
| if (includeSource) {
|
| writeln('<button class="show-code">Code</button>');
|
| }
|
|
|
| write('typedef ');
|
| - annotateType(type, type.value, type.simpleName);
|
| + annotateType(type, type.referent, name);
|
|
|
| - write(''' <a class="anchor-link" href="#${type.simpleName}"
|
| - title="Permalink to ${type.simpleName}">#</a>''');
|
| + write(''' <a class="anchor-link" href="#${name}"
|
| + title="Permalink to ${name}">#</a>''');
|
| writeln('</h4>');
|
|
|
| writeln('<div class="doc">');
|
| @@ -1224,7 +1237,7 @@ class Dartdoc {
|
|
|
| static const operatorOrder = const <String>[
|
| '[]', '[]=', // Indexing.
|
| - '+', Mirror.UNARY_MINUS, '-', '*', '/', '~/', '%', // Arithmetic.
|
| + '+', 'unary-', '-', '*', '/', '~/', '%', // Arithmetic.
|
| '&', '|', '^', '~', // Bitwise.
|
| '<<', '>>', // Shift.
|
| '<', '<=', '>', '>=', // Relational.
|
| @@ -1270,20 +1283,20 @@ class Dartdoc {
|
| }
|
| }
|
|
|
| - void docMembers(ContainerMirror host) {
|
| + void docMembers(DeclarationMirror host) {
|
| // Collect the different kinds of members.
|
| final staticMethods = [];
|
| - final staticGetters = new Map<String,MemberMirror>();
|
| - final staticSetters = new Map<String,MemberMirror>();
|
| - final memberMap = new Map<String,MemberMirror>();
|
| + final staticGetters = new Map<String, DeclarationMirror>();
|
| + final staticSetters = new Map<String, DeclarationMirror>();
|
| + final memberMap = new Map<String, DeclarationMirror>();
|
| final instanceMethods = [];
|
| final instanceOperators = [];
|
| - final instanceGetters = new Map<String,MemberMirror>();
|
| - final instanceSetters = new Map<String,MemberMirror>();
|
| + final instanceGetters = new Map<String, DeclarationMirror>();
|
| + final instanceSetters = new Map<String, DeclarationMirror>();
|
| final constructors = [];
|
|
|
| - var hostMembers = host is LibraryMirror ?
|
| - _libraryMembers(host) : host.members.values;
|
| + var hostMembers = host is ClassMirror ?
|
| + membersOf(host.declarations) : _libraryMembers(host);
|
| for (var member in hostMembers) {
|
| if (!showPrivate && member.isPrivate) continue;
|
| if (host is LibraryMirror || member.isStatic) {
|
| @@ -1304,10 +1317,10 @@ class Dartdoc {
|
| if (host is ClassMirror) {
|
| var iterable = new HierarchyIterable(host, includeType: true);
|
| for (ClassMirror type in iterable) {
|
| - if (!host.isObject && !inheritFromObject && type.isObject) continue;
|
| + if (!isObject(host) && !inheritFromObject && isObject(type)) continue;
|
| if (isFromPrivateDartLibrary(type)) continue;
|
|
|
| - type.members.forEach((_, MemberMirror member) {
|
| + membersOf(type.declarations).forEach((member) {
|
| if (member.isStatic) return;
|
| if (!showPrivate && member.isPrivate) return;
|
|
|
| @@ -1317,21 +1330,22 @@ class Dartdoc {
|
| // Don't inherit private members.
|
| inherit = false;
|
| }
|
| - if (member.isConstructor) {
|
| + if (member is MethodMirror && member.isConstructor) {
|
| // Don't inherit constructors.
|
| inherit = false;
|
| }
|
| }
|
| if (!inherit) return;
|
|
|
| - if (member.isVariable) {
|
| + String name = nameOf(member);
|
| + if (member is VariableMirror) {
|
| // Fields override both getters and setters.
|
| - memberMap.putIfAbsent(member.simpleName, () => member);
|
| - memberMap.putIfAbsent('${member.simpleName}=', () => member);
|
| - } else if (member.isConstructor) {
|
| + memberMap.putIfAbsent(name, () => member);
|
| + memberMap.putIfAbsent('${name}=', () => member);
|
| + } else if (member is MethodMirror && member.isConstructor) {
|
| constructors.add(member);
|
| } else {
|
| - memberMap.putIfAbsent(member.simpleName, () => member);
|
| + memberMap.putIfAbsent(name, () => member);
|
| }
|
| });
|
| }
|
| @@ -1340,7 +1354,7 @@ class Dartdoc {
|
| bool allMethodsInherited = true;
|
| bool allPropertiesInherited = true;
|
| bool allOperatorsInherited = true;
|
| - memberMap.forEach((_, MemberMirror member) {
|
| + memberMap.forEach((_, member) {
|
| if (member is MethodMirror) {
|
| if (member.isGetter) {
|
| instanceGetters[displayName(member)] = member;
|
| @@ -1372,8 +1386,8 @@ class Dartdoc {
|
| });
|
|
|
| instanceOperators.sort((MethodMirror a, MethodMirror b) {
|
| - return operatorOrderMap[a.simpleName].compareTo(
|
| - operatorOrderMap[b.simpleName]);
|
| + return operatorOrderMap[nameOf(a)].compareTo(
|
| + operatorOrderMap[nameOf(b)]);
|
| });
|
|
|
| docProperties(host,
|
| @@ -1396,9 +1410,9 @@ class Dartdoc {
|
| /**
|
| * Documents fields, getters, and setters as properties.
|
| */
|
| - void docProperties(ContainerMirror host, String title,
|
| - Map<String,MemberMirror> getters,
|
| - Map<String,MemberMirror> setters,
|
| + void docProperties(DeclarationMirror host, String title,
|
| + Map<String, DeclarationMirror> getters,
|
| + Map<String, DeclarationMirror> setters,
|
| {bool allInherited}) {
|
| if (getters.isEmpty && setters.isEmpty) return;
|
|
|
| @@ -1412,8 +1426,8 @@ class Dartdoc {
|
| writeln('<div${allInherited ? ' class="inherited"' : ''}>');
|
| writeln('<h3>$title</h3>');
|
| for (String name in nameList) {
|
| - MemberMirror getter = getters[name];
|
| - MemberMirror setter = setters[name];
|
| + DeclarationMirror getter = getters[name];
|
| + DeclarationMirror setter = setters[name];
|
| if (setter == null) {
|
| if (getter is VariableMirror) {
|
| // We have a field.
|
| @@ -1455,7 +1469,7 @@ class Dartdoc {
|
| writeln('</div>');
|
| }
|
|
|
| - void docMethods(ContainerMirror host, String title, List<Mirror> methods,
|
| + void docMethods(DeclarationMirror host, String title, List<Mirror> methods,
|
| {bool allInherited}) {
|
| if (methods.length > 0) {
|
| writeln('<div${allInherited ? ' class="inherited"' : ''}>');
|
| @@ -1473,7 +1487,7 @@ class Dartdoc {
|
| * [FieldMirror] it is documented as a getter or setter depending upon the
|
| * value of [asGetter].
|
| */
|
| - void docMethod(ContainerMirror host, MemberMirror member,
|
| + void docMethod(DeclarationMirror host, DeclarationMirror member,
|
| {bool asGetter: false}) {
|
| _totalMembers++;
|
| _currentMember = member;
|
| @@ -1488,8 +1502,7 @@ class Dartdoc {
|
| // Setter.
|
| name = 'set $name';
|
| }
|
| - } else {
|
| - assert(member is MethodMirror);
|
| + } else if (member is MethodMirror) {
|
| isAbstract = member.isAbstract;
|
| if (member.isGetter) {
|
| // Getter.
|
| @@ -1498,6 +1511,8 @@ class Dartdoc {
|
| // Setter.
|
| name = 'set $name';
|
| }
|
| + } else {
|
| + assert(false);
|
| }
|
|
|
| bool showCode = includeSource && !isAbstract;
|
| @@ -1524,13 +1539,14 @@ class Dartdoc {
|
| if (!member.isConstructor) {
|
| annotateDynamicType(host, member.returnType);
|
| }
|
| - } else {
|
| - assert(member is VariableMirror);
|
| + } else if (member is VariableMirror) {
|
| if (asGetter) {
|
| annotateDynamicType(host, member.type);
|
| } else {
|
| write('void ');
|
| }
|
| + } else {
|
| + assert(false);
|
| }
|
|
|
| write('<strong>$name</strong>');
|
| @@ -1539,13 +1555,14 @@ class Dartdoc {
|
| if (!member.isGetter) {
|
| docParamList(host, member.parameters);
|
| }
|
| - } else {
|
| - assert(member is VariableMirror);
|
| + } else if (member is VariableMirror) {
|
| if (!asGetter) {
|
| write('(');
|
| annotateType(host, member.type);
|
| write(' value)');
|
| }
|
| + } else {
|
| + assert(false);
|
| }
|
|
|
| var prefix = host is LibraryMirror ? '' : '${typeName(host)}.';
|
| @@ -1572,7 +1589,7 @@ class Dartdoc {
|
| /**
|
| * Annotate a member as inherited or mixed in from [owner].
|
| */
|
| - void docInherited(ContainerMirror host, ClassMirror owner) {
|
| + void docInherited(DeclarationMirror host, ClassMirror owner) {
|
| if (isMixinApplication(owner)) {
|
| write('<div class="inherited-from">mixed in from ');
|
| annotateType(host, owner.mixin);
|
| @@ -1584,7 +1601,7 @@ class Dartdoc {
|
| }
|
| }
|
|
|
| - void docField(ContainerMirror host, VariableMirror field,
|
| + void docField(DeclarationMirror host, VariableMirror field,
|
| {bool asGetter: false, bool asSetter: false}) {
|
| if (asGetter) {
|
| docMethod(host, field, asGetter: true);
|
| @@ -1601,8 +1618,8 @@ class Dartdoc {
|
| * Otherwise, if [getter] is a [MethodMirror], the property is considered
|
| * final if [setter] is [:null:].
|
| */
|
| - void docProperty(ContainerMirror host,
|
| - MemberMirror getter, MemberMirror setter) {
|
| + void docProperty(DeclarationMirror host,
|
| + DeclarationMirror getter, DeclarationMirror setter) {
|
| assert(getter != null);
|
| _totalMembers++;
|
| _currentMember = getter;
|
| @@ -1624,10 +1641,11 @@ class Dartdoc {
|
| isConst = getter.isConst;
|
| isFinal = getter.isFinal;
|
| type = getter.type;
|
| - } else {
|
| - assert(getter is MethodMirror);
|
| + } else if (getter is MethodMirror) {
|
| isFinal = setter == null;
|
| type = getter.returnType;
|
| + } else {
|
| + assert(false);
|
| }
|
|
|
| if (isConst) {
|
| @@ -1638,13 +1656,14 @@ class Dartdoc {
|
| write('var ');
|
| }
|
|
|
| - annotateType(host, type);
|
| +
|
| var prefix = host is LibraryMirror ? '' : '${typeName(host)}.';
|
| + String name = nameOf(getter);
|
| write(
|
| '''
|
| - <strong>${getter.simpleName}</strong> <a class="anchor-link"
|
| + <strong>${name}</strong> <a class="anchor-link"
|
| href="#${memberAnchor(getter)}"
|
| - title="Permalink to $prefix${getter.simpleName}">#</a>
|
| + title="Permalink to $prefix${name}">#</a>
|
| </h4>
|
| ''');
|
|
|
| @@ -1669,7 +1688,7 @@ class Dartdoc {
|
| _currentMember = null;
|
| }
|
|
|
| - void docParamList(ContainerMirror enclosingType,
|
| + void docParamList(DeclarationMirror enclosingType,
|
| List<ParameterMirror> parameters) {
|
| write('(');
|
| bool first = true;
|
| @@ -1684,12 +1703,13 @@ class Dartdoc {
|
| inOptionals = true;
|
| }
|
|
|
| - annotateType(enclosingType, parameter.type, parameter.simpleName);
|
| + annotateType(enclosingType, parameter.type,
|
| + nameOf(parameter));
|
|
|
| // Show the default value for named optional parameters.
|
| if (parameter.isOptional && parameter.hasDefaultValue) {
|
| write(isNamed ? ': ' : ' = ');
|
| - write(parameter.defaultValue);
|
| + write('${parameter.defaultValue}');
|
| }
|
|
|
| first = false;
|
| @@ -1701,7 +1721,7 @@ class Dartdoc {
|
| write(')');
|
| }
|
|
|
| - void docComment(ContainerMirror host, DocComment comment) {
|
| + void docComment(DeclarationMirror host, DocComment comment) {
|
| if (comment != null) {
|
| var html = comment.html;
|
|
|
| @@ -1742,7 +1762,7 @@ class Dartdoc {
|
| * an inherited comment, favouring comments inherited from classes over
|
| * comments inherited from interfaces.
|
| */
|
| - DocComment getMemberComment(MemberMirror member) => getComment(member);
|
| + DocComment getMemberComment(DeclarationMirror member) => getComment(member);
|
|
|
| /**
|
| * Get the doc comment associated with the given declaration.
|
| @@ -1761,8 +1781,9 @@ class Dartdoc {
|
| includeType: false);
|
| for (ClassMirror type in iterable) {
|
| if (isFromPrivateDartLibrary(type)) continue;
|
| - var inheritedMember = type.members[mirror.simpleName];
|
| - if (inheritedMember is MemberMirror) {
|
| + var inheritedMember = type.declarations[mirror.simpleName];
|
| + if (inheritedMember is MethodMirror ||
|
| + inheritedMember is VariableMirror) {
|
| comment = computeComment(inheritedMember);
|
| if (comment != null) {
|
| inheritedFrom = type;
|
| @@ -1811,7 +1832,7 @@ class Dartdoc {
|
| * Gets the URL for the documentation for [type] or `null` if there is no
|
| * link to the documentation of [type].
|
| */
|
| - String typeUrl(ContainerMirror type) {
|
| + String typeUrl(DeclarationMirror type) {
|
| var library = type is LibraryMirror ? type : _libraryFor(type);
|
| if (shouldLinkToPublicApi(library)) {
|
| return "$API_LOCATION${typePath(type)}";
|
| @@ -1823,29 +1844,29 @@ class Dartdoc {
|
| }
|
|
|
| /** Gets the relative path for the documentation for [type]. */
|
| - String typePath(ContainerMirror type) {
|
| + String typePath(DeclarationMirror type) {
|
| + String name = nameOf(type);
|
| if (type is LibraryMirror) {
|
| - return '${sanitize(type.simpleName)}.html';
|
| + return '${sanitize(name)}.html';
|
| }
|
| - if (type.library == null) {
|
| + if (getLibrary(type) == null) {
|
| return '';
|
| }
|
| // Always get the generic type to strip off any type parameters or
|
| // arguments. If the type isn't generic, genericType returns `this`, so it
|
| // works for non-generic types too.
|
| - return '${sanitize(displayName(_libraryFor(type)))}/'
|
| - '${type.originalDeclaration.simpleName}.html';
|
| + return '${sanitize(displayName(_libraryFor(type)))}/${name}.html';
|
| }
|
|
|
| /** Gets the URL for the documentation for [member]. */
|
| - String memberUrl(MemberMirror member) {
|
| + String memberUrl(DeclarationMirror member) {
|
| String url = typeUrl(_ownerFor(member));
|
| return url != null ? '$url#${memberAnchor(member)}' : null;
|
| }
|
|
|
| /** Gets the anchor id for the document for [member]. */
|
| - String memberAnchor(MemberMirror member) {
|
| - return member.simpleName;
|
| + String memberAnchor(DeclarationMirror member) {
|
| + return nameOf(member);
|
| }
|
|
|
| /**
|
| @@ -1866,7 +1887,7 @@ class Dartdoc {
|
| /**
|
| * Writes a type annotation, preferring to print dynamic.
|
| */
|
| - annotateDynamicType(ContainerMirror enclosingType,
|
| + annotateDynamicType(DeclarationMirror enclosingType,
|
| TypeMirror type) {
|
| annotateType(enclosingType, type, type.isDynamic ? 'dynamic ' : null);
|
| }
|
| @@ -1874,7 +1895,7 @@ class Dartdoc {
|
| /**
|
| * Writes a type annotation for the given type and (optional) parameter name.
|
| */
|
| - annotateType(ContainerMirror enclosingType,
|
| + annotateType(DeclarationMirror enclosingType,
|
| TypeMirror type,
|
| [String paramName = null]) {
|
| // Don't bother explicitly displaying dynamic.
|
| @@ -1899,7 +1920,7 @@ class Dartdoc {
|
| }
|
|
|
| /** Writes a link to a human-friendly string representation for a type. */
|
| - linkToType(ContainerMirror enclosingType, TypeMirror type) {
|
| + linkToType(DeclarationMirror enclosingType, TypeMirror type) {
|
| if (type.isVoid) {
|
| // Do not generate links for void.
|
| // TODO(johnniwinter): Generate span for specific style?
|
| @@ -1912,17 +1933,16 @@ class Dartdoc {
|
| return;
|
| }
|
|
|
| - if (type.isTypeVariable) {
|
| + String name = nameOf(type);
|
| + if (type is TypeVariableMirror) {
|
| // If we're using a type parameter within the body of a generic class then
|
| // just link back up to the class.
|
| - write(a(typeUrl(enclosingType), type.simpleName));
|
| + write(a(typeUrl(enclosingType), name));
|
| return;
|
| }
|
|
|
| - assert(type is ClassMirror);
|
| -
|
| // Link to the type.
|
| - write(a(typeUrl(type), type.simpleName));
|
| + write(a(typeUrl(type), name));
|
|
|
| if (type.isOriginalDeclaration) {
|
| // Avoid calling [:typeArguments():] on a declaration.
|
| @@ -1951,47 +1971,48 @@ class Dartdoc {
|
| }
|
|
|
| /** Generates a human-friendly string representation for a type. */
|
| - typeName(TypeMirror type, {bool showBounds: false}) {
|
| + String typeName(TypeMirror type, {bool showBounds: false}) {
|
| if (type.isVoid) {
|
| return 'void';
|
| }
|
| if (type.isDynamic) {
|
| return 'dynamic';
|
| }
|
| + String name = nameOf(type);
|
| if (type is TypeVariableMirror) {
|
| - return type.simpleName;
|
| + return name;
|
| }
|
| - assert(type is ClassMirror);
|
|
|
| // See if it's a generic type.
|
| if (type.isOriginalDeclaration) {
|
| final typeParams = [];
|
| for (final typeParam in type.originalDeclaration.typeVariables) {
|
| + String typeParamName = nameOf(typeParam);
|
| if (showBounds &&
|
| (typeParam.upperBound != null) &&
|
| - !typeParam.upperBound.isObject) {
|
| + !isObject(typeParam.upperBound)) {
|
| final bound = typeName(typeParam.upperBound, showBounds: true);
|
| - typeParams.add('${typeParam.simpleName} extends $bound');
|
| + typeParams.add('${typeParamName} extends $bound');
|
| } else {
|
| - typeParams.add(typeParam.simpleName);
|
| + typeParams.add(typeParamName);
|
| }
|
| }
|
| if (typeParams.isEmpty) {
|
| - return type.simpleName;
|
| + return name;
|
| }
|
| final params = typeParams.join(', ');
|
| - return '${type.simpleName}<$params>';
|
| + return '${name}<$params>';
|
| }
|
|
|
| // See if it's an instantiation of a generic type.
|
| final typeArgs = type.typeArguments;
|
| if (typeArgs.length > 0) {
|
| final args = typeArgs.map((arg) => typeName(arg)).join(', ');
|
| - return '${type.originalDeclaration.simpleName}<$args>';
|
| + return '${name}<$args>';
|
| }
|
|
|
| // Regular type.
|
| - return type.simpleName;
|
| + return name;
|
| }
|
|
|
| /**
|
| @@ -2025,8 +2046,8 @@ class Dartdoc {
|
| * style it appropriately.
|
| */
|
| md.Node resolveNameReference(String name,
|
| - {MemberMirror currentMember,
|
| - ContainerMirror currentType,
|
| + {DeclarationMirror currentMember,
|
| + TypeMirror currentType,
|
| LibraryMirror currentLibrary}) {
|
| makeLink(String href) {
|
| if (href != null) {
|
| @@ -2056,10 +2077,13 @@ class Dartdoc {
|
| }
|
| }
|
|
|
| + // TODO(johnniwinther): Handle private names.
|
| + Symbol symbol = new Symbol(name);
|
| +
|
| // See if it's a parameter of the current method.
|
| if (currentMember is MethodMirror) {
|
| for (final parameter in currentMember.parameters) {
|
| - if (parameter.simpleName == name) {
|
| + if (parameter.simpleName == symbol) {
|
| final element = new md.Element.text('span', name);
|
| element.attributes['class'] = 'param';
|
| return element;
|
| @@ -2068,9 +2092,9 @@ class Dartdoc {
|
| }
|
|
|
| // See if it's another member of the current type.
|
| - if (currentType != null) {
|
| - final foundMember = currentType.members[name];
|
| - if (foundMember != null) {
|
| + if (currentType is ClassMirror) {
|
| + final foundMember = currentType.declarations[symbol];
|
| + if (foundMember is MethodMirror || foundMember is VariableMirror) {
|
| return makeLink(memberUrl(foundMember));
|
| }
|
| }
|
| @@ -2082,15 +2106,18 @@ class Dartdoc {
|
| final constructorLink = (() {
|
| final match =
|
| new RegExp(r'new ([\w$]+)(?:\.([\w$]+))?').firstMatch(name);
|
| - if (match == null) return;
|
| - String typeName = match[1];
|
| - ClassMirror foundtype = currentLibrary.classes[typeName];
|
| - if (foundtype == null) return;
|
| - String constructorName =
|
| - (match[2] == null) ? typeName : '$typeName.${match[2]}';
|
| + if (match == null) return null;
|
| + // TODO(johnniwinther): Handle private names.
|
| + Symbol typeName = new Symbol(match[1]);
|
| + var foundtype = currentLibrary.declarations[typeName];
|
| + if (foundtype is! ClassMirror) return null;
|
| + // TODO(johnniwinther): Handle private names.
|
| + Symbol constructorName =
|
| + (match[2] == null) ? const Symbol('') : new Symbol(match[2]);
|
| final constructor =
|
| - foundtype.constructors[constructorName];
|
| - if (constructor == null) return;
|
| + foundtype.declarations[constructorName];
|
| + if (constructor is! MethodMirror) return null;
|
| + if (!constructor.isConstructor) return null;
|
| return makeLink(memberUrl(constructor));
|
| })();
|
| if (constructorLink != null) return constructorLink;
|
| @@ -2098,23 +2125,28 @@ class Dartdoc {
|
| // See if it's a member of another type
|
| final foreignMemberLink = (() {
|
| final match = new RegExp(r'([\w$]+)\.([\w$]+)').firstMatch(name);
|
| - if (match == null) return;
|
| - ClassMirror foundtype = currentLibrary.classes[match[1]];
|
| - if (foundtype == null) return;
|
| - MemberMirror foundMember = foundtype.members[match[2]];
|
| - if (foundMember == null) return;
|
| + if (match == null) return null;
|
| + // TODO(johnniwinther): Handle private names.
|
| + Symbol typeName = new Symbol(match[1]);
|
| + var foundtype = currentLibrary.declarations[typeName];
|
| + if (foundtype == null) return null;
|
| + // TODO(johnniwinther): Handle private names.
|
| + Symbol memberName = new Symbol(match[2]);
|
| + final foundMember = foundtype.declarations[memberName];
|
| + if (foundMember is! MethodMirror &&
|
| + foundMember is! VariableMirror) return null;
|
| return makeLink(memberUrl(foundMember));
|
| })();
|
| if (foreignMemberLink != null) return foreignMemberLink;
|
|
|
| - ClassMirror foundType = currentLibrary.classes[name];
|
| - if (foundType != null) {
|
| + var foundType = currentLibrary.declarations[symbol];
|
| + if (foundType is TypeMirror) {
|
| return makeLink(typeUrl(foundType));
|
| }
|
|
|
| // See if it's a top-level member in the current library.
|
| - MemberMirror foundMember = currentLibrary.members[name];
|
| - if (foundMember != null) {
|
| + var foundMember = currentLibrary.declarations[symbol];
|
| + if (foundMember is MethodMirror || foundMember is VariableMirror) {
|
| return makeLink(memberUrl(foundMember));
|
| }
|
| }
|
| @@ -2154,8 +2186,8 @@ class Dartdoc {
|
| * Returns [:true:] if [type] should be regarded as an exception.
|
| */
|
| bool isException(TypeMirror type) {
|
| - return type.simpleName.endsWith('Exception') ||
|
| - type.simpleName.endsWith('Error');
|
| + String name = nameOf(type);
|
| + return name.endsWith('Exception') || name.endsWith('Error');
|
| }
|
|
|
| /**
|
| @@ -2170,14 +2202,14 @@ class Dartdoc {
|
| * hidden libraries.
|
| */
|
| List<ClassMirror> _libraryClasses(LibraryMirror library) =>
|
| - _libraryContents(library, (lib) => lib.classes.values);
|
| + _libraryContents(library, (lib) => typesOf(lib.declarations).toList());
|
|
|
| /**
|
| * Returns a list of top-level members in [library], including members it
|
| * exports from hidden libraries.
|
| */
|
| - List<MemberMirror> _libraryMembers(LibraryMirror library) =>
|
| - _libraryContents(library, (lib) => lib.members.values);
|
| + List<DeclarationMirror> _libraryMembers(LibraryMirror library) =>
|
| + _libraryContents(library, (lib) => membersOf(lib.declarations).toList());
|
|
|
|
|
| /**
|
| @@ -2206,7 +2238,7 @@ class Dartdoc {
|
| * exporter.
|
| */
|
| LibraryMirror _libraryFor(TypeMirror type) =>
|
| - _visibleLibrary(type.library, displayName(type));
|
| + _visibleLibrary(getLibrary(type), displayName(type));
|
|
|
| /**
|
| * Returns the owner of [declaration]. If [declaration]'s owner is a hidden
|
|
|