| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 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. |
| 4 |
| 5 library docgen.models.method; |
| 6 |
| 7 import 'package:markdown/markdown.dart' as markdown; |
| 8 |
| 9 import '../exports/mirrors_util.dart' as dart2js_util; |
| 10 import '../exports/source_mirrors.dart'; |
| 11 |
| 12 import '../library_helpers.dart'; |
| 13 |
| 14 import 'class.dart'; |
| 15 import 'doc_gen_type.dart'; |
| 16 import 'dummy_mirror.dart'; |
| 17 import 'indexable.dart'; |
| 18 import 'model_helpers.dart'; |
| 19 import 'owned_indexable.dart'; |
| 20 import 'parameter.dart'; |
| 21 |
| 22 |
| 23 /// A class containing properties of a Dart method. |
| 24 class Method extends OwnedIndexable { |
| 25 |
| 26 /// Parameters for this method. |
| 27 final Map<String, Parameter> parameters; |
| 28 |
| 29 final bool isStatic; |
| 30 final bool isAbstract; |
| 31 final bool isConst; |
| 32 final DocGenType returnType; |
| 33 Method methodInheritedFrom; |
| 34 |
| 35 /// Qualified name to state where the comment is inherited from. |
| 36 String commentInheritedFrom = ""; |
| 37 |
| 38 factory Method(MethodMirror mirror, Indexable owner, |
| 39 [Method methodInheritedFrom]) { |
| 40 var method = getDocgenObject(mirror, owner); |
| 41 if (method is DummyMirror) { |
| 42 method = new Method._(mirror, owner, methodInheritedFrom); |
| 43 } |
| 44 return method; |
| 45 } |
| 46 |
| 47 Method._(MethodMirror mirror, Indexable owner, this.methodInheritedFrom) |
| 48 : returnType = new DocGenType(mirror.returnType, owner.owningLibrary), |
| 49 isStatic = mirror.isStatic, |
| 50 isAbstract = mirror.isAbstract, |
| 51 isConst = mirror.isConstConstructor, |
| 52 parameters = createParameters(mirror.parameters, owner), |
| 53 super(mirror, owner); |
| 54 |
| 55 Method get originallyInheritedFrom => methodInheritedFrom == null ? |
| 56 this : methodInheritedFrom.originallyInheritedFrom; |
| 57 |
| 58 /// Look for the specified name starting with the current member, and |
| 59 /// progressively working outward to the current library scope. |
| 60 String findElementInScope(String name) { |
| 61 var lookupFunc = determineLookupFunc(name); |
| 62 |
| 63 var memberScope = lookupFunc(this.mirror, name); |
| 64 if (memberScope != null) { |
| 65 // do we check for a dummy mirror returned here and look up with an owner |
| 66 // higher ooooor in getDocgenObject do we include more things in our |
| 67 // lookup |
| 68 var result = getDocgenObject(memberScope, owner); |
| 69 if (result is DummyMirror && owner.owner != null |
| 70 && owner.owner is! DummyMirror) { |
| 71 var aresult = getDocgenObject(memberScope, owner.owner); |
| 72 if (aresult is! DummyMirror) result = aresult; |
| 73 } |
| 74 if (result is DummyMirror) return packagePrefix + result.docName; |
| 75 return result.packagePrefix + result.docName; |
| 76 } |
| 77 |
| 78 if (owner != null) { |
| 79 var result = owner.findElementInScope(name); |
| 80 if (result != null) return result; |
| 81 } |
| 82 return super.findElementInScope(name); |
| 83 } |
| 84 |
| 85 String get docName { |
| 86 if ((mirror as MethodMirror).isConstructor) { |
| 87 // We name constructors specially -- including the class name again and a |
| 88 // "-" to separate the constructor from its name (if any). |
| 89 return '${owner.docName}.${dart2js_util.nameOf(mirror.owner)}-' |
| 90 '${dart2js_util.nameOf(mirror)}'; |
| 91 } |
| 92 return super.docName; |
| 93 } |
| 94 |
| 95 String get fileName => packagePrefix + docName; |
| 96 |
| 97 /// Makes sure that the method with an inherited equivalent have comments. |
| 98 void ensureCommentFor(Method inheritedMethod) { |
| 99 if (comment.isNotEmpty) return; |
| 100 |
| 101 comment = inheritedMethod.commentToHtml(this); |
| 102 unresolvedComment = inheritedMethod.unresolvedComment; |
| 103 commentInheritedFrom = inheritedMethod.commentInheritedFrom == '' ? |
| 104 new DummyMirror(inheritedMethod.mirror).docName : |
| 105 inheritedMethod.commentInheritedFrom; |
| 106 } |
| 107 |
| 108 /// Generates a map describing the [Method] object. |
| 109 Map toMap() => { |
| 110 'name': name, |
| 111 'qualifiedName': qualifiedName, |
| 112 'comment': comment, |
| 113 'commentFrom': (methodInheritedFrom != null && |
| 114 commentInheritedFrom == methodInheritedFrom.docName ? '' |
| 115 : commentInheritedFrom), |
| 116 'inheritedFrom': (methodInheritedFrom == null? '' : |
| 117 originallyInheritedFrom.docName), |
| 118 'static': isStatic, |
| 119 'abstract': isAbstract, |
| 120 'constant': isConst, |
| 121 'return': [returnType.toMap()], |
| 122 'parameters': recurseMap(parameters), |
| 123 'annotations': annotations.map((a) => a.toMap()).toList() |
| 124 }; |
| 125 |
| 126 String get typeName { |
| 127 MethodMirror theMirror = mirror; |
| 128 if (theMirror.isConstructor) return 'constructor'; |
| 129 if (theMirror.isGetter) return 'getter'; |
| 130 if (theMirror.isSetter) return 'setter'; |
| 131 if (theMirror.isOperator) return 'operator'; |
| 132 return 'method'; |
| 133 } |
| 134 |
| 135 String get comment { |
| 136 if (commentField != null) return commentField; |
| 137 if (owner is Class) { |
| 138 (owner as Class).ensureComments(); |
| 139 } |
| 140 var result = super.comment; |
| 141 if (result == '' && methodInheritedFrom != null) { |
| 142 // This should be NOT from the MIRROR, but from the COMMENT. |
| 143 methodInheritedFrom.comment; // Ensure comment field has been populated. |
| 144 unresolvedComment = methodInheritedFrom.unresolvedComment; |
| 145 |
| 146 comment = unresolvedComment == null ? '' : |
| 147 markdown.markdownToHtml(unresolvedComment.trim(), |
| 148 linkResolver: fixReference, inlineSyntaxes: MARKDOWN_SYNTAXES); |
| 149 commentInheritedFrom = comment != '' ? |
| 150 methodInheritedFrom.commentInheritedFrom : ''; |
| 151 result = comment; |
| 152 } |
| 153 return result; |
| 154 } |
| 155 |
| 156 bool isValidMirror(DeclarationMirror mirror) => mirror is MethodMirror; |
| 157 } |
| OLD | NEW |