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

Unified Diff: tests/compiler/dart2js/sourcemaps/lax_json.dart

Issue 2431223006: Add stacktrace_test (Closed)
Patch Set: Updated cf. comments. Created 4 years, 1 month 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: tests/compiler/dart2js/sourcemaps/lax_json.dart
diff --git a/tests/compiler/dart2js/sourcemaps/lax_json.dart b/tests/compiler/dart2js/sourcemaps/lax_json.dart
new file mode 100644
index 0000000000000000000000000000000000000000..fb799732c7fcb497089bcb2d3d15c81b2eaeb5fb
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/lax_json.dart
@@ -0,0 +1,296 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Decode a lax JSON encoded text, that is, JSON with Dart-like comments and
+/// trailing commas.
+///
+/// This is used together with `load.dart` and `save.dart` to allow for an easy
+/// editing of a human-readable source-map file.
+
+library lazon;
+
+decode(String text) {
+ return new _Decoder(text)._decode();
+}
+
+class _Decoder {
+ static final int LF = '\n'.codeUnits.single;
+ static final int CR = '\r'.codeUnits.single;
+ static final int BACKSPACE = '\b'.codeUnits.single;
+ static final int FORMFEED = '\f'.codeUnits.single;
+ static final int TAB = '\t'.codeUnits.single;
+ static final int SPACE = ' '.codeUnits.single;
+ static final int SLASH = '/'.codeUnits.single;
+ static final int STAR = '*'.codeUnits.single;
+ static final int QUOTE = '"'.codeUnits.single;
+ static final int BACKSLASH = '\\'.codeUnits.single;
+ static final int COMMA = ','.codeUnits.single;
+ static final int COLON = ':'.codeUnits.single;
+ static final int LEFT_BRACE = '{'.codeUnits.single;
+ static final int RIGHT_BRACE = '}'.codeUnits.single;
+ static final int LEFT_BRACKET = '['.codeUnits.single;
+ static final int RIGHT_BRACKET = ']'.codeUnits.single;
+ static final int T = 't'.codeUnits.single;
+ static final List<int> TRUE = 'true'.codeUnits;
+ static final int F = 'f'.codeUnits.single;
+ static final List<int> FALSE = 'false'.codeUnits;
+ static final int N = 'n'.codeUnits.single;
+ static final List<int> NULL = 'null'.codeUnits;
+ static final int _0 = '0'.codeUnits.single;
+ static final int _9 = '9'.codeUnits.single;
+ static final int B = 'b'.codeUnits.single;
+ static final int R = 'r'.codeUnits.single;
+ static final int U = 'u'.codeUnits.single;
+
+ final List<int> codeUnits;
+ final int length;
+ int position = 0;
+
+ _Decoder(String text)
+ : codeUnits = text.codeUnits,
+ length = text.length;
+
+ _decode() {
+ var result = _decodeValue();
+ _trimWhitespace();
+ if (position != codeUnits.length) {
+ throw new ArgumentError("Unexpected trailing text: "
+ "'${new String.fromCharCodes(codeUnits, position)}'.");
+ }
+ return result;
+ }
+
+ _decodeValue() {
+ var result;
+ _trimWhitespace();
+ if (position < codeUnits.length) {
+ int codeUnit = codeUnits[position];
+ if (codeUnit == QUOTE) {
+ result = _decodeString();
+ } else if (codeUnit == LEFT_BRACE) {
+ result = _decodeMap();
+ } else if (codeUnit == LEFT_BRACKET) {
+ result = _decodeList();
+ } else if (codeUnit == T) {
+ result = _decodeTrue();
+ } else if (codeUnit == F) {
+ result = _decodeFalse();
+ } else if (codeUnit == N) {
+ result = _decodeNull();
+ } else {
+ result = _decodeNumber();
+ }
+ } else {
+ throw new ArgumentError("No value found in text: "
+ "'${new String.fromCharCodes(codeUnits, 0)}'.");
+ }
+ return result;
+ }
+
+ void _trimWhitespace() {
+ OUTER:
+ while (position < codeUnits.length) {
+ int codeUnit = codeUnits[position];
+ if (codeUnit == SLASH) {
+ if (position + 1 < codeUnits.length) {
+ int nextCodeUnit = codeUnits[position + 1];
+ if (nextCodeUnit == SLASH) {
+ position += 2;
+ while (position < codeUnits.length) {
+ codeUnit = codeUnits[position];
+ if (codeUnit == LF || codeUnit == CR) {
+ continue OUTER;
+ }
+ position++;
+ }
+ } else if (nextCodeUnit == STAR) {
+ position += 2;
+ while (position < codeUnits.length) {
+ codeUnit = codeUnits[position];
+ if (codeUnit == STAR &&
+ position + 1 < codeUnits.length &&
+ codeUnits[position + 1] == SLASH) {
+ position += 2;
+ continue OUTER;
+ }
+ position++;
+ }
+ }
+ }
+ break;
+ } else if (codeUnit == LF ||
+ codeUnit == CR ||
+ codeUnit == TAB ||
+ codeUnit == SPACE) {
+ position++;
+ } else {
+ break;
+ }
+ }
+ }
+
+ String _decodeString() {
+ int codeUnit = codeUnits[position];
+ if (codeUnit != QUOTE) {
+ _fail();
+ }
+ position++;
+ List<int> charCodes = <int>[];
+ while (position < length) {
+ codeUnit = codeUnits[position];
+ if (codeUnit == QUOTE) {
+ break;
+ } else if (codeUnit == BACKSLASH) {
+ if (position + 1 >= length) {
+ _fail();
+ }
+ codeUnit = codeUnits[++position];
+ if (codeUnit == B) {
+ codeUnit = BACKSPACE;
+ } else if (codeUnit == F) {
+ codeUnit = FORMFEED;
+ } else if (codeUnit == N) {
+ codeUnit = LF;
+ } else if (codeUnit == R) {
+ codeUnit = CR;
+ } else if (codeUnit == T) {
+ codeUnit = TAB;
+ } else if (codeUnit == U) {
+ throw new UnsupportedError('unicode escapes');
+ } else if (codeUnit == QUOTE ||
+ codeUnit == SLASH ||
+ codeUnit == BACKSLASH) {
+ // Ok.
+ } else {
+ _fail();
+ }
+ }
+ charCodes.add(codeUnit);
+ position++;
+ }
+ if (codeUnit != QUOTE) {
+ _fail();
+ }
+ position++;
+ return new String.fromCharCodes(charCodes);
+ }
+
+ Map _decodeMap() {
+ int codeUnit = codeUnits[position];
+ if (codeUnit != LEFT_BRACE) {
+ _fail();
+ }
+ position++;
+ _trimWhitespace();
+ Map result = {};
+ while (position < length) {
+ codeUnit = codeUnits[position];
+ if (codeUnit == RIGHT_BRACE) {
+ break;
+ }
+ String key = _decodeString();
+ _trimWhitespace();
+ if (position < length) {
+ codeUnit = codeUnits[position];
+ if (codeUnit == COLON) {
+ position++;
+ _trimWhitespace();
+ } else {
+ _fail();
+ }
+ } else {
+ _fail();
+ }
+ var value = _decodeValue();
+ result[key] = value;
+ _trimWhitespace();
+ if (position < length) {
+ codeUnit = codeUnits[position];
+ if (codeUnit == COMMA) {
+ position++;
+ _trimWhitespace();
+ continue;
+ } else {
+ break;
+ }
+ }
+ }
+
+ if (codeUnit != RIGHT_BRACE) {
+ _fail();
+ }
+ position++;
+ return result;
+ }
+
+ List _decodeList() {
+ int codeUnit = codeUnits[position];
+ if (codeUnit != LEFT_BRACKET) {
+ _fail();
+ }
+ position++;
+ _trimWhitespace();
+ List result = [];
+ while (position < length) {
+ codeUnit = codeUnits[position];
+ if (codeUnit == RIGHT_BRACKET) {
+ break;
+ }
+ result.add(_decodeValue());
+ _trimWhitespace();
+ if (position < length) {
+ codeUnit = codeUnits[position];
+ if (codeUnit == COMMA) {
+ position++;
+ _trimWhitespace();
+ continue;
+ } else {
+ break;
+ }
+ }
+ }
+
+ if (codeUnit != RIGHT_BRACKET) {
+ _fail();
+ }
+ position++;
+ return result;
+ }
+
+ bool _decodeTrue() {
+ match(TRUE);
+ return true;
+ }
+
+ bool _decodeFalse() {
+ match(FALSE);
+ return false;
+ }
+
+ Null _decodeNull() {
+ match(NULL);
+ return null;
+ }
+
+ void match(List<int> codes) {
+ if (position + codes.length > length) {
+ _fail();
+ }
+ for (int i = 0; i < codes.length; i++) {
+ if (codes[i] != codeUnits[position + i]) {
+ _fail();
+ }
+ }
+ position += codes.length;
+ }
+
+ num _decodeNumber() {
+ throw new UnsupportedError('_decodeNumber');
+ }
+
+ void _fail() {
+ throw new ArgumentError("Unexpected value: "
+ "'${new String.fromCharCodes(codeUnits, position)}'.");
+ }
+}
« no previous file with comments | « tests/compiler/dart2js/sourcemaps/diff_view.dart ('k') | tests/compiler/dart2js/sourcemaps/lax_json_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698