Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 2fbb60b

Browse files
vicbtravis@travis-ci.org
authored and
travis@travis-ci.org
committed
perf(_ElementSelector): Remove recursion in addDirective
1 parent 0385409 commit 2fbb60b

File tree

1 file changed

+31
-34
lines changed

1 file changed

+31
-34
lines changed

Diff for: lib/core_dom/selector.dart

+31-34
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class DirectiveSelector {
3838
}
3939

4040
if ((match = _CONTAINS_REGEXP.firstMatch(selector)) != null) {
41-
textSelector.add(new _ContainsSelector(annotation, match.group(1)));
41+
textSelector.add(new _ContainsSelector(annotation, match[1]));
4242
} else if ((match = _ATTR_CONTAINS_REGEXP.firstMatch(selector)) != null) {
4343
attrSelector.add(new _ContainsSelector(annotation, match[1]));
4444
} else if ((selectorParts = _splitCss(selector, type)) != null){
@@ -223,42 +223,39 @@ class _ElementSelector {
223223
_ElementSelector(this._name);
224224

225225
void addDirective(List<_SelectorPart> selectorParts, _Directive directive) {
226-
var selectorPart = selectorParts.removeAt(0);
227-
var terminal = selectorParts.isEmpty;
226+
assert(selectorParts.isNotEmpty);
227+
var elSelector = this;
228228
var name;
229-
if ((name = selectorPart.element) != null) {
230-
if (terminal) {
231-
_elementMap.putIfAbsent(name, () => []).add(directive);
232-
} else {
233-
_elementPartialMap
234-
.putIfAbsent(name, () => new _ElementSelector(name))
235-
.addDirective(selectorParts, directive);
236-
}
237-
} else if ((name = selectorPart.className) != null) {
238-
if (terminal) {
239-
_classMap
240-
.putIfAbsent(name, () => [])
241-
.add(directive);
242-
} else {
243-
_classPartialMap
244-
.putIfAbsent(name, () => new _ElementSelector(name))
245-
.addDirective(selectorParts, directive);
246-
}
247-
} else if ((name = selectorPart.attrName) != null) {
248-
if (terminal) {
249-
_attrValueMap
250-
.putIfAbsent(name, () => <String, List<_Directive>>{})
251-
.putIfAbsent(selectorPart.attrValue, () => [])
252-
.add(directive);
229+
for (var i = 0; i < selectorParts.length; i++) {
230+
var part = selectorParts[i];
231+
var terminal = i == selectorParts.length - 1;
232+
if ((name = part.element) != null) {
233+
if (terminal) {
234+
elSelector._elementMap.putIfAbsent(name, () => []).add(directive);
235+
} else {
236+
elSelector = elSelector._elementPartialMap
237+
.putIfAbsent(name, () => new _ElementSelector(name));
238+
}
239+
} else if ((name = part.className) != null) {
240+
if (terminal) {
241+
elSelector._classMap.putIfAbsent(name, () => []).add(directive);
242+
} else {
243+
elSelector = elSelector._classPartialMap
244+
.putIfAbsent(name, () => new _ElementSelector(name));
245+
}
246+
} else if ((name = part.attrName) != null) {
247+
if (terminal) {
248+
elSelector._attrValueMap.putIfAbsent(name, () => <String, List<_Directive>>{})
249+
.putIfAbsent(part.attrValue, () => [])
250+
.add(directive);
251+
} else {
252+
elSelector = elSelector._attrValuePartialMap
253+
.putIfAbsent(name, () => <String, _ElementSelector>{})
254+
.putIfAbsent(part.attrValue, () => new _ElementSelector(name));
255+
}
253256
} else {
254-
_attrValuePartialMap
255-
.putIfAbsent(name, () => <String, _ElementSelector>{})
256-
.putIfAbsent(selectorPart.attrValue, () =>
257-
new _ElementSelector(name))
258-
.addDirective(selectorParts, directive);
257+
throw "Unknown selector part '$part'.";
259258
}
260-
} else {
261-
throw "Unknown selector part '$selectorPart'.";
262259
}
263260
}
264261

0 commit comments

Comments
 (0)