From 49e733dccda3985eb22d51767c0fd6b65e1eea6d Mon Sep 17 00:00:00 2001 From: Mike Fairhurst Date: Thu, 4 Apr 2019 17:12:21 -0700 Subject: [PATCH] Roll attribute selector Closes #1771 PiperOrigin-RevId: 242039436 --- .../lib/src/selector/attribute_selector.dart | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 angular_analyzer_plugin/lib/src/selector/attribute_selector.dart diff --git a/angular_analyzer_plugin/lib/src/selector/attribute_selector.dart b/angular_analyzer_plugin/lib/src/selector/attribute_selector.dart new file mode 100644 index 0000000000..c308cd6afa --- /dev/null +++ b/angular_analyzer_plugin/lib/src/selector/attribute_selector.dart @@ -0,0 +1,42 @@ +import 'package:angular_analyzer_plugin/src/selector/attribute_selector_base.dart'; +import 'package:angular_analyzer_plugin/src/selector/element_view.dart'; +import 'package:angular_analyzer_plugin/src/selector/html_tag_for_selector.dart'; +import 'package:angular_analyzer_plugin/src/selector/selector.dart'; +import 'package:angular_analyzer_plugin/src/selector/match.dart'; +import 'package:angular_analyzer_plugin/src/selector/name.dart'; + +/// The [Selector] that matches elements that have an attribute with the +/// given name, and (optionally) with the given value; +class AttributeSelector extends AttributeSelectorBase { + @override + final SelectorName nameElement; + final String value; + + AttributeSelector(this.nameElement, this.value); + + @override + List getAttributes(ElementView element) => + match(element, null) == SelectorMatch.NonTagMatch ? [] : [nameElement]; + + @override + bool matchValue(String attributeValue) => + value == null || attributeValue == value; + + @override + List refineTagSuggestions( + List context) { + for (final tag in context) { + tag.setAttribute(nameElement.string, value: value); + } + return context; + } + + @override + String toString() { + final name = nameElement.string; + if (value != null) { + return '[$name=$value]'; + } + return '[$name]'; + } +}