| Index: sdk/lib/_internal/dartdoc/lib/universe_serializer.dart
|
| diff --git a/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart b/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart
|
| index d69b8a0a8b4c013bb3265451fd19f1cc4ba074f1..f2ffbcfecb88ecbd65c572587a34a7182bb50c9d 100755
|
| --- a/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart
|
| +++ b/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart
|
| @@ -14,8 +14,18 @@ import '../../compiler/implementation/mirrors/dart2js_mirror.dart' as dart2js;
|
| import '../../libraries.dart';
|
| import 'dartdoc.dart';
|
|
|
| +String _stripUri(String uri) {
|
| + String prefix = "/dart/";
|
| + int start = uri.indexOf(prefix);
|
| + if (start != -1) {
|
| + return uri.substring(start + prefix.length);
|
| + } else {
|
| + return uri;
|
| + }
|
| +}
|
| +
|
| /**
|
| - * Base class for all nodes.
|
| + * Base class for all elements in the AST.
|
| */
|
| class Element {
|
| /** Human readable type name for the node. */
|
| @@ -28,8 +38,22 @@ class Element {
|
| final String comment;
|
| /** Children of the node. */
|
| List<Element> children;
|
| + /** Whether the element is private. */
|
| + final bool isPrivate;
|
| +
|
| + /**
|
| + * Uri containing the definition of the element.
|
| + */
|
| + String uri;
|
| + /**
|
| + * Line in the original source file that starts the definition of the element.
|
| + */
|
| + String line;
|
|
|
| - Element(this.kind, this.name, this.id, this.comment);
|
| + Element(Mirror mirror, this.kind, this.name, this.id, this.comment)
|
| + : line = mirror.location.line.toString(),
|
| + isPrivate = _optionalBool(mirror.isPrivate),
|
| + uri = _stripUri(mirror.location.sourceUri.toString());
|
|
|
| void addChild(Element child) {
|
| if (children == null) {
|
| @@ -37,6 +61,24 @@ class Element {
|
| }
|
| children.add(child);
|
| }
|
| +
|
| + /**
|
| + * Remove all URIs that exactly match the parent node's URI.
|
| + * This reduces output file size by about 20%.
|
| + */
|
| + void stripDuplicateUris(String parentUri, parentLine) {
|
| + if (children != null) {
|
| + for (var child in children) {
|
| + child.stripDuplicateUris(uri, line);
|
| + }
|
| + }
|
| + if (parentUri == uri) {
|
| + uri = null;
|
| + }
|
| + if (line == parentLine) {
|
| + line = null;
|
| + }
|
| + }
|
| }
|
|
|
| /**
|
| @@ -45,12 +87,18 @@ class Element {
|
| */
|
| bool _optionalBool(bool value) => value == true ? true : null;
|
|
|
| +Reference _optionalReference(Mirror mirror) {
|
| + return (mirror != null && mirror.simpleName != "Dynamic_" &&
|
| + mirror.simpleName != "dynamic") ?
|
| + new Reference(mirror) : null;
|
| +}
|
| +
|
| /**
|
| * [Element] describing a Dart library.
|
| */
|
| class LibraryElement extends Element {
|
| LibraryElement(String name, LibraryMirror mirror)
|
| - : super('library', name, mirror.uri.toString(), computeComment(mirror)) {
|
| + : super(mirror, 'library', name, name, computeComment(mirror)) {
|
|
|
| mirror.functions.forEach((childName, childMirror) {
|
| addChild(new MethodElement(childName, childMirror));
|
| @@ -82,22 +130,26 @@ class LibraryElement extends Element {
|
| class ClassElement extends Element {
|
| /** Base class.*/
|
| final Reference superclass;
|
| + /** Whether the class is abstract. */
|
| + final bool isAbstract;
|
| /** Interfaces the class implements. */
|
| List<Reference> interfaces;
|
|
|
| ClassElement(String name, ClassMirror mirror)
|
| - : super('class', mirror.simpleName, name, computeComment(mirror)),
|
| - superclass = mirror.superclass != null ?
|
| - new Reference(mirror.superclass) : null {
|
| + : super(mirror, 'class', mirror.simpleName, name, computeComment(mirror)),
|
| + superclass = _optionalReference(mirror.superclass),
|
| + isAbstract = _optionalBool(mirror.isAbstract) {
|
| for (var interface in mirror.superinterfaces) {
|
| if (this.interfaces == null) {
|
| this.interfaces = <Reference>[];
|
| }
|
| - this.interfaces.add(new Reference(interface));
|
| + this.interfaces.add(_optionalReference(interface));
|
| }
|
|
|
| mirror.methods.forEach((childName, childMirror) {
|
| - addChild(new MethodElement(childName, childMirror));
|
| + if (!childMirror.isConstructor && !childMirror.isGetter) {
|
| + addChild(new MethodElement(childName, childMirror));
|
| + }
|
| });
|
|
|
| mirror.getters.forEach((childName, childMirror) {
|
| @@ -111,6 +163,10 @@ class ClassElement extends Element {
|
| mirror.constructors.forEach((constructorName, methodMirror) {
|
| addChild(new MethodElement(constructorName, methodMirror, 'constructor'));
|
| });
|
| +
|
| + for (var typeVariable in mirror.originalDeclaration.typeVariables) {
|
| + addChild(new TypeParameterElement(typeVariable));
|
| + }
|
| }
|
| }
|
|
|
| @@ -123,9 +179,8 @@ class GetterElement extends Element {
|
| final bool isStatic;
|
|
|
| GetterElement(String name, MethodMirror mirror)
|
| - : super('property', mirror.simpleName, name, computeComment(mirror)),
|
| - ref = mirror.returnType != null ?
|
| - new Reference(mirror.returnType) : null,
|
| + : super(mirror, 'property', mirror.simpleName, name, computeComment(mirror)),
|
| + ref = _optionalReference(mirror.returnType),
|
| isStatic = _optionalBool(mirror.isStatic);
|
| }
|
|
|
| @@ -140,10 +195,9 @@ class MethodElement extends Element {
|
| final bool isStatic;
|
|
|
| MethodElement(String name, MethodMirror mirror, [String kind = 'method'])
|
| - : super(kind, name, '$name${mirror.parameters.length}()',
|
| + : super(mirror, kind, name, '$name${mirror.parameters.length}()',
|
| computeComment(mirror)),
|
| - returnType = mirror.returnType != null ?
|
| - new Reference(mirror.returnType) : null,
|
| + returnType = _optionalReference(mirror.returnType),
|
| isSetter = _optionalBool(mirror.isSetter),
|
| isOperator = _optionalBool(mirror.isOperator),
|
| isStatic = _optionalBool(mirror.isStatic) {
|
| @@ -164,32 +218,67 @@ class ParameterElement extends Element {
|
| final bool isOptional;
|
|
|
| ParameterElement(ParameterMirror mirror)
|
| - : super('param', mirror.simpleName, mirror.simpleName, null),
|
| - ref = new Reference(mirror.type),
|
| + : super(mirror, 'param', mirror.simpleName, mirror.simpleName, null),
|
| + ref = _optionalReference(mirror.type),
|
| isOptional = _optionalBool(mirror.isOptional) {
|
| }
|
| }
|
|
|
| /**
|
| + * Element describing a generic type parameter.
|
| + */
|
| +class TypeParameterElement extends Element {
|
| + /**
|
| + * Upper bound for the parameter.
|
| + *
|
| + * In the following code sample, [:Bar:] is an upper bound:
|
| + * [: class Bar<T extends Foo> { } :]
|
| + */
|
| + Reference upperBound;
|
| +
|
| + TypeParameterElement(TypeMirror mirror)
|
| + : super(mirror, 'typeparam', mirror.simpleName, mirror.simpleName, null),
|
| + upperBound = mirror.upperBound != null && !mirror.upperBound.isObject ?
|
| + new Reference(mirror.upperBound) : null;
|
| +}
|
| +
|
| +/**
|
| * Element describing a variable.
|
| */
|
| class VariableElement extends Element {
|
| /** Type of the variable. */
|
| final Reference ref;
|
| + /** Whether the variable is static. */
|
| final bool isStatic;
|
| + /** Whether the variable is final. */
|
| + final bool isFinal;
|
|
|
| VariableElement(String name, VariableMirror mirror)
|
| - : super('property', mirror.simpleName, name, null),
|
| - ref = new Reference(mirror.type),
|
| - isStatic = _optionalBool(mirror.isStatic);
|
| + : super(mirror, 'variable', mirror.simpleName, name, null),
|
| + ref = _optionalReference(mirror.type),
|
| + isStatic = _optionalBool(mirror.isStatic),
|
| + isFinal = _optionalBool(mirror.isFinal);
|
| }
|
| -// TODO(jacobr): this seems incomplete.
|
| +
|
| /**
|
| - * Element describing a typedef element.
|
| + * Element describing a typedef.
|
| */
|
| +
|
| class TypedefElement extends Element {
|
| + /** Return type of the typedef. */
|
| + final Reference returnType;
|
| +
|
| TypedefElement(String name, TypedefMirror mirror)
|
| - : super('typedef', mirror.simpleName, name, computeComment(mirror));
|
| + : super(mirror, 'typedef', mirror.simpleName, name,
|
| + computeComment(mirror)),
|
| + returnType = _optionalReference(mirror.value.returnType) {
|
| + for (var param in mirror.value.parameters) {
|
| + addChild(new ParameterElement(param));
|
| + }
|
| + for (var typeVariable in mirror.originalDeclaration.typeVariables) {
|
| + addChild(new TypeParameterElement(typeVariable));
|
| + }
|
| + }
|
| }
|
|
|
| /**
|
| @@ -201,14 +290,13 @@ class Reference {
|
| List<Reference> arguments;
|
|
|
| Reference(Mirror mirror)
|
| - : name = mirror.simpleName,
|
| + : name = mirror.displayName,
|
| refId = getId(mirror) {
|
| if (mirror is ClassMirror) {
|
| - if (mirror is !TypedefMirror
|
| - && mirror.typeArguments.length > 0) {
|
| + if (mirror is !TypedefMirror && !mirror.typeArguments.isEmpty) {
|
| arguments = <Reference>[];
|
| for (var typeArg in mirror.typeArguments) {
|
| - arguments.add(new Reference(typeArg));
|
| + arguments.add(_optionalReference(typeArg));
|
| }
|
| }
|
| }
|
| @@ -216,11 +304,8 @@ class Reference {
|
|
|
| static String getId(Mirror mirror) {
|
| String id = mirror.simpleName;
|
| - if (mirror is MemberMirror) {
|
| - MemberMirror memberMirror = mirror;
|
| - if (memberMirror.owner != null) {
|
| - id = '${getId(memberMirror.owner)}/$id';
|
| - }
|
| + if (mirror.owner != null) {
|
| + id = '${getId(mirror.owner)}/$id';
|
| }
|
| return id;
|
| }
|
|
|