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

Side by Side Diff: utils/dartdoc/dartdoc.dart

Issue 9146016: Add the ability to link to members and constructors of other classes in Dartdoc. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Get tests running again. Created 8 years, 11 months 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 | utils/dartdoc/files.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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 use it, from this directory, run: 6 * To use it, from this directory, run:
7 * 7 *
8 * $ ./dartdoc <path to .dart file> 8 * $ ./dartdoc <path to .dart file>
9 * 9 *
10 * This will create a "docs" directory with the docs for your libraries. To 10 * This will create a "docs" directory with the docs for your libraries. To
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 */ 787 */
788 md.Node resolveNameReference(String name, [Member member = null, 788 md.Node resolveNameReference(String name, [Member member = null,
789 Type type = null, Library library = null]) { 789 Type type = null, Library library = null]) {
790 makeLink(String href) { 790 makeLink(String href) {
791 final anchor = new md.Element.text('a', name); 791 final anchor = new md.Element.text('a', name);
792 anchor.attributes['href'] = relativePath(href); 792 anchor.attributes['href'] = relativePath(href);
793 anchor.attributes['class'] = 'crossref'; 793 anchor.attributes['class'] = 'crossref';
794 return anchor; 794 return anchor;
795 } 795 }
796 796
797 findMember(Type type) { 797 findMember(Type type, String memberName) {
798 final member = type.members[name]; 798 final member = type.members[memberName];
799 if (member == null) return null; 799 if (member == null) return null;
800 800
801 // Special case: if the member we've resolved is a property (i.e. it wraps 801 // Special case: if the member we've resolved is a property (i.e. it wraps
802 // a getter and/or setter then *that* member itself won't be on the docs, 802 // a getter and/or setter then *that* member itself won't be on the docs,
803 // just the getter or setter will be. So pick one of those to link to. 803 // just the getter or setter will be. So pick one of those to link to.
804 if (member.isProperty) { 804 if (member.isProperty) {
805 return member.canGet ? member.getter : member.setter; 805 return member.canGet ? member.getter : member.setter;
806 } 806 }
807 807
808 return member; 808 return member;
809 } 809 }
810 810
811 // See if it's a parameter of the current method. 811 // See if it's a parameter of the current method.
812 if (member != null) { 812 if (member != null) {
813 for (final parameter in member.parameters) { 813 for (final parameter in member.parameters) {
814 if (parameter.name == name) { 814 if (parameter.name == name) {
815 final element = new md.Element.text('span', name); 815 final element = new md.Element.text('span', name);
816 element.attributes['class'] = 'param'; 816 element.attributes['class'] = 'param';
817 return element; 817 return element;
818 } 818 }
819 } 819 }
820 } 820 }
821 821
822 // See if it's another member of the current type. 822 // See if it's another member of the current type.
823 if (type != null) { 823 if (type != null) {
824 final member = findMember(type); 824 final member = findMember(type, name);
825 if (member != null) { 825 if (member != null) {
826 return makeLink(memberUrl(member)); 826 return makeLink(memberUrl(member));
827 } 827 }
828 } 828 }
829 829
830 // See if it's another type in the current library. 830 // See if it's another type or a member of another type in the current
831 // library.
831 if (library != null) { 832 if (library != null) {
833 // See if it's a constructor
834 final constructorLink = (() {
835 final match = new RegExp(@'new (\w+)(?:\.(\w+))?').firstMatch(name);
836 if (match == null) return;
837 final type = library.types[match[1]];
838 if (type == null) return;
839 final constructor = type.getConstructor(
840 match[2] == null ? '' : match[2]);
841 if (constructor == null) return;
842 return makeLink(memberUrl(constructor));
843 })();
844 if (constructorLink != null) return constructorLink;
845
846 // See if it's a member of another type
847 final foreignMemberLink = (() {
848 final match = new RegExp(@'(\w+)\.(\w+)').firstMatch(name);
849 if (match == null) return;
850 final type = library.types[match[1]];
851 if (type == null) return;
852 final member = findMember(type, match[2]);
853 if (member == null) return;
854 return makeLink(memberUrl(member));
855 })();
856 if (foreignMemberLink != null) return foreignMemberLink;
857
832 final type = library.types[name]; 858 final type = library.types[name];
833 if (type != null) { 859 if (type != null) {
834 return makeLink(typeUrl(type)); 860 return makeLink(typeUrl(type));
835 } 861 }
836 862
837 // See if it's a top-level member in the current library. 863 // See if it's a top-level member in the current library.
838 final member = findMember(library.topType); 864 final member = findMember(library.topType, name);
839 if (member != null) { 865 if (member != null) {
840 return makeLink(memberUrl(member)); 866 return makeLink(memberUrl(member));
841 } 867 }
842 } 868 }
843 869
844 // TODO(rnystrom): Should also consider: 870 // TODO(rnystrom): Should also consider:
845 // * Names imported by libraries this library imports. 871 // * Names imported by libraries this library imports.
846 // * Type parameters of the enclosing type. 872 // * Type parameters of the enclosing type.
847 873
848 return new md.Element.text('code', name); 874 return new md.Element.text('code', name);
849 } 875 }
850 876
851 // TODO(rnystrom): Move into SourceSpan? 877 // TODO(rnystrom): Move into SourceSpan?
852 int getSpanColumn(SourceSpan span) { 878 int getSpanColumn(SourceSpan span) {
853 final line = span.file.getLine(span.start); 879 final line = span.file.getLine(span.start);
854 return span.file.getColumn(line, span.start); 880 return span.file.getColumn(line, span.start);
855 } 881 }
856 } 882 }
OLDNEW
« no previous file with comments | « no previous file | utils/dartdoc/files.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698