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

Unified Diff: sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart

Issue 16957002: Use Pattern.matchAsPrefix to let String.indexOf/lastIndexOf/startsWith accept Pattern. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments. Created 7 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart
diff --git a/sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart
index d2feaa81ee5643a83bdcfab971d401199ca6684d..0e923a3986a17a6771f6be2d6cb1319204be486d 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart
@@ -114,15 +114,15 @@ class JSSyntaxRegExp implements RegExp {
}
class _MatchImplementation implements Match {
- final String pattern;
+ final Pattern pattern;
final String str;
final int start;
final int end;
final List<String> _groups;
const _MatchImplementation(
- String this.pattern,
- String this.str,
+ this.pattern,
+ this.str,
int this.start,
int this.end,
List<String> this._groups);
@@ -150,23 +150,46 @@ class _AllMatchesIterable extends IterableBase<Match> {
}
class _AllMatchesIterator implements Iterator<Match> {
- final RegExp _re;
- final String _str;
+ final RegExp _regExp;
+ final RegExp _globalRegExp;
+ String _str;
Match _current;
_AllMatchesIterator(JSSyntaxRegExp re, String this._str)
- : _re = new JSSyntaxRegExp._globalVersionOf(re);
+ : _regExp = re,
+ _globalRegExp = new JSSyntaxRegExp._globalVersionOf(re);
Match get current => _current;
bool moveNext() {
+ if (_str == null) return false;
// firstMatch actually acts as nextMatch because of
// hidden global flag.
if (_current != null && _current.start == _current.end) {
// Advance implicit start-position if last match was empty.
- JS("void", "#.lastIndex++", regExpGetNative(_re));
+ JS("void", "#.lastIndex++", regExpGetNative(_globalRegExp));
+ }
+ List<String> m =
+ JS('=List|Null', r'#.exec(#)', regExpGetNative(_globalRegExp), _str);
+ if (m == null) {
+ _current = null;
+ _str = null; // Marks iteration as ended.
+ return false;
}
- _current = _re.firstMatch(_str);
- return _current != null;
+ var matchStart = JS('int', r'#.index', m);
+ var matchEnd = matchStart + m[0].length;
+ _current = new _MatchImplementation(_regExp, _str, matchStart, matchEnd, m);
+ return true;
}
}
+
+Match firstMatchAfter(JSSyntaxRegExp re, String str, int start) {
+ JSSyntaxRegExp global = new JSSyntaxRegExp._globalVersionOf(re);
+ JS("void", "#.lastIndex = #", regExpGetNative(global), start);
+ List<String> m =
+ JS('=List|Null', r'#.exec(#)', regExpGetNative(global), checkString(str));
+ if (m == null) return null;
+ var matchStart = JS('int', r'#.index', m);
+ var matchEnd = matchStart + m[0].length;
+ return new _MatchImplementation(re, str, matchStart, matchEnd, m);
+}

Powered by Google App Engine
This is Rietveld 408576698