OLD | NEW |
| (Empty) |
1 library java.engine; | |
2 | |
3 import 'interner.dart'; | |
4 import 'java_core.dart'; | |
5 | |
6 /** | |
7 * A predicate is a one-argument function that returns a boolean value. | |
8 */ | |
9 typedef bool Predicate<E>(E argument); | |
10 | |
11 /** | |
12 * Instances of the class `AnalysisException` represent an exception that | |
13 * occurred during the analysis of one or more sources. | |
14 */ | |
15 class AnalysisException implements Exception { | |
16 /** | |
17 * The message that explains why the exception occurred. | |
18 */ | |
19 final String message; | |
20 | |
21 /** | |
22 * The exception that caused this exception, or `null` if this exception was | |
23 * not caused by another exception. | |
24 */ | |
25 final CaughtException cause; | |
26 | |
27 /** | |
28 * Initialize a newly created exception to have the given [message] and | |
29 * [cause]. | |
30 */ | |
31 AnalysisException([this.message = 'Exception', this.cause = null]); | |
32 | |
33 String toString() { | |
34 StringBuffer buffer = new StringBuffer(); | |
35 buffer.write("AnalysisException: "); | |
36 buffer.writeln(message); | |
37 if (cause != null) { | |
38 buffer.write('Caused by '); | |
39 cause._writeOn(buffer); | |
40 } | |
41 return buffer.toString(); | |
42 } | |
43 } | |
44 | |
45 /** | |
46 * Instances of the class `CaughtException` represent an exception that was | |
47 * caught and has an associated stack trace. | |
48 */ | |
49 class CaughtException implements Exception { | |
50 /** | |
51 * The exception that was caught. | |
52 */ | |
53 final Object exception; | |
54 | |
55 /** | |
56 * The stack trace associated with the exception. | |
57 */ | |
58 StackTrace stackTrace; | |
59 | |
60 /** | |
61 * Initialize a newly created caught exception to have the given [exception] | |
62 * and [stackTrace]. | |
63 */ | |
64 CaughtException(this.exception, stackTrace) { | |
65 if (stackTrace == null) { | |
66 try { | |
67 throw this; | |
68 } catch (_, st) { | |
69 stackTrace = st; | |
70 } | |
71 } | |
72 this.stackTrace = stackTrace; | |
73 } | |
74 | |
75 @override | |
76 String toString() { | |
77 StringBuffer buffer = new StringBuffer(); | |
78 _writeOn(buffer); | |
79 return buffer.toString(); | |
80 } | |
81 | |
82 /** | |
83 * Write a textual representation of the caught exception and its associated | |
84 * stack trace. | |
85 */ | |
86 void _writeOn(StringBuffer buffer) { | |
87 if (exception is AnalysisException) { | |
88 AnalysisException analysisException = exception; | |
89 buffer.writeln(analysisException.message); | |
90 if (stackTrace != null) { | |
91 buffer.writeln(stackTrace.toString()); | |
92 } | |
93 CaughtException cause = analysisException.cause; | |
94 if (cause != null) { | |
95 buffer.write('Caused by '); | |
96 cause._writeOn(buffer); | |
97 } | |
98 } else { | |
99 buffer.writeln(exception.toString()); | |
100 buffer.writeln(stackTrace.toString()); | |
101 } | |
102 } | |
103 } | |
104 | |
105 class FileNameUtilities { | |
106 static String getExtension(String fileName) { | |
107 if (fileName == null) { | |
108 return ""; | |
109 } | |
110 int index = fileName.lastIndexOf('.'); | |
111 if (index >= 0) { | |
112 return fileName.substring(index + 1); | |
113 } | |
114 return ""; | |
115 } | |
116 } | |
117 | |
118 class StringUtilities { | |
119 static const String EMPTY = ''; | |
120 static const List<String> EMPTY_ARRAY = const <String>[]; | |
121 | |
122 static Interner INTERNER = new NullInterner(); | |
123 | |
124 static endsWith3(String str, int c1, int c2, int c3) { | |
125 var length = str.length; | |
126 return length >= 3 && | |
127 str.codeUnitAt(length - 3) == c1 && | |
128 str.codeUnitAt(length - 2) == c2 && | |
129 str.codeUnitAt(length - 1) == c3; | |
130 } | |
131 static endsWithChar(String str, int c) { | |
132 int length = str.length; | |
133 return length > 0 && str.codeUnitAt(length - 1) == c; | |
134 } | |
135 static int indexOf1(String str, int start, int c) { | |
136 int index = start; | |
137 int last = str.length; | |
138 while (index < last) { | |
139 if (str.codeUnitAt(index) == c) { | |
140 return index; | |
141 } | |
142 index++; | |
143 } | |
144 return -1; | |
145 } | |
146 static int indexOf2(String str, int start, int c1, int c2) { | |
147 int index = start; | |
148 int last = str.length - 1; | |
149 while (index < last) { | |
150 if (str.codeUnitAt(index) == c1 && str.codeUnitAt(index + 1) == c2) { | |
151 return index; | |
152 } | |
153 index++; | |
154 } | |
155 return -1; | |
156 } | |
157 static int indexOf4( | |
158 String string, int start, int c1, int c2, int c3, int c4) { | |
159 int index = start; | |
160 int last = string.length - 3; | |
161 while (index < last) { | |
162 if (string.codeUnitAt(index) == c1 && | |
163 string.codeUnitAt(index + 1) == c2 && | |
164 string.codeUnitAt(index + 2) == c3 && | |
165 string.codeUnitAt(index + 3) == c4) { | |
166 return index; | |
167 } | |
168 index++; | |
169 } | |
170 return -1; | |
171 } | |
172 static int indexOf5( | |
173 String str, int start, int c1, int c2, int c3, int c4, int c5) { | |
174 int index = start; | |
175 int last = str.length - 4; | |
176 while (index < last) { | |
177 if (str.codeUnitAt(index) == c1 && | |
178 str.codeUnitAt(index + 1) == c2 && | |
179 str.codeUnitAt(index + 2) == c3 && | |
180 str.codeUnitAt(index + 3) == c4 && | |
181 str.codeUnitAt(index + 4) == c5) { | |
182 return index; | |
183 } | |
184 index++; | |
185 } | |
186 return -1; | |
187 } | |
188 | |
189 /** | |
190 * Return the index of the first not letter/digit character in the [string] | |
191 * that is at or after the [startIndex]. Return the length of the [string] if | |
192 * all characters to the end are letters/digits. | |
193 */ | |
194 static int indexOfFirstNotLetterDigit(String string, int startIndex) { | |
195 int index = startIndex; | |
196 int last = string.length; | |
197 while (index < last) { | |
198 int c = string.codeUnitAt(index); | |
199 if (!Character.isLetterOrDigit(c)) { | |
200 return index; | |
201 } | |
202 index++; | |
203 } | |
204 return last; | |
205 } | |
206 static String intern(String string) => INTERNER.intern(string); | |
207 static bool isEmpty(String s) { | |
208 return s == null || s.isEmpty; | |
209 } | |
210 static bool isTagName(String s) { | |
211 if (s == null || s.length == 0) { | |
212 return false; | |
213 } | |
214 int sz = s.length; | |
215 for (int i = 0; i < sz; i++) { | |
216 int c = s.codeUnitAt(i); | |
217 if (!Character.isLetter(c)) { | |
218 if (i == 0) { | |
219 return false; | |
220 } | |
221 if (!Character.isDigit(c) && c != 0x2D) { | |
222 return false; | |
223 } | |
224 } | |
225 } | |
226 return true; | |
227 } | |
228 /** | |
229 * Produce a string containing all of the names in the given array, surrounded
by single quotes, | |
230 * and separated by commas. The list must contain at least two elements. | |
231 * | |
232 * @param names the names to be printed | |
233 * @return the result of printing the names | |
234 */ | |
235 static String printListOfQuotedNames(List<String> names) { | |
236 if (names == null) { | |
237 throw new IllegalArgumentException("The list must not be null"); | |
238 } | |
239 int count = names.length; | |
240 if (count < 2) { | |
241 throw new IllegalArgumentException( | |
242 "The list must contain at least two names"); | |
243 } | |
244 StringBuffer buffer = new StringBuffer(); | |
245 buffer.write("'"); | |
246 buffer.write(names[0]); | |
247 buffer.write("'"); | |
248 for (int i = 1; i < count - 1; i++) { | |
249 buffer.write(", '"); | |
250 buffer.write(names[i]); | |
251 buffer.write("'"); | |
252 } | |
253 buffer.write(" and '"); | |
254 buffer.write(names[count - 1]); | |
255 buffer.write("'"); | |
256 return buffer.toString(); | |
257 } | |
258 static startsWith2(String str, int start, int c1, int c2) { | |
259 return str.length - start >= 2 && | |
260 str.codeUnitAt(start) == c1 && | |
261 str.codeUnitAt(start + 1) == c2; | |
262 } | |
263 static startsWith3(String str, int start, int c1, int c2, int c3) { | |
264 return str.length - start >= 3 && | |
265 str.codeUnitAt(start) == c1 && | |
266 str.codeUnitAt(start + 1) == c2 && | |
267 str.codeUnitAt(start + 2) == c3; | |
268 } | |
269 static startsWith4(String str, int start, int c1, int c2, int c3, int c4) { | |
270 return str.length - start >= 4 && | |
271 str.codeUnitAt(start) == c1 && | |
272 str.codeUnitAt(start + 1) == c2 && | |
273 str.codeUnitAt(start + 2) == c3 && | |
274 str.codeUnitAt(start + 3) == c4; | |
275 } | |
276 static startsWith5( | |
277 String str, int start, int c1, int c2, int c3, int c4, int c5) { | |
278 return str.length - start >= 5 && | |
279 str.codeUnitAt(start) == c1 && | |
280 str.codeUnitAt(start + 1) == c2 && | |
281 str.codeUnitAt(start + 2) == c3 && | |
282 str.codeUnitAt(start + 3) == c4 && | |
283 str.codeUnitAt(start + 4) == c5; | |
284 } | |
285 static startsWith6( | |
286 String str, int start, int c1, int c2, int c3, int c4, int c5, int c6) { | |
287 return str.length - start >= 6 && | |
288 str.codeUnitAt(start) == c1 && | |
289 str.codeUnitAt(start + 1) == c2 && | |
290 str.codeUnitAt(start + 2) == c3 && | |
291 str.codeUnitAt(start + 3) == c4 && | |
292 str.codeUnitAt(start + 4) == c5 && | |
293 str.codeUnitAt(start + 5) == c6; | |
294 } | |
295 static startsWithChar(String str, int c) { | |
296 return str.length != 0 && str.codeUnitAt(0) == c; | |
297 } | |
298 | |
299 static String substringBefore(String str, String separator) { | |
300 if (str == null || str.isEmpty) { | |
301 return str; | |
302 } | |
303 if (separator == null) { | |
304 return str; | |
305 } | |
306 int pos = str.indexOf(separator); | |
307 if (pos < 0) { | |
308 return str; | |
309 } | |
310 return str.substring(0, pos); | |
311 } | |
312 | |
313 static String substringBeforeChar(String str, int c) { | |
314 if (isEmpty(str)) { | |
315 return str; | |
316 } | |
317 int pos = indexOf1(str, 0, c); | |
318 if (pos < 0) { | |
319 return str; | |
320 } | |
321 return str.substring(0, pos); | |
322 } | |
323 } | |
324 | |
325 class UUID { | |
326 static int __nextId = 0; | |
327 final String id; | |
328 UUID(this.id); | |
329 String toString() => id; | |
330 static UUID randomUUID() => new UUID((__nextId).toString()); | |
331 } | |
OLD | NEW |