Index: utils/apidoc/html_diff.dart |
diff --git a/utils/apidoc/html_diff.dart b/utils/apidoc/html_diff.dart |
index f39cb12018f755f02276e40b461d3aa9f96deab1..78388bc16835936908fe1dd8801a8fbb1cbd00b5 100644 |
--- a/utils/apidoc/html_diff.dart |
+++ b/utils/apidoc/html_diff.dart |
@@ -9,6 +9,8 @@ |
library html_diff; |
import 'dart:io'; |
+import 'dart:async'; |
+import '../../sdk/lib/html/html_common/metadata.dart'; |
// TODO(rnystrom): Use "package:" URL (#4968). |
import '../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart'; |
@@ -33,34 +35,34 @@ const List<String> HTML_DECLARED_NAMES = const [ |
* based on two indicators: |
* |
* 1. Auto-detected wrappers. Most `dart:html` types correspond |
- * straightforwardly to a single `@domName` type, and |
+ * straightforwardly to a single `@DomName` type, and |
* have the same name. In addition, most `dart:html` methods |
- * just call a single `@domName` method. This class |
+ * just call a single `@DomName` method. This class |
* detects these simple correspondences automatically. |
* |
* 2. Manual annotations. When it's not clear which |
- * `@domName` items a given `dart:html` item |
+ * `@DomName` items a given `dart:html` item |
* corresponds to, the `dart:html` item can be annotated in the |
- * documentation comments using the `@domName` annotation. |
+ * documentation comments using the `@DomName` annotation. |
* |
- * The `@domName` annotations for types and members are of the form |
- * `@domName NAME(, NAME)*`, where the `NAME`s refer to the |
- * `@domName` types/members that correspond to the |
+ * The `@DomName` annotations for types and members are of the form |
+ * `@DomName NAME(, NAME)*`, where the `NAME`s refer to the |
+ * `@DomName` types/members that correspond to the |
* annotated `dart:html` type/member. `NAME`s on member annotations |
* can refer to either fully-qualified member names (e.g. |
* `Document.createElement`) or unqualified member names |
* (e.g. `createElement`). Unqualified member names are assumed to |
- * refer to members of one of the corresponding `@domName` |
+ * refer to members of one of the corresponding `@DomName` |
* types. |
*/ |
class HtmlDiff { |
/** |
* A map from `dart:html` members to the corresponding fully qualified |
- * `@domName` member(s). |
+ * `@DomName` member(s). |
*/ |
final Map<String, Set<String>> htmlToDom; |
- /** A map from `dart:html` types to corresponding `@domName` types. */ |
+ /** A map from `dart:html` types to corresponding `@DomName` types. */ |
final Map<String, Set<String>> htmlTypesToDom; |
final CommentMap comments; |
@@ -98,7 +100,7 @@ class HtmlDiff { |
} |
/** |
- * Computes the `@domName` to `dart:html` mapping, and |
+ * Computes the `@DomName` to `dart:html` mapping, and |
* places it in [htmlToDom] and [htmlTypesToDom]. Before this is run, dart2js |
* should be initialized (via [parseOptions] and [initializeWorld]) and |
* [HtmlDiff.initialize] should be called. |
@@ -124,9 +126,9 @@ class HtmlDiff { |
} |
/** |
- * Records the `@domName` to `dart:html` mapping for |
+ * Records the `@DomName` to `dart:html` mapping for |
* [htmlMember] (from `dart:html`). [domTypes] are the |
- * `@domName` type values that correspond to [htmlMember]'s |
+ * `@DomName` type values that correspond to [htmlMember]'s |
* defining type. |
*/ |
void _addMemberDiff(MemberMirror htmlMember, List<String> domTypes, |
@@ -146,18 +148,21 @@ class HtmlDiff { |
} |
/** |
- * Returns the `@domName` type values that correspond to |
+ * Returns the `@DomName` type values that correspond to |
* [htmlType] from `dart:html`. This can be the empty list if no |
* correspondence is found. |
*/ |
List<String> htmlToDomTypes(ClassMirror htmlType) { |
- if (htmlType.simpleName == null) return []; |
- final tags = _getTags(comments.find(htmlType.location)); |
- if (tags.containsKey('domName')) { |
+ if (htmlType.simpleName == null) return <String>[]; |
+ |
+ final domNameMetadata = _findMetadata(htmlType.metadata, 'DomName'); |
+ if (domNameMetadata != null) { |
var domNames = <String>[]; |
- for (var s in tags['domName'].split(',')) { |
+ var tags = deprecatedFutureValue(domNameMetadata.getField('name')); |
+ for (var s in tags.reflectee.split(',')) { |
domNames.add(s.trim()); |
} |
+ |
if (domNames.length == 1 && domNames[0] == 'none') return <String>[]; |
return domNames; |
} |
@@ -165,20 +170,23 @@ class HtmlDiff { |
} |
/** |
- * Returns the `@domName` member values that correspond to |
+ * Returns the `@DomName` member values that correspond to |
* [htmlMember] from `dart:html`. This can be the empty set if no |
* correspondence is found. [domTypes] are the |
- * `@domName` type values that correspond to [htmlMember]'s |
+ * `@DomName` type values that correspond to [htmlMember]'s |
* defining type. |
*/ |
Set<String> htmlToDomMembers(MemberMirror htmlMember, List<String> domTypes) { |
if (htmlMember.isPrivate) return new Set(); |
- final tags = _getTags(comments.find(htmlMember.location)); |
- if (tags.containsKey('domName')) { |
+ |
+ final domNameMetadata = _findMetadata(htmlMember.metadata, 'DomName'); |
+ if (domNameMetadata != null) { |
var domNames = <String>[]; |
- for (var s in tags['domName'].split(',')) { |
+ var tags = deprecatedFutureValue(domNameMetadata.getField('name')); |
+ for (var s in tags.reflectee.split(',')) { |
domNames.add(s.trim()); |
} |
+ |
if (domNames.length == 1 && domNames[0] == 'none') return new Set(); |
final members = new Set(); |
domNames.forEach((name) { |
@@ -204,12 +212,12 @@ class HtmlDiff { |
} |
/** |
- * Returns the `@domName` strings that are indicated by |
+ * Returns the `@DomName` strings that are indicated by |
* [name]. [name] can be either an unqualified member name |
* (e.g. `createElement`), in which case it's treated as the name of |
* a member of one of [defaultTypes], or a fully-qualified member |
* name (e.g. `Document.createElement`), in which case it's treated as a |
- * member of the @domName element (`Document` in this case). |
+ * member of the @DomName element (`Document` in this case). |
*/ |
Set<String> _membersFromName(String name, List<String> defaultTypes) { |
if (!name.contains('.', 0)) { |
@@ -229,21 +237,11 @@ class HtmlDiff { |
return new Set.from([name]); |
} |
- /** |
- * Extracts a [Map] from tag names to values from [comment], which is parsed |
- * from a Dart source file via dartdoc. Tags are of the form `@NAME VALUE`, |
- * where `NAME` is alphabetic and `VALUE` can contain any character other than |
- * `;`. Multiple tags can be separated by semicolons. |
- * |
- * At time of writing, the only tag that's used is `@domName`. |
- */ |
- Map<String, String> _getTags(String comment) { |
- if (comment == null) return const <String, String>{}; |
- final re = new RegExp("@([a-zA-Z]+) ([^;]+)(?:;|\$)"); |
- final tags = <String, String>{}; |
- for (var m in re.allMatches(comment.trim())) { |
- tags[m[1]] = m[2]; |
- } |
- return tags; |
- } |
+} |
+ |
+/// Returns the metadata for the given string or null if not found. |
+InstanceMirror _findMetadata(List<InstanceMirror> metadataList, String find) { |
+ return metadataList.firstMatching( |
+ (metadata) => metadata.type.simpleName == find, |
+ orElse: () => null); |
} |