OLD | NEW |
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 // TODO(jimhug): This should be an interface to work better with tools. | 5 // TODO(jimhug): This should be an interface to work better with tools. |
6 /** | 6 /** |
7 * Represents a file of source code. | 7 * Represents a file of source code. |
8 */ | 8 */ |
9 class SourceFile implements Comparable { | 9 class SourceFile implements Comparable { |
10 // TODO(terry): This filename for in memory buffer. May need to rework if | 10 // TODO(terry): This filename for in memory buffer. May need to rework if |
(...skipping 12 matching lines...) Expand all Loading... |
23 */ | 23 */ |
24 // TODO(jmesserly): I don't like having properties that are only valid | 24 // TODO(jmesserly): I don't like having properties that are only valid |
25 // sometimes. An alternative would be to store it in a Map that's used by | 25 // sometimes. An alternative would be to store it in a Map that's used by |
26 // WorldGenerator while it's emitting code. This seems simpler. | 26 // WorldGenerator while it's emitting code. This seems simpler. |
27 int orderInLibrary; | 27 int orderInLibrary; |
28 | 28 |
29 List<int> _lineStarts; | 29 List<int> _lineStarts; |
30 | 30 |
31 SourceFile(this.filename, this._text); | 31 SourceFile(this.filename, this._text); |
32 | 32 |
33 String get text() => _text; | 33 String get text => _text; |
34 | 34 |
35 set text(String newText) { | 35 set text(String newText) { |
36 if (newText != _text) { | 36 if (newText != _text) { |
37 _text = newText; | 37 _text = newText; |
38 _lineStarts = null; | 38 _lineStarts = null; |
39 orderInLibrary = null; | 39 orderInLibrary = null; |
40 } | 40 } |
41 } | 41 } |
42 | 42 |
43 List<int> get lineStarts() { | 43 List<int> get lineStarts { |
44 if (_lineStarts == null) { | 44 if (_lineStarts == null) { |
45 var starts = [0]; | 45 var starts = [0]; |
46 var index = 0; | 46 var index = 0; |
47 while (index < text.length) { | 47 while (index < text.length) { |
48 index = text.indexOf('\n', index) + 1; | 48 index = text.indexOf('\n', index) + 1; |
49 if (index <= 0) break; | 49 if (index <= 0) break; |
50 starts.add(index); | 50 starts.add(index); |
51 } | 51 } |
52 starts.add(text.length + 1); | 52 starts.add(text.length + 1); |
53 _lineStarts = starts; | 53 _lineStarts = starts; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 | 138 |
139 /** The character position of the start of this span. */ | 139 /** The character position of the start of this span. */ |
140 final int start; | 140 final int start; |
141 | 141 |
142 /** The character position of the end of this span. */ | 142 /** The character position of the end of this span. */ |
143 final int end; | 143 final int end; |
144 | 144 |
145 SourceSpan(this.file, this.start, this.end); | 145 SourceSpan(this.file, this.start, this.end); |
146 | 146 |
147 /** Returns the source text corresponding to this [Span]. */ | 147 /** Returns the source text corresponding to this [Span]. */ |
148 String get text() { | 148 String get text { |
149 return file.text.substring(start, end); | 149 return file.text.substring(start, end); |
150 } | 150 } |
151 | 151 |
152 toMessageString(String message) { | 152 toMessageString(String message) { |
153 return file.getLocationMessage(message, start, end: end, includeText: true); | 153 return file.getLocationMessage(message, start, end: end, includeText: true); |
154 } | 154 } |
155 | 155 |
156 int get line() { | 156 int get line { |
157 return file.getLine(start); | 157 return file.getLine(start); |
158 } | 158 } |
159 | 159 |
160 int get column() { | 160 int get column { |
161 return file.getColumn(line, start); | 161 return file.getColumn(line, start); |
162 } | 162 } |
163 | 163 |
164 int get endLine() { | 164 int get endLine { |
165 return file.getLine(end); | 165 return file.getLine(end); |
166 } | 166 } |
167 | 167 |
168 int get endColumn() { | 168 int get endColumn { |
169 return file.getColumn(endLine, end); | 169 return file.getColumn(endLine, end); |
170 } | 170 } |
171 | 171 |
172 String get locationText() { | 172 String get locationText { |
173 var line = file.getLine(start); | 173 var line = file.getLine(start); |
174 var column = file.getColumn(line, start); | 174 var column = file.getColumn(line, start); |
175 return '${file.filename}:${line + 1}:${column + 1}'; | 175 return '${file.filename}:${line + 1}:${column + 1}'; |
176 } | 176 } |
177 | 177 |
178 /** Compares two source spans by file and position. Handles nulls. */ | 178 /** Compares two source spans by file and position. Handles nulls. */ |
179 int compareTo(SourceSpan other) { | 179 int compareTo(SourceSpan other) { |
180 if (file == other.file) { | 180 if (file == other.file) { |
181 int d = start - other.start; | 181 int d = start - other.start; |
182 return d == 0 ? (end - other.end) : d; | 182 return d == 0 ? (end - other.end) : d; |
183 } | 183 } |
184 return file.compareTo(other.file); | 184 return file.compareTo(other.file); |
185 } | 185 } |
186 } | 186 } |
OLD | NEW |