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

Side by Side Diff: frog/lib/corelib_impl.dart

Issue 8907042: Support replaceAll for regexps. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 9 years 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | frog/lib/string_implementation.dart » ('j') | frog/lib/string_implementation.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #library("dart:coreimpl"); 5 #library("dart:coreimpl");
6 6
7 #source("../../corelib/src/implementation/dual_pivot_quicksort.dart"); 7 #source("../../corelib/src/implementation/dual_pivot_quicksort.dart");
8 #source("../../corelib/src/implementation/duration_implementation.dart"); 8 #source("../../corelib/src/implementation/duration_implementation.dart");
9 #source("../../corelib/src/implementation/exceptions.dart"); 9 #source("../../corelib/src/implementation/exceptions.dart");
10 #source("../../corelib/src/implementation/future_implementation.dart"); 10 #source("../../corelib/src/implementation/future_implementation.dart");
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 int get _lastIndex() native "return this.re.lastIndex;"; 272 int get _lastIndex() native "return this.re.lastIndex;";
273 273
274 bool hasMatch(String str) native "return this.re.test(str);"; 274 bool hasMatch(String str) native "return this.re.test(str);";
275 275
276 String stringMatch(String str) { 276 String stringMatch(String str) {
277 var match = firstMatch(str); 277 var match = firstMatch(str);
278 return match === null ? null : match.group(0); 278 return match === null ? null : match.group(0);
279 } 279 }
280 280
281 Iterable<Match> allMatches(String str) => new _AllMatchesIterable(this, str); 281 Iterable<Match> allMatches(String str) => new _AllMatchesIterable(this, str);
282
283 /**
284 * Returns a new RegExp with the same pattern as this one and with the
285 * "global" flag set. This allows us to match this RegExp against a string
286 * multiple times, to support things like [allMatches] and
287 * [String.replaceAll].
288 *
289 * Note that the returned RegExp disobeys the normal API in that it maintains
Jennifer Messerly 2011/12/14 20:36:56 nice refactoring :) out of curiosity--what does i
nweiz 2011/12/14 21:39:21 It's an implementation note. When a JS regexp has
290 * state about the location of the last match.
291 */
292 JSSyntaxRegExp get _global() => new JSSyntaxRegExp._create(pattern,
293 'g' + (multiLine ? 'm' : '') + (ignoreCase ? 'i' : ''));
282 } 294 }
283 295
284 class MatchImplementation implements Match { 296 class MatchImplementation implements Match {
285 const MatchImplementation( 297 const MatchImplementation(
286 String this.pattern, 298 String this.pattern,
287 String this.str, 299 String this.str,
288 int this._start, 300 int this._start,
289 int this._end, 301 int this._end,
290 List<String> this._groups); 302 List<String> this._groups);
291 303
(...skipping 24 matching lines...) Expand all
316 328
317 Iterator<Match> iterator() => new _AllMatchesIterator(_re, _str); 329 Iterator<Match> iterator() => new _AllMatchesIterator(_re, _str);
318 } 330 }
319 331
320 class _AllMatchesIterator implements Iterator<Match> { 332 class _AllMatchesIterator implements Iterator<Match> {
321 final RegExp _re; 333 final RegExp _re;
322 final String _str; 334 final String _str;
323 Match _next; 335 Match _next;
324 bool _done; 336 bool _done;
325 337
326 _AllMatchesIterator(RegExp re, String this._str) 338 _AllMatchesIterator(JSSyntaxRegExp re, String this._str)
327 : _done = false, 339 : _done = false, _re = re._global;
328 _re = new JSSyntaxRegExp._create(re.pattern,
329 // Create a new RegExp with the "global" flag set so we can use it to
330 // iterate over multiple matches. Note that this will make the RegExp
331 // disobey the normal API.
332 'g' + (re.multiLine ? 'm' : '') + (re.ignoreCase ? 'i' : ''));
333 340
334 Match next() { 341 Match next() {
335 if (!hasNext()) { 342 if (!hasNext()) {
336 throw const NoMoreElementsException(); 343 throw const NoMoreElementsException();
337 } 344 }
338 345
339 // _next is set by #hasNext 346 // _next is set by #hasNext
340 var next = _next; 347 var next = _next;
341 _next = null; 348 _next = null;
342 return next; 349 return next;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 } else if (isNaN()) { 434 } else if (isNaN()) {
428 if (other.isNaN()) { 435 if (other.isNaN()) {
429 return 0; 436 return 0;
430 } 437 }
431 return 1; 438 return 1;
432 } else { 439 } else {
433 return -1; 440 return -1;
434 } 441 }
435 } 442 }
436 } 443 }
OLDNEW
« no previous file with comments | « no previous file | frog/lib/string_implementation.dart » ('j') | frog/lib/string_implementation.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698