From b7ed4f5d1283722791ea9b30e80a5c39cdb78f7a Mon Sep 17 00:00:00 2001 From: Mathias Bynens Date: Wed, 22 Jun 2016 14:35:19 +0200 Subject: [PATCH 1/7] Update to Unicode v9 --- bin/generate-identifier-regex.js | 43 +++++++++++++++++++------------- package.json | 2 +- src/util/identifier.js | 29 +++++---------------- 3 files changed, 33 insertions(+), 41 deletions(-) diff --git a/bin/generate-identifier-regex.js b/bin/generate-identifier-regex.js index e9f3551032..76cc7f3040 100644 --- a/bin/generate-identifier-regex.js +++ b/bin/generate-identifier-regex.js @@ -1,14 +1,20 @@ -// Which Unicode version should be used? -var version = '8.0.0'; +"use strict"; -var start = require('unicode-' + version + '/properties/ID_Start/code-points') - .filter(function(ch) { return ch > 127; }); -var last = -1; -var cont = [0x200c, 0x200d].concat(require('unicode-' + version + '/properties/ID_Continue/code-points') - .filter(function(ch) { return ch > 127 && search(start, ch, last + 1) == -1; })); +// Which Unicode version should be used? +const version = "9.0.0"; + +const start = require("unicode-" + version + "/Binary_Property/ID_Start/code-points.js") + .filter(function(ch) { return ch > 0x7f; }); +let last = -1; +const cont = [0x200c, 0x200d].concat( + require("unicode-" + version + "/Binary_Property/ID_Continue/code-points.js") + .filter(function(ch) { + return ch > 0x7f && search(start, ch, last + 1) == -1; + }) + ); function search(arr, ch, starting) { - for (var i = starting; arr[i] <= ch && i < arr.length; last = i++) + for (let i = starting; arr[i] <= ch && i < arr.length; last = i++) if (arr[i] === ch) return i; return -1; @@ -20,15 +26,17 @@ function pad(str, width) { } function esc(code) { - var hex = code.toString(16); + const hex = code.toString(16); if (hex.length <= 2) return "\\x" + pad(hex, 2); else return "\\u" + pad(hex, 4); } function generate(chars) { - var astral = [], re = ""; - for (var i = 0, at = 0x10000; i < chars.length; i++) { - var from = chars[i], to = from; + const astral = []; + let re = ""; + for (let i = 0, at = 0x10000; i < chars.length; i++) { + const from = chars[i]; + let to = from; while (i < chars.length - 1 && chars[i + 1] == to + 1) { i++; to++; @@ -45,9 +53,10 @@ function generate(chars) { return {nonASCII: re, astral: astral}; } -var startData = generate(start), contData = generate(cont); +const startData = generate(start); +const contData = generate(cont); -console.log("let nonASCIIidentifierStartChars = \"" + startData.nonASCII + "\""); -console.log("let nonASCIIidentifierChars = \"" + contData.nonASCII + "\""); -console.log("const astralIdentifierStartCodes = " + JSON.stringify(startData.astral)); -console.log("const astralIdentifierCodes = " + JSON.stringify(contData.astral)); +console.log("let nonASCIIidentifierStartChars = \"" + startData.nonASCII + "\";"); +console.log("let nonASCIIidentifierChars = \"" + contData.nonASCII + "\";"); +console.log("const astralIdentifierStartCodes = " + JSON.stringify(startData.astral) + ";"); +console.log("const astralIdentifierCodes = " + JSON.stringify(contData.astral) + ";"); diff --git a/package.json b/package.json index 15b85586a7..90f2dae3d7 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "babel-preset-stage-0": "^6.5.0", "kcheck": "^2.0.1", "lodash": "^4.6.1", - "unicode-7.0.0": "~0.1.5" + "unicode-9.0.0": "~0.7.0" }, "bin": { "babylon": "./bin/babylon.js" diff --git a/src/util/identifier.js b/src/util/identifier.js index ff74f604d4..4c3bcf87f9 100644 --- a/src/util/identifier.js +++ b/src/util/identifier.js @@ -34,10 +34,10 @@ export const isKeyword = makePredicate("break case catch continue debugger defau // whitespace, identifier, and identifier-start categories. These // are only applied when a character is found to actually have a // code point above 128. -// Generated by `tools/generate-identifier-regex.js`. +// Generated by `bin/generate-identifier-regex.js`. -let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b2\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua7ad\ua7b0\ua7b1\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab5f\uab64\uab65\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; -let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19b0-\u19c0\u19c8\u19c9\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfc-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2d\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; +let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; +let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); @@ -48,26 +48,9 @@ nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; // >0xffff code points that are a valid part of identifiers. The // offset starts at 0x10000, and each pair of numbers represents an // offset to the next range, and then a size of the range. They were -// generated by tools/generate-identifier-regex.js -let astralIdentifierStartCodes = [ - 0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 17, 26, 6, 37, 11, 29, 3, 35, 5, - 7, 2, 4, 43, 157, 99, 39, 9, 51, 157, 310, 10, 21, 11, 7, 153, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, - 98, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 26, 45, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, - 17, 111, 72, 955, 52, 76, 44, 33, 24, 27, 35, 42, 34, 4, 0, 13, 47, 15, 3, 22, 0, 38, 17, 2, 24, 133, 46, 39, 7, - 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 32, 4, 287, 47, 21, 1, 2, 0, 185, 46, 82, 47, 21, 0, 60, 42, 502, 63, 32, 0, - 449, 56, 1288, 920, 104, 110, 2962, 1070, 13266, 568, 8, 30, 114, 29, 19, 47, 17, 3, 32, 20, 6, 18, 881, 68, 12, - 0, 67, 12, 16481, 1, 3071, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, - 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, - 24, 2, 30, 2, 24, 2, 7, 4149, 196, 1340, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, - 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, - 4, 2, 16, 4421, 42710, 42, 4148, 12, 221, 16355, 541 -]; -let astralIdentifierCodes = [ - 509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 1306, 2, 54, 14, 32, 9, 16, 3, 46, 10, - 54, 9, 7, 2, 37, 13, 2, 9, 52, 0, 13, 2, 49, 13, 16, 9, 83, 11, 168, 11, 6, 9, 8, 2, 57, 0, 2, 6, 3, 1, 3, 2, 10, - 0, 11, 1, 3, 6, 4, 4, 316, 19, 13, 9, 214, 6, 3, 8, 112, 16, 16, 9, 82, 12, 9, 9, 535, 9, 20855, 9, 135, 4, 60, 6, - 26, 9, 1016, 45, 17, 3, 19723, 1, 5319, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 4305, 6, 792618, 239 -]; +// generated by `bin/generate-identifier-regex.js`. +const astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,17,26,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,26,45,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,785,52,76,44,33,24,27,35,42,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,54,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,86,25,391,63,32,0,449,56,264,8,2,36,18,0,50,29,881,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,881,68,12,0,67,12,65,0,32,6124,20,754,9486,1,3071,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,4149,196,60,67,1213,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,10591,541]; +const astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,1306,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,52,0,13,2,49,13,10,2,4,9,83,11,7,0,161,11,6,9,7,3,57,0,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,87,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,423,9,838,7,2,7,17,9,57,21,2,13,19882,9,135,4,60,6,26,9,1016,45,17,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,2214,6,110,6,6,9,792487,239]; // This has a complexity linear to the value of the code. The // assumption is that looking up astral identifier characters is From be7d9689038ef3105aced1aedb6cd5bf95dd846c Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Wed, 22 Jun 2016 08:38:47 -0400 Subject: [PATCH 2/7] Move ast spec from babel/babel [skip ci] --- ast/flow.md | 0 ast/jsx.md | 0 ast/spec.md | 1167 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1167 insertions(+) create mode 100644 ast/flow.md create mode 100644 ast/jsx.md create mode 100644 ast/spec.md diff --git a/ast/flow.md b/ast/flow.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ast/jsx.md b/ast/jsx.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ast/spec.md b/ast/spec.md new file mode 100644 index 0000000000..d37c2265e9 --- /dev/null +++ b/ast/spec.md @@ -0,0 +1,1167 @@ +These are the core Babylon AST node types. + +- [Node objects](#node-objects) +- [Identifier](#identifier) +- [Literals](#literals) + - [RegexpLiteral](#regexpliteral) + - [NullLiteral](#nullliteral) + - [StringLiteral](#stringliteral) + - [BooleanLiteral](#booleanliteral) + - [NumericLiteral](#numericliteral) +- [Programs](#programs) +- [Functions](#functions) +- [Statements](#statements) + - [ExpressionStatement](#expressionstatement) + - [BlockStatement](#blockstatement) + - [EmptyStatement](#emptystatement) + - [DebuggerStatement](#debuggerstatement) + - [WithStatement](#withstatement) + - [Control flow](#control-flow) + - [ReturnStatement](#returnstatement) + - [LabeledStatement](#labeledstatement) + - [BreakStatement](#breakstatement) + - [ContinueStatement](#continuestatement) + - [Choice](#choice) + - [IfStatement](#ifstatement) + - [SwitchStatement](#switchstatement) + - [SwitchCase](#switchcase) + - [Exceptions](#exceptions) + - [ThrowStatement](#throwstatement) + - [TryStatement](#trystatement) + - [CatchClause](#catchclause) + - [Loops](#loops) + - [WhileStatement](#whilestatement) + - [DoWhileStatement](#dowhilestatement) + - [ForStatement](#forstatement) + - [ForInStatement](#forinstatement) + - [ForOfStatement](#forofstatement) +- [Declarations](#declarations) + - [FunctionDeclaration](#functiondeclaration) + - [VariableDeclaration](#variabledeclaration) + - [VariableDeclarator](#variabledeclarator) +- [Misc](#misc) + - [Decorator](#decorator) + - [Directive](#directive) + - [DirectiveLiteral](#directiveliteral) +- [Expressions](#expressions) + - [Super](#super) + - [ThisExpression](#thisexpression) + - [ArrowFunctionExpression](#arrowfunctionexpression) + - [YieldExpression](#yieldexpression) + - [AwaitExpression](#awaitexpression) + - [ArrayExpression](#arrayexpression) + - [ObjectExpression](#objectexpression) + - [ObjectMember](#objectmember) + - [ObjectProperty](#objectproperty) + - [ObjectMethod](#objectmethod) + - [RestProperty](#restproperty) + - [SpreadProperty](#spreadproperty) + - [FunctionExpression](#functionexpression) + - [Unary operations](#unary-operations) + - [UnaryExpression](#unaryexpression) + - [UnaryOperator](#unaryoperator) + - [UpdateExpression](#updateexpression) + - [UpdateOperator](#updateoperator) + - [Binary operations](#binary-operations) + - [BinaryExpression](#binaryexpression) + - [BinaryOperator](#binaryoperator) + - [AssignmentExpression](#assignmentexpression) + - [AssignmentOperator](#assignmentoperator) + - [LogicalExpression](#logicalexpression) + - [LogicalOperator](#logicaloperator) + - [SpreadElement](#spreadelement) + - [MemberExpression](#memberexpression) + - [BindExpression](#bindexpression) + - [ConditionalExpression](#conditionalexpression) + - [CallExpression](#callexpression) + - [NewExpression](#newexpression) + - [SequenceExpression](#sequenceexpression) +- [Template Literals](#template-literals) + - [TemplateLiteral](#templateliteral) + - [TaggedTemplateExpression](#taggedtemplateexpression) + - [TemplateElement](#templateelement) +- [Patterns](#patterns) + - [ObjectPattern](#objectpattern) + - [ArrayPattern](#arraypattern) + - [RestElement](#restelement) + - [AssignmentPattern](#assignmentpattern) +- [Classes](#classes) + - [ClassBody](#classbody) + - [ClassMethod](#classmethod) + - [ClassProperty](#classproperty) + - [ClassDeclaration](#classdeclaration) + - [ClassExpression](#classexpression) + - [MetaProperty](#metaproperty) +- [Modules](#modules) + - [ModuleDeclaration](#moduledeclaration) + - [ModuleSpecifier](#modulespecifier) + - [Imports](#imports) + - [ImportDeclaration](#importdeclaration) + - [ImportSpecifier](#importspecifier) + - [ImportDefaultSpecifier](#importdefaultspecifier) + - [ImportNamespaceSpecifier](#importnamespacespecifier) + - [Exports](#exports) + - [ExportNamedDeclaration](#exportnameddeclaration) + - [ExportSpecifier](#exportspecifier) + - [ExportDefaultDeclaration](#exportdefaultdeclaration) + - [ExportAllDeclaration](#exportalldeclaration) + +# Node objects + +AST nodes are represented as `Node` objects, which may have any prototype inheritance but which implement the following interface: + +```js +interface Node { + type: string; + loc: SourceLocation | null; +} +``` + +The `type` field is a string representing the AST variant type. Each subtype of `Node` is documented below with the specific string of its `type` field. You can use this field to determine which interface a node implements. + +The `loc` field represents the source location information of the node. If the node contains no information about the source location, the field is `null`; otherwise it is an object consisting of a start position (the position of the first character of the parsed source region) and an end position (the position of the first character after the parsed source region): + +```js +interface SourceLocation { + source: string | null; + start: Position; + end: Position; +} +``` + +Each `Position` object consists of a `line` number (1-indexed) and a `column` number (0-indexed): + +```js +interface Position { + line: number; // >= 1 + column: number; // >= 0 +} +``` + +# Identifier + +```js +interface Identifier <: Expression, Pattern { + type: "Identifier"; + name: string; +} +``` + +An identifier. Note that an identifier may be an expression or a destructuring pattern. + +# Literals + +```js +interface Literal <: Expression { } +``` + +A literal token. May or may not represent an expression. + +## RegExpLiteral + +```js +interface RegExpLiteral <: Literal { + type: "RegExpLiteral"; + pattern: string; + flags: string; +} +``` + +## NullLiteral + +```js +interface NullLiteral <: Literal { + type: "NullLiteral"; +} +``` + +## StringLiteral + +```js +interface StringLiteral <: Literal { + type: "StringLiteral"; + value: string; +} +``` + +## BooleanLiteral + +```js +interface BooleanLiteral <: Literal { + type: "BooleanLiteral"; + value: boolean; +} +``` + +## NumericLiteral + +```js +interface NumericLiteral <: Literal { + type: "NumericLiteral"; + value: number; +} +``` + +# Programs + +```js +interface Program <: Node { + type: "Program"; + sourceType: "script" | "module"; + body: [ Statement | ModuleDeclaration ]; + directives: [ Directive ]; +} +``` + +A complete program source tree. + +Parsers must specify `sourceType` as `"module"` if the source has been parsed as an ES6 module. Otherwise, `sourceType` must be `"script"`. + +# Functions + +```js +interface Function <: Node { + id: Identifier | null; + params: [ Pattern ]; + body: BlockStatement; + generator: boolean; + async: boolean; +} +``` + +A function [declaration](#functiondeclaration) or [expression](#functionexpression). + +# Statements + +```js +interface Statement <: Node { } +``` + +Any statement. + +## ExpressionStatement + +```js +interface ExpressionStatement <: Statement { + type: "ExpressionStatement"; + expression: Expression; +} +``` + +An expression statement, i.e., a statement consisting of a single expression. + +## BlockStatement + +```js +interface BlockStatement <: Statement { + type: "BlockStatement"; + body: [ Statement ]; + directives: [ Directive ]; +} +``` + +A block statement, i.e., a sequence of statements surrounded by braces. + +## EmptyStatement + +```js +interface EmptyStatement <: Statement { + type: "EmptyStatement"; +} +``` + +An empty statement, i.e., a solitary semicolon. + +## DebuggerStatement + +```js +interface DebuggerStatement <: Statement { + type: "DebuggerStatement"; +} +``` + +A `debugger` statement. + +## WithStatement + +```js +interface WithStatement <: Statement { + type: "WithStatement"; + object: Expression; + body: Statement; +} +``` + +A `with` statement. + +## Control flow + +### ReturnStatement + +```js +interface ReturnStatement <: Statement { + type: "ReturnStatement"; + argument: Expression | null; +} +``` + +A `return` statement. + +### LabeledStatement + +```js +interface LabeledStatement <: Statement { + type: "LabeledStatement"; + label: Identifier; + body: Statement; +} +``` + +A labeled statement, i.e., a statement prefixed by a `break`/`continue` label. + +### BreakStatement + +```js +interface BreakStatement <: Statement { + type: "BreakStatement"; + label: Identifier | null; +} +``` + +A `break` statement. + +### ContinueStatement + +```js +interface ContinueStatement <: Statement { + type: "ContinueStatement"; + label: Identifier | null; +} +``` + +A `continue` statement. + +## Choice + +### IfStatement + +```js +interface IfStatement <: Statement { + type: "IfStatement"; + test: Expression; + consequent: Statement; + alternate: Statement | null; +} +``` + +An `if` statement. + +### SwitchStatement + +```js +interface SwitchStatement <: Statement { + type: "SwitchStatement"; + discriminant: Expression; + cases: [ SwitchCase ]; +} +``` + +A `switch` statement. + +#### SwitchCase + +```js +interface SwitchCase <: Node { + type: "SwitchCase"; + test: Expression | null; + consequent: [ Statement ]; +} +``` + +A `case` (if `test` is an `Expression`) or `default` (if `test === null`) clause in the body of a `switch` statement. + +## Exceptions + +### ThrowStatement + +```js +interface ThrowStatement <: Statement { + type: "ThrowStatement"; + argument: Expression; +} +``` + +A `throw` statement. + +### TryStatement + +```js +interface TryStatement <: Statement { + type: "TryStatement"; + block: BlockStatement; + handler: CatchClause | null; + finalizer: BlockStatement | null; +} +``` + +A `try` statement. If `handler` is `null` then `finalizer` must be a `BlockStatement`. + +#### CatchClause + +```js +interface CatchClause <: Node { + type: "CatchClause"; + param: Pattern; + body: BlockStatement; +} +``` + +A `catch` clause following a `try` block. + +## Loops + +### WhileStatement + +```js +interface WhileStatement <: Statement { + type: "WhileStatement"; + test: Expression; + body: Statement; +} +``` + +A `while` statement. + +### DoWhileStatement + +```js +interface DoWhileStatement <: Statement { + type: "DoWhileStatement"; + body: Statement; + test: Expression; +} +``` + +A `do`/`while` statement. + +### ForStatement + +```js +interface ForStatement <: Statement { + type: "ForStatement"; + init: VariableDeclaration | Expression | null; + test: Expression | null; + update: Expression | null; + body: Statement; +} +``` + +A `for` statement. + +### ForInStatement + +```js +interface ForInStatement <: Statement { + type: "ForInStatement"; + left: VariableDeclaration | Expression; + right: Expression; + body: Statement; +} +``` + +A `for`/`in` statement. + +## ForOfStatement + +```js +interface ForOfStatement <: ForInStatement { + type: "ForOfStatement"; +} +``` + +# Declarations + +```js +interface Declaration <: Statement { } +``` + +Any declaration node. Note that declarations are considered statements; this is because declarations can appear in any statement context. + +## FunctionDeclaration + +```js +interface FunctionDeclaration <: Function, Declaration { + type: "FunctionDeclaration"; + id: Identifier; +} +``` + +A function declaration. Note that unlike in the parent interface `Function`, the `id` cannot be `null`. + +## VariableDeclaration + +```js +interface VariableDeclaration <: Declaration { + type: "VariableDeclaration"; + declarations: [ VariableDeclarator ]; + kind: "var" | "let" | "const"; +} +``` + +A variable declaration. + +### VariableDeclarator + +```js +interface VariableDeclarator <: Node { + type: "VariableDeclarator"; + id: Pattern; + init: Expression | null; +} +``` + +A variable declarator. + +# Misc + +## Decorator + +```js +interface Decorator <: Node { + type: "Decorator"; + expression: Expression; +} +``` + +## Directive + +```js +interface Directive <: Node { + type: "Directive"; + value: DirectiveLiteral; +} +``` + +## DirectiveLiteral + +```js +interface DirectiveLiteral <: StringLiteral { + type: "DirectiveLiteral"; +} +``` + +# Expressions + +```js +interface Expression <: Node { } +``` + +Any expression node. Since the left-hand side of an assignment may be any expression in general, an expression can also be a pattern. + +## Super + +```js +interface Super <: Node { + type: "Super"; +} +``` + +A `super` pseudo-expression. + +## ThisExpression + +```js +interface ThisExpression <: Expression { + type: "ThisExpression"; +} +``` + +A `this` expression. + +## ArrowFunctionExpression + +```js +interface ArrowFunctionExpression <: Function, Expression { + type: "ArrowFunctionExpression"; + body: BlockStatement | Expression; + expression: boolean; +} +``` + +A fat arrow function expression, e.g., `let foo = (bar) => { /* body */ }`. + +## YieldExpression + +```js +interface YieldExpression <: Expression { + type: "YieldExpression"; + argument: Expression | null; + delegate: boolean; +} +``` + +A `yield` expression. + +## AwaitExpression + +```js +interface AwaitExpression <: Expression { + type: "AwaitExpression"; + argument: Expression | null; +} +``` + +A `await` expression. + +## ArrayExpression + +```js +interface ArrayExpression <: Expression { + type: "ArrayExpression"; + elements: [ Expression | SpreadElement | null ]; +} +``` + +An array expression. + +## ObjectExpression + +```js +interface ObjectExpression <: Expression { + type: "ObjectExpression"; + properties: [ ObjectProperty | ObjectMethod | SpreadProperty ]; +} +``` + +An object expression. + +### ObjectMember + +```js +interface ObjectMember <: Node { + key: Expression; + computed: boolean; + value: Expression; + decorators: [ Decorator ]; +} +``` + +#### ObjectProperty + +```js +interface ObjectProperty <: ObjectMember { + type: "ObjectProperty"; + shorthand: boolean; +} +``` + +#### ObjectMethod + +```js +interface ObjectMethod <: ObjectMember, Function { + type: "ObjectMethod"; + kind: "get" | "set" | "method"; +} +``` + +## RestProperty + +```js +interface RestProperty <: Node { + type: "RestProperty"; + argument: Expression; +} +``` + +## SpreadProperty + +```js +interface SpreadProperty <: Node { + type: "SpreadProperty"; + argument: Expression; +} +``` + +## FunctionExpression + +```js +interface FunctionExpression <: Function, Expression { + type: "FunctionExpression"; +} +``` + +A `function` expression. + +## Unary operations + +### UnaryExpression + +```js +interface UnaryExpression <: Expression { + type: "UnaryExpression"; + operator: UnaryOperator; + prefix: boolean; + argument: Expression; +} +``` + +A unary operator expression. + +#### UnaryOperator + +```js +enum UnaryOperator { + "-" | "+" | "!" | "~" | "typeof" | "void" | "delete" +} +``` + +A unary operator token. + +### UpdateExpression + +```js +interface UpdateExpression <: Expression { + type: "UpdateExpression"; + operator: UpdateOperator; + argument: Expression; + prefix: boolean; +} +``` + +An update (increment or decrement) operator expression. + +#### UpdateOperator + +```js +enum UpdateOperator { + "++" | "--" +} +``` + +An update (increment or decrement) operator token. + +## Binary operations + +### BinaryExpression + +```js +interface BinaryExpression <: Expression { + type: "BinaryExpression"; + operator: BinaryOperator; + left: Expression; + right: Expression; +} +``` + +A binary operator expression. + +#### BinaryOperator + +```js +enum BinaryOperator { + "==" | "!=" | "===" | "!==" + | "<" | "<=" | ">" | ">=" + | "<<" | ">>" | ">>>" + | "+" | "-" | "*" | "/" | "%" + | "|" | "^" | "&" | "in" + | "instanceof" +} +``` + +A binary operator token. + +### AssignmentExpression + +```js +interface AssignmentExpression <: Expression { + type: "AssignmentExpression"; + operator: AssignmentOperator; + left: Pattern | Expression; + right: Expression; +} +``` + +An assignment operator expression. + +#### AssignmentOperator + +```js +enum AssignmentOperator { + "=" | "+=" | "-=" | "*=" | "/=" | "%=" + | "<<=" | ">>=" | ">>>=" + | "|=" | "^=" | "&=" +} +``` + +An assignment operator token. + +### LogicalExpression + +```js +interface LogicalExpression <: Expression { + type: "LogicalExpression"; + operator: LogicalOperator; + left: Expression; + right: Expression; +} +``` + +A logical operator expression. + +#### LogicalOperator + +```js +enum LogicalOperator { + "||" | "&&" +} +``` + +A logical operator token. + +### SpreadElement + +```js +interface SpreadElement <: Node { + type: "SpreadElement"; + argument: Expression; +} +``` + +### MemberExpression + +```js +interface MemberExpression <: Expression, Pattern { + type: "MemberExpression"; + object: Expression | Super; + property: Expression; + computed: boolean; +} +``` + +A member expression. If `computed` is `true`, the node corresponds to a computed (`a[b]`) member expression and `property` is an `Expression`. If `computed` is `false`, the node corresponds to a static (`a.b`) member expression and `property` is an `Identifier`. + +### BindExpression + +```js +interface BindExpression <: Expression { + type: "BindExpression"; + object: [ Expression | null ]; + callee: [ Expression ] +} +``` + +If `object` is `null`, then `callee` should be a `MemberExpression`. + +## ConditionalExpression + +```js +interface ConditionalExpression <: Expression { + type: "ConditionalExpression"; + test: Expression; + alternate: Expression; + consequent: Expression; +} +``` + +A conditional expression, i.e., a ternary `?`/`:` expression. + +## CallExpression + +```js +interface CallExpression <: Expression { + type: "CallExpression"; + callee: Expression | Super; + arguments: [ Expression | SpreadElement ]; +} +``` + +A function or method call expression. + +## NewExpression + +```js +interface NewExpression <: CallExpression { + type: "NewExpression"; +} +``` + +A `new` expression. + +## SequenceExpression + +```js +interface SequenceExpression <: Expression { + type: "SequenceExpression"; + expressions: [ Expression ]; +} +``` + +A sequence expression, i.e., a comma-separated sequence of expressions. + +# Template Literals + +## TemplateLiteral + +```js +interface TemplateLiteral <: Expression { + type: "TemplateLiteral"; + quasis: [ TemplateElement ]; + expressions: [ Expression ]; +} +``` + +## TaggedTemplateExpression + +```js +interface TaggedTemplateExpression <: Expression { + type: "TaggedTemplateExpression"; + tag: Expression; + quasi: TemplateLiteral; +} +``` + +## TemplateElement + +```js +interface TemplateElement <: Node { + type: "TemplateElement"; + tail: boolean; + value: { + cooked: string; + raw: string; + }; +} +``` + +# Patterns + +```js +interface Pattern <: Node { } +``` + +## ObjectPattern + +```js +interface AssignmentProperty <: ObjectProperty { + value: Pattern; +} + +interface ObjectPattern <: Pattern { + type: "ObjectPattern"; + properties: [ AssignmentProperty | RestProperty ]; +} +``` + +## ArrayPattern + +```js +interface ArrayPattern <: Pattern { + type: "ArrayPattern"; + elements: [ Pattern | null ]; +} +``` + +## RestElement + +```js +interface RestElement <: Pattern { + type: "RestElement"; + argument: Pattern; +} +``` + +## AssignmentPattern + +```js +interface AssignmentPattern <: Pattern { + type: "AssignmentPattern"; + left: Pattern; + right: Expression; +} +``` + +# Classes + +```js +interface Class <: Node { + id: Identifier | null; + superClass: Expression | null; + body: ClassBody; + decorators: [ Decorator ]; +} +``` + +## ClassBody + +```js +interface ClassBody <: Node { + type: "ClassBody"; + body: [ ClassMethod | ClassProperty ]; +} +``` + +## ClassMethod + +```js +interface ClassMethod <: Node { + type: "ClassMethod"; + key: Expression; + value: FunctionExpression; + kind: "constructor" | "method" | "get" | "set"; + computed: boolean; + static: boolean; + decorators: [ Decorator ]; +} +``` + +## ClassProperty + +```js +interface ClassProperty <: Node { + type: "ClassProperty"; + key: Identifier; + value: Expression; +} +``` + +## ClassDeclaration + +```js +interface ClassDeclaration <: Class, Declaration { + type: "ClassDeclaration"; + id: Identifier; +} +``` + +## ClassExpression + +```js +interface ClassExpression <: Class, Expression { + type: "ClassExpression"; +} +``` + +## MetaProperty + +```js +interface MetaProperty <: Expression { + type: "MetaProperty"; + meta: Identifier; + property: Identifier; +} +``` + +# Modules + +## ModuleDeclaration + +```js +interface ModuleDeclaration <: Node { } +``` + +A module `import` or `export` declaration. + +## ModuleSpecifier + +```js +interface ModuleSpecifier <: Node { + local: Identifier; +} +``` + +A specifier in an import or export declaration. + +## Imports + +### ImportDeclaration + +```js +interface ImportDeclaration <: ModuleDeclaration { + type: "ImportDeclaration"; + specifiers: [ ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier ]; + source: Literal; +} +``` + +An import declaration, e.g., `import foo from "mod";`. + +### ImportSpecifier + +```js +interface ImportSpecifier <: ModuleSpecifier { + type: "ImportSpecifier"; + imported: Identifier; +} +``` + +An imported variable binding, e.g., `{foo}` in `import {foo} from "mod"` or `{foo as bar}` in `import {foo as bar} from "mod"`. The `imported` field refers to the name of the export imported from the module. The `local` field refers to the binding imported into the local module scope. If it is a basic named import, such as in `import {foo} from "mod"`, both `imported` and `local` are equivalent `Identifier` nodes; in this case an `Identifier` node representing `foo`. If it is an aliased import, such as in `import {foo as bar} from "mod"`, the `imported` field is an `Identifier` node representing `foo`, and the `local` field is an `Identifier` node representing `bar`. + +### ImportDefaultSpecifier + +```js +interface ImportDefaultSpecifier <: ModuleSpecifier { + type: "ImportDefaultSpecifier"; +} +``` + +A default import specifier, e.g., `foo` in `import foo from "mod.js"`. + +### ImportNamespaceSpecifier + +```js +interface ImportNamespaceSpecifier <: ModuleSpecifier { + type: "ImportNamespaceSpecifier"; +} +``` + +A namespace import specifier, e.g., `* as foo` in `import * as foo from "mod.js"`. + +## Exports + +### ExportNamedDeclaration + +```js +interface ExportNamedDeclaration <: ModuleDeclaration { + type: "ExportNamedDeclaration"; + declaration: Declaration | null; + specifiers: [ ExportSpecifier ]; + source: Literal | null; +} +``` + +An export named declaration, e.g., `export {foo, bar};`, `export {foo} from "mod";` or `export var foo = 1;`. + +_Note: Having `declaration` populated with non-empty `specifiers` or non-null `source` results in an invalid state._ + +### ExportSpecifier + +```js +interface ExportSpecifier <: ModuleSpecifier { + type: "ExportSpecifier"; + exported: Identifier; +} +``` + +An exported variable binding, e.g., `{foo}` in `export {foo}` or `{bar as foo}` in `export {bar as foo}`. The `exported` field refers to the name exported in the module. The `local` field refers to the binding into the local module scope. If it is a basic named export, such as in `export {foo}`, both `exported` and `local` are equivalent `Identifier` nodes; in this case an `Identifier` node representing `foo`. If it is an aliased export, such as in `export {bar as foo}`, the `exported` field is an `Identifier` node representing `foo`, and the `local` field is an `Identifier` node representing `bar`. + +### ExportDefaultDeclaration + +```js +interface ExportDefaultDeclaration <: ModuleDeclaration { + type: "ExportDefaultDeclaration"; + declaration: Declaration | Expression; +} +``` + +An export default declaration, e.g., `export default function () {};` or `export default 1;`. + +### ExportAllDeclaration + +```js +interface ExportAllDeclaration <: ModuleDeclaration { + type: "ExportAllDeclaration"; + source: Literal; +} +``` + +An export batch declaration, e.g., `export * from "mod";`. From 2d4c1174857726e353520336ff8bf144e4f195b3 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Wed, 22 Jun 2016 08:50:48 -0400 Subject: [PATCH 3/7] Update Output, change links [skip ci] --- README.md | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 6bdc436589..49d012eb01 100644 --- a/README.md +++ b/README.md @@ -54,34 +54,38 @@ It is based on [ESTree spec][] with the following deviations: - [Property][] token is replaced with [ObjectProperty][] and [ObjectMethod][] - [MethodDefinition][] is replaced with [ClassMethod][] - [Program][] and [BlockStatement][] contain additional `directives` field with [Directive][] and [DirectiveLiteral][] +- [ClassMethod][], [ObjectProperty][], and [ObjectMethod][] value property's properties in [FunctionExpression][] is coerced/brought into the main method node. + +The MethodDefinition node type has been renamed to ClassMethod and it's FunctionExpression value property has been coerced into the main method node. +The Property node type with the boolean flag method has been renamed to ObjectMethod and it's FunctionExpression value property has been coerced into the main method node. AST for JSX code is based on [Facebook JSX AST][] with the addition of one node type: - `JSXText` -[Babel AST format]: https://github.com/babel/babel/blob/master/doc/ast/spec.md +[Babel AST format]: https://github.com/babel/babylon/ast/spec.md [ESTree spec]: https://github.com/estree/estree [Literal]: https://github.com/estree/estree/blob/master/spec.md#literal [Property]: https://github.com/estree/estree/blob/master/spec.md#property [MethodDefinition]: https://github.com/estree/estree/blob/master/es6.md#methoddefinition -[StringLiteral]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#stringliteral -[NumericLiteral]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#numericliteral -[BooleanLiteral]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#booleanliteral -[NullLiteral]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#nullliteral -[RegExpLiteral]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#regexpliteral -[ObjectProperty]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#objectproperty -[ObjectMethod]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#objectmethod -[ClassMethod]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#classmethod -[Program]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#programs -[BlockStatement]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#blockstatement -[Directive]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#directive -[DirectiveLiteral]: https://github.com/babel/babel/blob/master/doc/ast/spec.md#directiveliteral +[StringLiteral]: https://github.com/babel/babylon/ast/spec.md#stringliteral +[NumericLiteral]: https://github.com/babel/babylon/ast/spec.md#numericliteral +[BooleanLiteral]: https://github.com/babel/babylon/ast/spec.md#booleanliteral +[NullLiteral]: https://github.com/babel/babylon/ast/spec.md#nullliteral +[RegExpLiteral]: https://github.com/babel/babylon/ast/spec.md#regexpliteral +[ObjectProperty]: https://github.com/babel/babylon/ast/spec.md#objectproperty +[ObjectMethod]: https://github.com/babel/babylon/ast/spec.md#objectmethod +[ClassMethod]: https://github.com/babel/babylon/ast/spec.md#classmethod +[Program]: https://github.com/babel/babylon/ast/spec.md#programs +[BlockStatement]: https://github.com/babel/babylon/ast/spec.md#blockstatement +[Directive]: https://github.com/babel/babylon/ast/spec.md#directive +[DirectiveLiteral]: https://github.com/babel/babylon/ast/spec.md#directiveliteral +[FunctionExpression]: https://github.com/babel/babylon/ast/spec.md#functionexpression [Facebook JSX AST]: https://github.com/facebook/jsx/blob/master/AST.md - ### Example ```javascript From dcc3b981f9287114754dd802631bf55659d886cd Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Wed, 22 Jun 2016 08:55:41 -0400 Subject: [PATCH 4/7] rm extraneous text [skip ci] --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 49d012eb01..d9460f58b6 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,6 @@ It is based on [ESTree spec][] with the following deviations: - [Program][] and [BlockStatement][] contain additional `directives` field with [Directive][] and [DirectiveLiteral][] - [ClassMethod][], [ObjectProperty][], and [ObjectMethod][] value property's properties in [FunctionExpression][] is coerced/brought into the main method node. -The MethodDefinition node type has been renamed to ClassMethod and it's FunctionExpression value property has been coerced into the main method node. -The Property node type with the boolean flag method has been renamed to ObjectMethod and it's FunctionExpression value property has been coerced into the main method node. - AST for JSX code is based on [Facebook JSX AST][] with the addition of one node type: - `JSXText` From c8e35ee70abfc8f2e92d7b3bb5644f2b37171500 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Wed, 22 Jun 2016 08:58:39 -0400 Subject: [PATCH 5/7] Test on node 6, remove iojs --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f2a6d3cad3..eb09fd97fe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,9 +8,9 @@ cache: - node_modules node_js: + - "6" - "5" - "4" - - iojs - "0.12" script: npm test From 6dac2afd439cbcc227d2fa8d5b7e470e17ad6226 Mon Sep 17 00:00:00 2001 From: Jesse McCarthy Date: Wed, 22 Jun 2016 09:45:47 -0400 Subject: [PATCH 6/7] Fix link to AST spec [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d9460f58b6..8fd96b30f5 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ AST for JSX code is based on [Facebook JSX AST][] with the addition of one node - `JSXText` -[Babel AST format]: https://github.com/babel/babylon/ast/spec.md +[Babel AST format]: https://github.com/babel/babylon/blob/master/ast/spec.md [ESTree spec]: https://github.com/estree/estree [Literal]: https://github.com/estree/estree/blob/master/spec.md#literal From 3f266691a84b56740c015999c9dcaa48eb1ca737 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Wed, 22 Jun 2016 09:54:05 -0400 Subject: [PATCH 7/7] fix ast links again [skip ci] --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 8fd96b30f5..ee65d579ef 100644 --- a/README.md +++ b/README.md @@ -67,19 +67,19 @@ AST for JSX code is based on [Facebook JSX AST][] with the addition of one node [Property]: https://github.com/estree/estree/blob/master/spec.md#property [MethodDefinition]: https://github.com/estree/estree/blob/master/es6.md#methoddefinition -[StringLiteral]: https://github.com/babel/babylon/ast/spec.md#stringliteral -[NumericLiteral]: https://github.com/babel/babylon/ast/spec.md#numericliteral -[BooleanLiteral]: https://github.com/babel/babylon/ast/spec.md#booleanliteral -[NullLiteral]: https://github.com/babel/babylon/ast/spec.md#nullliteral -[RegExpLiteral]: https://github.com/babel/babylon/ast/spec.md#regexpliteral -[ObjectProperty]: https://github.com/babel/babylon/ast/spec.md#objectproperty -[ObjectMethod]: https://github.com/babel/babylon/ast/spec.md#objectmethod -[ClassMethod]: https://github.com/babel/babylon/ast/spec.md#classmethod -[Program]: https://github.com/babel/babylon/ast/spec.md#programs -[BlockStatement]: https://github.com/babel/babylon/ast/spec.md#blockstatement -[Directive]: https://github.com/babel/babylon/ast/spec.md#directive -[DirectiveLiteral]: https://github.com/babel/babylon/ast/spec.md#directiveliteral -[FunctionExpression]: https://github.com/babel/babylon/ast/spec.md#functionexpression +[StringLiteral]: https://github.com/babel/babylon/blob/master/ast/spec.md#stringliteral +[NumericLiteral]: https://github.com/babel/babylon/blob/master/ast/spec.md#numericliteral +[BooleanLiteral]: https://github.com/babel/babylon/blob/master/ast/spec.md#booleanliteral +[NullLiteral]: https://github.com/babel/babylon/blob/master/ast/spec.md#nullliteral +[RegExpLiteral]: https://github.com/babel/babylon/blob/master/ast/spec.md#regexpliteral +[ObjectProperty]: https://github.com/babel/babylon/blob/master/ast/spec.md#objectproperty +[ObjectMethod]: https://github.com/babel/babylon/blob/master/ast/spec.md#objectmethod +[ClassMethod]: https://github.com/babel/babylon/blob/master/ast/spec.md#classmethod +[Program]: https://github.com/babel/babylon/blob/master/ast/spec.md#programs +[BlockStatement]: https://github.com/babel/babylon/blob/master/ast/spec.md#blockstatement +[Directive]: https://github.com/babel/babylon/blob/master/ast/spec.md#directive +[DirectiveLiteral]: https://github.com/babel/babylon/blob/master/ast/spec.md#directiveliteral +[FunctionExpression]: https://github.com/babel/babylon/blob/master/ast/spec.md#functionexpression [Facebook JSX AST]: https://github.com/facebook/jsx/blob/master/AST.md