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

Side by Side Diff: pkg/dartdoc/lib/dartdoc.dart

Issue 11363005: ObjectMirror => ContainerMirror (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Test updated Created 8 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/dartdoc/lib/mirrors.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /** 5 /**
6 * To generate docs for a library, run this script with the path to an 6 * To generate docs for a library, run this script with the path to an
7 * entrypoint .dart file, like: 7 * entrypoint .dart file, like:
8 * 8 *
9 * $ dart dartdoc.dart foo.dart 9 * $ dart dartdoc.dart foo.dart
10 * 10 *
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 final libraryList = []; 573 final libraryList = [];
574 for (final library in _sortedLibraries) { 574 for (final library in _sortedLibraries) {
575 docLibraryNavigationJson(library, libraryList); 575 docLibraryNavigationJson(library, libraryList);
576 } 576 }
577 return libraryList; 577 return libraryList;
578 } 578 }
579 579
580 void docLibraryNavigationJson(LibraryMirror library, List libraryList) { 580 void docLibraryNavigationJson(LibraryMirror library, List libraryList) {
581 var libraryInfo = {}; 581 var libraryInfo = {};
582 libraryInfo[NAME] = displayName(library); 582 libraryInfo[NAME] = displayName(library);
583 final List members = docMembersJson(library.declaredMembers); 583 final List members = docMembersJson(library.members);
584 if (!members.isEmpty) { 584 if (!members.isEmpty) {
585 libraryInfo[MEMBERS] = members; 585 libraryInfo[MEMBERS] = members;
586 } 586 }
587 587
588 final types = []; 588 final types = [];
589 for (ClassMirror type in orderByName(library.classes.values)) { 589 for (ClassMirror type in orderByName(library.classes.values)) {
590 if (!showPrivate && type.isPrivate) continue; 590 if (!showPrivate && type.isPrivate) continue;
591 591
592 var typeInfo = {}; 592 var typeInfo = {};
593 typeInfo[NAME] = type.displayName; 593 typeInfo[NAME] = type.displayName;
594 if (type.isClass) { 594 if (type.isClass) {
595 typeInfo[KIND] = CLASS; 595 typeInfo[KIND] = CLASS;
596 } else if (type.isInterface) { 596 } else if (type.isInterface) {
597 typeInfo[KIND] = INTERFACE; 597 typeInfo[KIND] = INTERFACE;
598 } else { 598 } else {
599 assert(type.isTypedef); 599 assert(type.isTypedef);
600 typeInfo[KIND] = TYPEDEF; 600 typeInfo[KIND] = TYPEDEF;
601 } 601 }
602 final List typeMembers = docMembersJson(type.declaredMembers); 602 final List typeMembers = docMembersJson(type.members);
603 if (!typeMembers.isEmpty) { 603 if (!typeMembers.isEmpty) {
604 typeInfo[MEMBERS] = typeMembers; 604 typeInfo[MEMBERS] = typeMembers;
605 } 605 }
606 606
607 if (!type.originalDeclaration.typeVariables.isEmpty) { 607 if (!type.originalDeclaration.typeVariables.isEmpty) {
608 final typeVariables = []; 608 final typeVariables = [];
609 for (final typeVariable in type.originalDeclaration.typeVariables) { 609 for (final typeVariable in type.originalDeclaration.typeVariables) {
610 typeVariables.add(typeVariable.displayName); 610 typeVariables.add(typeVariable.displayName);
611 } 611 }
612 typeInfo[ARGS] = Strings.join(typeVariables, ', '); 612 typeInfo[ARGS] = Strings.join(typeVariables, ', ');
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
1005 1005
1006 static final Map<String, int> operatorOrderMap = (){ 1006 static final Map<String, int> operatorOrderMap = (){
1007 var map = new Map<String, int>(); 1007 var map = new Map<String, int>();
1008 var index = 0; 1008 var index = 0;
1009 for (String operator in operatorOrder) { 1009 for (String operator in operatorOrder) {
1010 map[operator] = index++; 1010 map[operator] = index++;
1011 } 1011 }
1012 return map; 1012 return map;
1013 }(); 1013 }();
1014 1014
1015 void docMembers(ObjectMirror host) { 1015 void docMembers(ContainerMirror host) {
1016 // Collect the different kinds of members. 1016 // Collect the different kinds of members.
1017 final staticMethods = []; 1017 final staticMethods = [];
1018 final staticGetters = new Map<String,MemberMirror>(); 1018 final staticGetters = new Map<String,MemberMirror>();
1019 final staticSetters = new Map<String,MemberMirror>(); 1019 final staticSetters = new Map<String,MemberMirror>();
1020 final memberMap = new Map<String,MemberMirror>(); 1020 final memberMap = new Map<String,MemberMirror>();
1021 final instanceMethods = []; 1021 final instanceMethods = [];
1022 final instanceOperators = []; 1022 final instanceOperators = [];
1023 final instanceGetters = new Map<String,MemberMirror>(); 1023 final instanceGetters = new Map<String,MemberMirror>();
1024 final instanceSetters = new Map<String,MemberMirror>(); 1024 final instanceSetters = new Map<String,MemberMirror>();
1025 final constructors = []; 1025 final constructors = [];
1026 1026
1027 host.declaredMembers.forEach((_, MemberMirror member) { 1027 host.members.forEach((_, MemberMirror member) {
1028 if (!showPrivate && member.isPrivate) return; 1028 if (!showPrivate && member.isPrivate) return;
1029 if (host is LibraryMirror || member.isStatic) { 1029 if (host is LibraryMirror || member.isStatic) {
1030 if (member is MethodMirror) { 1030 if (member is MethodMirror) {
1031 if (member.isGetter) { 1031 if (member.isGetter) {
1032 staticGetters[member.displayName] = member; 1032 staticGetters[member.displayName] = member;
1033 } else if (member.isSetter) { 1033 } else if (member.isSetter) {
1034 staticSetters[member.displayName] = member; 1034 staticSetters[member.displayName] = member;
1035 } else { 1035 } else {
1036 staticMethods.add(member); 1036 staticMethods.add(member);
1037 } 1037 }
1038 } else if (member is VariableMirror) { 1038 } else if (member is VariableMirror) {
1039 staticGetters[member.displayName] = member; 1039 staticGetters[member.displayName] = member;
1040 } 1040 }
1041 } 1041 }
1042 }); 1042 });
1043 1043
1044 if (host is ClassMirror) { 1044 if (host is ClassMirror) {
1045 var iterable = new HierarchyIterable(host, includeType: true); 1045 var iterable = new HierarchyIterable(host, includeType: true);
1046 for (ClassMirror type in iterable) { 1046 for (ClassMirror type in iterable) {
1047 if (!host.isObject && !inheritFromObject && type.isObject) continue; 1047 if (!host.isObject && !inheritFromObject && type.isObject) continue;
1048 1048
1049 type.declaredMembers.forEach((_, MemberMirror member) { 1049 type.members.forEach((_, MemberMirror member) {
1050 if (member.isStatic) return; 1050 if (member.isStatic) return;
1051 if (!showPrivate && member.isPrivate) return; 1051 if (!showPrivate && member.isPrivate) return;
1052 1052
1053 bool inherit = true; 1053 bool inherit = true;
1054 if (type !== host) { 1054 if (type !== host) {
1055 if (member.isPrivate) { 1055 if (member.isPrivate) {
1056 // Don't inherit private members. 1056 // Don't inherit private members.
1057 inherit = false; 1057 inherit = false;
1058 } 1058 }
1059 if (member.isConstructor) { 1059 if (member.isConstructor) {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 allInherited: allPropertiesInherited); 1128 allInherited: allPropertiesInherited);
1129 docMethods(host, 'Operators', instanceOperators, 1129 docMethods(host, 'Operators', instanceOperators,
1130 allInherited: allOperatorsInherited); 1130 allInherited: allOperatorsInherited);
1131 docMethods(host, 'Methods', orderByName(instanceMethods), 1131 docMethods(host, 'Methods', orderByName(instanceMethods),
1132 allInherited: allMethodsInherited); 1132 allInherited: allMethodsInherited);
1133 } 1133 }
1134 1134
1135 /** 1135 /**
1136 * Documents fields, getters, and setters as properties. 1136 * Documents fields, getters, and setters as properties.
1137 */ 1137 */
1138 void docProperties(ObjectMirror host, String title, 1138 void docProperties(ContainerMirror host, String title,
1139 Map<String,MemberMirror> getters, 1139 Map<String,MemberMirror> getters,
1140 Map<String,MemberMirror> setters, 1140 Map<String,MemberMirror> setters,
1141 {bool allInherited}) { 1141 {bool allInherited}) {
1142 if (getters.isEmpty && setters.isEmpty) return; 1142 if (getters.isEmpty && setters.isEmpty) return;
1143 1143
1144 var nameSet = new Set<String>.from(getters.keys); 1144 var nameSet = new Set<String>.from(getters.keys);
1145 nameSet.addAll(setters.keys); 1145 nameSet.addAll(setters.keys);
1146 var nameList = new List<String>.from(nameSet); 1146 var nameList = new List<String>.from(nameSet);
1147 nameList.sort((String a, String b) { 1147 nameList.sort((String a, String b) {
1148 return a.toLowerCase().compareTo(b.toLowerCase()); 1148 return a.toLowerCase().compareTo(b.toLowerCase());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1187 } 1187 }
1188 } else { 1188 } else {
1189 // Document as field. 1189 // Document as field.
1190 docProperty(host, getter, setter); 1190 docProperty(host, getter, setter);
1191 } 1191 }
1192 } 1192 }
1193 } 1193 }
1194 writeln('</div>'); 1194 writeln('</div>');
1195 } 1195 }
1196 1196
1197 void docMethods(ObjectMirror host, String title, List<MethodMirror> methods, 1197 void docMethods(ContainerMirror host, String title, List<MethodMirror> methods ,
1198 {bool allInherited}) { 1198 {bool allInherited}) {
1199 if (methods.length > 0) { 1199 if (methods.length > 0) {
1200 writeln('<div${allInherited ? ' class="inherited"' : ''}>'); 1200 writeln('<div${allInherited ? ' class="inherited"' : ''}>');
1201 writeln('<h3>$title</h3>'); 1201 writeln('<h3>$title</h3>');
1202 for (final method in methods) { 1202 for (final method in methods) {
1203 docMethod(host, method); 1203 docMethod(host, method);
1204 } 1204 }
1205 writeln('</div>'); 1205 writeln('</div>');
1206 } 1206 }
1207 } 1207 }
1208 1208
1209 /** 1209 /**
1210 * Documents the [member] declared in [host]. Handles all kinds of members 1210 * Documents the [member] declared in [host]. Handles all kinds of members
1211 * including getters, setters, and constructors. If [member] is a 1211 * including getters, setters, and constructors. If [member] is a
1212 * [FieldMirror] it is documented as a getter or setter depending upon the 1212 * [FieldMirror] it is documented as a getter or setter depending upon the
1213 * value of [asGetter]. 1213 * value of [asGetter].
1214 */ 1214 */
1215 void docMethod(ObjectMirror host, MemberMirror member, 1215 void docMethod(ContainerMirror host, MemberMirror member,
1216 {bool asGetter: false}) { 1216 {bool asGetter: false}) {
1217 _totalMembers++; 1217 _totalMembers++;
1218 _currentMember = member; 1218 _currentMember = member;
1219 1219
1220 bool isAbstract = false; 1220 bool isAbstract = false;
1221 String name = member.displayName; 1221 String name = member.displayName;
1222 if (member is VariableMirror) { 1222 if (member is VariableMirror) {
1223 if (asGetter) { 1223 if (asGetter) {
1224 // Getter. 1224 // Getter.
1225 name = 'get $name'; 1225 name = 'get $name';
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1301 writeln('<div class="doc">'); 1301 writeln('<div class="doc">');
1302 docComment(host, getMemberComment(member)); 1302 docComment(host, getMemberComment(member));
1303 if (showCode) { 1303 if (showCode) {
1304 docCode(member.location); 1304 docCode(member.location);
1305 } 1305 }
1306 writeln('</div>'); 1306 writeln('</div>');
1307 1307
1308 writeln('</div>'); 1308 writeln('</div>');
1309 } 1309 }
1310 1310
1311 void docField(ObjectMirror host, VariableMirror field, 1311 void docField(ContainerMirror host, VariableMirror field,
1312 {bool asGetter: false, bool asSetter: false}) { 1312 {bool asGetter: false, bool asSetter: false}) {
1313 if (asGetter) { 1313 if (asGetter) {
1314 docMethod(host, field, asGetter: true); 1314 docMethod(host, field, asGetter: true);
1315 } else if (asSetter) { 1315 } else if (asSetter) {
1316 docMethod(host, field, asGetter: false); 1316 docMethod(host, field, asGetter: false);
1317 } else { 1317 } else {
1318 docProperty(host, field, null); 1318 docProperty(host, field, null);
1319 } 1319 }
1320 } 1320 }
1321 1321
1322 /** 1322 /**
1323 * Documents the property defined by [getter] and [setter] of declared in 1323 * Documents the property defined by [getter] and [setter] of declared in
1324 * [host]. If [getter] is a [FieldMirror], [setter] must be [:null:]. 1324 * [host]. If [getter] is a [FieldMirror], [setter] must be [:null:].
1325 * Otherwise, if [getter] is a [MethodMirror], the property is considered 1325 * Otherwise, if [getter] is a [MethodMirror], the property is considered
1326 * final if [setter] is [:null:]. 1326 * final if [setter] is [:null:].
1327 */ 1327 */
1328 void docProperty(ObjectMirror host, 1328 void docProperty(ContainerMirror host,
1329 MemberMirror getter, MemberMirror setter) { 1329 MemberMirror getter, MemberMirror setter) {
1330 assert(getter != null); 1330 assert(getter != null);
1331 _totalMembers++; 1331 _totalMembers++;
1332 _currentMember = getter; 1332 _currentMember = getter;
1333 1333
1334 bool inherited = host != getter.owner; 1334 bool inherited = host != getter.owner;
1335 1335
1336 writeln('<div class="field${inherited ? ' inherited' : ''}">' 1336 writeln('<div class="field${inherited ? ' inherited' : ''}">'
1337 '<h4 id="${memberAnchor(getter)}">'); 1337 '<h4 id="${memberAnchor(getter)}">');
1338 1338
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1386 docComment(host, comment); 1386 docComment(host, comment);
1387 docCode(getter.location); 1387 docCode(getter.location);
1388 if (setter != null) { 1388 if (setter != null) {
1389 docCode(setter.location); 1389 docCode(setter.location);
1390 } 1390 }
1391 writeln('</div>'); 1391 writeln('</div>');
1392 1392
1393 writeln('</div>'); 1393 writeln('</div>');
1394 } 1394 }
1395 1395
1396 void docParamList(ObjectMirror enclosingType, 1396 void docParamList(ContainerMirror enclosingType,
1397 List<ParameterMirror> parameters) { 1397 List<ParameterMirror> parameters) {
1398 write('('); 1398 write('(');
1399 bool first = true; 1399 bool first = true;
1400 bool inOptionals = false; 1400 bool inOptionals = false;
1401 for (final parameter in parameters) { 1401 for (final parameter in parameters) {
1402 if (!first) write(', '); 1402 if (!first) write(', ');
1403 1403
1404 if (!inOptionals && parameter.isOptional) { 1404 if (!inOptionals && parameter.isOptional) {
1405 write('['); 1405 write('[');
1406 inOptionals = true; 1406 inOptionals = true;
1407 } 1407 }
1408 1408
1409 annotateType(enclosingType, parameter.type, parameter.simpleName); 1409 annotateType(enclosingType, parameter.type, parameter.simpleName);
1410 1410
1411 // Show the default value for named optional parameters. 1411 // Show the default value for named optional parameters.
1412 if (parameter.isOptional && parameter.hasDefaultValue) { 1412 if (parameter.isOptional && parameter.hasDefaultValue) {
1413 write(' = '); 1413 write(' = ');
1414 write(parameter.defaultValue); 1414 write(parameter.defaultValue);
1415 } 1415 }
1416 1416
1417 first = false; 1417 first = false;
1418 } 1418 }
1419 1419
1420 if (inOptionals) write(']'); 1420 if (inOptionals) write(']');
1421 write(')'); 1421 write(')');
1422 } 1422 }
1423 1423
1424 void docComment(ObjectMirror host, DocComment comment) { 1424 void docComment(ContainerMirror host, DocComment comment) {
1425 if (comment != null) { 1425 if (comment != null) {
1426 if (comment.inheritedFrom !== null) { 1426 if (comment.inheritedFrom !== null) {
1427 writeln('<div class="inherited">'); 1427 writeln('<div class="inherited">');
1428 writeln(comment.html); 1428 writeln(comment.html);
1429 write('<div class="docs-inherited-from">docs inherited from '); 1429 write('<div class="docs-inherited-from">docs inherited from ');
1430 annotateType(host, comment.inheritedFrom); 1430 annotateType(host, comment.inheritedFrom);
1431 write('</div>'); 1431 write('</div>');
1432 writeln('</div>'); 1432 writeln('</div>');
1433 } else { 1433 } else {
1434 writeln(comment.html); 1434 writeln(comment.html);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1475 */ 1475 */
1476 DocComment getMemberComment(MemberMirror member) { 1476 DocComment getMemberComment(MemberMirror member) {
1477 String comment = _comments.find(member.location); 1477 String comment = _comments.find(member.location);
1478 ClassMirror inheritedFrom = null; 1478 ClassMirror inheritedFrom = null;
1479 if (comment == null) { 1479 if (comment == null) {
1480 if (member.owner is ClassMirror) { 1480 if (member.owner is ClassMirror) {
1481 var iterable = 1481 var iterable =
1482 new HierarchyIterable(member.owner, 1482 new HierarchyIterable(member.owner,
1483 includeType: false); 1483 includeType: false);
1484 for (ClassMirror type in iterable) { 1484 for (ClassMirror type in iterable) {
1485 var inheritedMember = type.declaredMembers[member.simpleName]; 1485 var inheritedMember = type.members[member.simpleName];
1486 if (inheritedMember is MemberMirror) { 1486 if (inheritedMember is MemberMirror) {
1487 comment = _comments.find(inheritedMember.location); 1487 comment = _comments.find(inheritedMember.location);
1488 if (comment != null) { 1488 if (comment != null) {
1489 inheritedFrom = type; 1489 inheritedFrom = type;
1490 break; 1490 break;
1491 } 1491 }
1492 } 1492 }
1493 } 1493 }
1494 } 1494 }
1495 } 1495 }
(...skipping 22 matching lines...) Expand all
1518 // a scheme to be relative. 1518 // a scheme to be relative.
1519 return const RegExp(r'^\w+:').hasMatch(url); 1519 return const RegExp(r'^\w+:').hasMatch(url);
1520 } 1520 }
1521 1521
1522 /** Gets the URL to the documentation for [library]. */ 1522 /** Gets the URL to the documentation for [library]. */
1523 String libraryUrl(LibraryMirror library) { 1523 String libraryUrl(LibraryMirror library) {
1524 return '${sanitize(displayName(library))}.html'; 1524 return '${sanitize(displayName(library))}.html';
1525 } 1525 }
1526 1526
1527 /** Gets the URL for the documentation for [type]. */ 1527 /** Gets the URL for the documentation for [type]. */
1528 String typeUrl(ObjectMirror type) { 1528 String typeUrl(ContainerMirror type) {
1529 if (type is LibraryMirror) { 1529 if (type is LibraryMirror) {
1530 return '${sanitize(type.simpleName)}.html'; 1530 return '${sanitize(type.simpleName)}.html';
1531 } 1531 }
1532 assert (type is TypeMirror); 1532 assert (type is TypeMirror);
1533 // Always get the generic type to strip off any type parameters or 1533 // Always get the generic type to strip off any type parameters or
1534 // arguments. If the type isn't generic, genericType returns `this`, so it 1534 // arguments. If the type isn't generic, genericType returns `this`, so it
1535 // works for non-generic types too. 1535 // works for non-generic types too.
1536 return '${sanitize(displayName(type.library))}/' 1536 return '${sanitize(displayName(type.library))}/'
1537 '${type.originalDeclaration.simpleName}.html'; 1537 '${type.originalDeclaration.simpleName}.html';
1538 } 1538 }
(...skipping 16 matching lines...) Expand all
1555 String a(String href, String contents, [String css]) { 1555 String a(String href, String contents, [String css]) {
1556 // Mark outgoing external links, mainly so we can style them. 1556 // Mark outgoing external links, mainly so we can style them.
1557 final rel = isAbsolute(href) ? ' ref="external"' : ''; 1557 final rel = isAbsolute(href) ? ' ref="external"' : '';
1558 final cssClass = css == null ? '' : ' class="$css"'; 1558 final cssClass = css == null ? '' : ' class="$css"';
1559 return '<a href="${relativePath(href)}"$cssClass$rel>$contents</a>'; 1559 return '<a href="${relativePath(href)}"$cssClass$rel>$contents</a>';
1560 } 1560 }
1561 1561
1562 /** 1562 /**
1563 * Writes a type annotation for the given type and (optional) parameter name. 1563 * Writes a type annotation for the given type and (optional) parameter name.
1564 */ 1564 */
1565 annotateType(ObjectMirror enclosingType, 1565 annotateType(ContainerMirror enclosingType,
1566 TypeMirror type, 1566 TypeMirror type,
1567 [String paramName = null]) { 1567 [String paramName = null]) {
1568 // Don't bother explicitly displaying Dynamic. 1568 // Don't bother explicitly displaying Dynamic.
1569 if (type.isDynamic) { 1569 if (type.isDynamic) {
1570 if (paramName !== null) write(paramName); 1570 if (paramName !== null) write(paramName);
1571 return; 1571 return;
1572 } 1572 }
1573 1573
1574 // For parameters, handle non-typedefed function types. 1574 // For parameters, handle non-typedefed function types.
1575 if (paramName !== null && type is FunctionTypeMirror) { 1575 if (paramName !== null && type is FunctionTypeMirror) {
1576 annotateType(enclosingType, type.returnType); 1576 annotateType(enclosingType, type.returnType);
1577 write(paramName); 1577 write(paramName);
1578 1578
1579 docParamList(enclosingType, type.parameters); 1579 docParamList(enclosingType, type.parameters);
1580 return; 1580 return;
1581 } 1581 }
1582 1582
1583 linkToType(enclosingType, type); 1583 linkToType(enclosingType, type);
1584 1584
1585 write(' '); 1585 write(' ');
1586 if (paramName !== null) write(paramName); 1586 if (paramName !== null) write(paramName);
1587 } 1587 }
1588 1588
1589 /** Writes a link to a human-friendly string representation for a type. */ 1589 /** Writes a link to a human-friendly string representation for a type. */
1590 linkToType(ObjectMirror enclosingType, TypeMirror type) { 1590 linkToType(ContainerMirror enclosingType, TypeMirror type) {
1591 if (type.isVoid) { 1591 if (type.isVoid) {
1592 // Do not generate links for void. 1592 // Do not generate links for void.
1593 // TODO(johnniwinter): Generate span for specific style? 1593 // TODO(johnniwinter): Generate span for specific style?
1594 write('void'); 1594 write('void');
1595 return; 1595 return;
1596 } 1596 }
1597 if (type.isDynamic) { 1597 if (type.isDynamic) {
1598 // Do not generate links for Dynamic. 1598 // Do not generate links for Dynamic.
1599 write('Dynamic'); 1599 write('Dynamic');
1600 return; 1600 return;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1710 return classifySource(code); 1710 return classifySource(code);
1711 } 1711 }
1712 1712
1713 /** 1713 /**
1714 * This will be called whenever a doc comment hits a `[name]` in square 1714 * This will be called whenever a doc comment hits a `[name]` in square
1715 * brackets. It will try to figure out what the name refers to and link or 1715 * brackets. It will try to figure out what the name refers to and link or
1716 * style it appropriately. 1716 * style it appropriately.
1717 */ 1717 */
1718 md.Node resolveNameReference(String name, 1718 md.Node resolveNameReference(String name,
1719 {MemberMirror currentMember, 1719 {MemberMirror currentMember,
1720 ObjectMirror currentType, 1720 ContainerMirror currentType,
1721 LibraryMirror currentLibrary}) { 1721 LibraryMirror currentLibrary}) {
1722 makeLink(String href) { 1722 makeLink(String href) {
1723 final anchor = new md.Element.text('a', name); 1723 final anchor = new md.Element.text('a', name);
1724 anchor.attributes['href'] = relativePath(href); 1724 anchor.attributes['href'] = relativePath(href);
1725 anchor.attributes['class'] = 'crossref'; 1725 anchor.attributes['class'] = 'crossref';
1726 return anchor; 1726 return anchor;
1727 } 1727 }
1728 1728
1729 // See if it's a parameter of the current method. 1729 // See if it's a parameter of the current method.
1730 if (currentMember is MethodMirror) { 1730 if (currentMember is MethodMirror) {
1731 for (final parameter in currentMember.parameters) { 1731 for (final parameter in currentMember.parameters) {
1732 if (parameter.simpleName == name) { 1732 if (parameter.simpleName == name) {
1733 final element = new md.Element.text('span', name); 1733 final element = new md.Element.text('span', name);
1734 element.attributes['class'] = 'param'; 1734 element.attributes['class'] = 'param';
1735 return element; 1735 return element;
1736 } 1736 }
1737 } 1737 }
1738 } 1738 }
1739 1739
1740 // See if it's another member of the current type. 1740 // See if it's another member of the current type.
1741 if (currentType != null) { 1741 if (currentType != null) {
1742 final foundMember = currentType.declaredMembers[name]; 1742 final foundMember = currentType.members[name];
1743 if (foundMember != null) { 1743 if (foundMember != null) {
1744 return makeLink(memberUrl(foundMember)); 1744 return makeLink(memberUrl(foundMember));
1745 } 1745 }
1746 } 1746 }
1747 1747
1748 // See if it's another type or a member of another type in the current 1748 // See if it's another type or a member of another type in the current
1749 // library. 1749 // library.
1750 if (currentLibrary != null) { 1750 if (currentLibrary != null) {
1751 // See if it's a constructor 1751 // See if it's a constructor
1752 final constructorLink = (() { 1752 final constructorLink = (() {
(...skipping 11 matching lines...) Expand all
1764 return makeLink(memberUrl(constructor)); 1764 return makeLink(memberUrl(constructor));
1765 })(); 1765 })();
1766 if (constructorLink != null) return constructorLink; 1766 if (constructorLink != null) return constructorLink;
1767 1767
1768 // See if it's a member of another type 1768 // See if it's a member of another type
1769 final foreignMemberLink = (() { 1769 final foreignMemberLink = (() {
1770 final match = new RegExp(r'([\w$]+)\.([\w$]+)').firstMatch(name); 1770 final match = new RegExp(r'([\w$]+)\.([\w$]+)').firstMatch(name);
1771 if (match == null) return; 1771 if (match == null) return;
1772 ClassMirror foundtype = currentLibrary.classes[match[1]]; 1772 ClassMirror foundtype = currentLibrary.classes[match[1]];
1773 if (foundtype == null) return; 1773 if (foundtype == null) return;
1774 MemberMirror foundMember = foundtype.declaredMembers[match[2]]; 1774 MemberMirror foundMember = foundtype.members[match[2]];
1775 if (foundMember == null) return; 1775 if (foundMember == null) return;
1776 return makeLink(memberUrl(foundMember)); 1776 return makeLink(memberUrl(foundMember));
1777 })(); 1777 })();
1778 if (foreignMemberLink != null) return foreignMemberLink; 1778 if (foreignMemberLink != null) return foreignMemberLink;
1779 1779
1780 ClassMirror foundType = currentLibrary.classes[name]; 1780 ClassMirror foundType = currentLibrary.classes[name];
1781 if (foundType != null) { 1781 if (foundType != null) {
1782 return makeLink(typeUrl(foundType)); 1782 return makeLink(typeUrl(foundType));
1783 } 1783 }
1784 1784
1785 // See if it's a top-level member in the current library. 1785 // See if it's a top-level member in the current library.
1786 MemberMirror foundMember = currentLibrary.declaredMembers[name]; 1786 MemberMirror foundMember = currentLibrary.members[name];
1787 if (foundMember != null) { 1787 if (foundMember != null) {
1788 return makeLink(memberUrl(foundMember)); 1788 return makeLink(memberUrl(foundMember));
1789 } 1789 }
1790 } 1790 }
1791 1791
1792 // TODO(rnystrom): Should also consider: 1792 // TODO(rnystrom): Should also consider:
1793 // * Names imported by libraries this library imports. 1793 // * Names imported by libraries this library imports.
1794 // * Type parameters of the enclosing type. 1794 // * Type parameters of the enclosing type.
1795 1795
1796 return new md.Element.text('code', name); 1796 return new md.Element.text('code', name);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1857 final ClassMirror inheritedFrom; 1857 final ClassMirror inheritedFrom;
1858 1858
1859 DocComment(this.text, [this.inheritedFrom = null]) { 1859 DocComment(this.text, [this.inheritedFrom = null]) {
1860 assert(text != null && !text.trim().isEmpty); 1860 assert(text != null && !text.trim().isEmpty);
1861 } 1861 }
1862 1862
1863 String get html => md.markdownToHtml(text); 1863 String get html => md.markdownToHtml(text);
1864 1864
1865 String toString() => text; 1865 String toString() => text;
1866 } 1866 }
OLDNEW
« no previous file with comments | « no previous file | pkg/dartdoc/lib/mirrors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698