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

Side by Side Diff: pkg/string_scanner/lib/src/line_scanner.dart

Issue 299973002: Add LineScanner and SpanScanner classes to string_scanner. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: code review Created 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « pkg/string_scanner/lib/src/exception.dart ('k') | pkg/string_scanner/lib/src/span_scanner.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
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.
4
5 library string_scanner.line_scanner;
6
7 import 'string_scanner.dart';
8
9 /// A subclass of [StringScanner] that tracks line and column information.
10 class LineScanner extends StringScanner {
11 /// The scanner's current (zero-based) line number.
12 int get line => _line;
13 int _line = 0;
14
15 /// The scanner's current (zero-based) column number.
16 int get column => _column;
17 int _column = 0;
18
19 /// The scanner's state, including line and column information.
20 ///
21 /// This can be used to efficiently save and restore the state of the scanner
22 /// when backtracking. A given [LineScannerState] is only valid for the
23 /// [LineScanner] that created it.
24 LineScannerState get state =>
25 new LineScannerState._(this, position, line, column);
26
27 set state(LineScannerState state) {
28 if (!identical(state._scanner, this)) {
29 throw new ArgumentError("The given LineScannerState was not returned by "
30 "this LineScanner.");
31 }
32
33 super.position = state.position;
34 _line = state.line;
35 _column = state.column;
36 }
37
38 set position(int newPosition) {
39 var oldPosition = position;
40 super.position = newPosition;
41
42 if (newPosition > oldPosition) {
43 var newlines = "\n".allMatches(string.substring(oldPosition, newPosition))
44 .toList();
45 _line += newlines.length;
46 if (newlines.isEmpty) {
47 _column += newPosition - oldPosition;
48 } else {
49 _column = newPosition - newlines.last.end;
50 }
51 } else {
52 var newlines = "\n".allMatches(string.substring(newPosition, oldPosition))
53 .toList();
54 _line -= newlines.length;
55 if (newlines.isEmpty) {
56 _column -= oldPosition - newPosition;
57 } else {
58 _column = newPosition - string.lastIndexOf("\n", newPosition) - 1;
59 }
60 }
61 }
62
63 LineScanner(String string, {sourceUrl, int position})
64 : super(string, sourceUrl: sourceUrl, position: position);
65
66 int readChar() {
67 var char = super.readChar();
68 if (char == 0xA) {
69 _line += 1;
70 _column = 0;
71 } else {
72 _column += 1;
73 }
74 return char;
75 }
76
77 bool scan(Pattern pattern) {
78 var oldPosition = position;
79 if (!super.scan(pattern)) return false;
80
81 var newlines = "\n".allMatches(lastMatch[0]).toList();
82 _line += newlines.length;
83 if (newlines.isEmpty) {
84 _column += lastMatch[0].length;
85 } else {
86 _column = lastMatch[0].length - newlines.last.end;
87 }
88
89 return true;
90 }
91 }
92
93 /// A class representing the state of a [LineScanner].
94 class LineScannerState {
95 /// The [LineScanner] that created this.
96 final LineScanner _scanner;
97
98 /// The position of the scanner in this state.
99 final int position;
100
101 /// The zero-based line number of the scanner in this state.
102 final int line;
103
104 /// The zero-based column number of the scanner in this state.
105 final int column;
106
107 LineScannerState._(this._scanner, this.position, this.line, this.column);
108 }
OLDNEW
« no previous file with comments | « pkg/string_scanner/lib/src/exception.dart ('k') | pkg/string_scanner/lib/src/span_scanner.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698