You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

core.js 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. "use strict";;
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. var types_1 = __importDefault(require("../lib/types"));
  7. var shared_1 = __importDefault(require("../lib/shared"));
  8. function default_1(fork) {
  9. var types = fork.use(types_1.default);
  10. var Type = types.Type;
  11. var def = Type.def;
  12. var or = Type.or;
  13. var shared = fork.use(shared_1.default);
  14. var defaults = shared.defaults;
  15. var geq = shared.geq;
  16. // Abstract supertype of all syntactic entities that are allowed to have a
  17. // .loc field.
  18. def("Printable")
  19. .field("loc", or(def("SourceLocation"), null), defaults["null"], true);
  20. def("Node")
  21. .bases("Printable")
  22. .field("type", String)
  23. .field("comments", or([def("Comment")], null), defaults["null"], true);
  24. def("SourceLocation")
  25. .field("start", def("Position"))
  26. .field("end", def("Position"))
  27. .field("source", or(String, null), defaults["null"]);
  28. def("Position")
  29. .field("line", geq(1))
  30. .field("column", geq(0));
  31. def("File")
  32. .bases("Node")
  33. .build("program", "name")
  34. .field("program", def("Program"))
  35. .field("name", or(String, null), defaults["null"]);
  36. def("Program")
  37. .bases("Node")
  38. .build("body")
  39. .field("body", [def("Statement")]);
  40. def("Function")
  41. .bases("Node")
  42. .field("id", or(def("Identifier"), null), defaults["null"])
  43. .field("params", [def("Pattern")])
  44. .field("body", def("BlockStatement"))
  45. .field("generator", Boolean, defaults["false"])
  46. .field("async", Boolean, defaults["false"]);
  47. def("Statement").bases("Node");
  48. // The empty .build() here means that an EmptyStatement can be constructed
  49. // (i.e. it's not abstract) but that it needs no arguments.
  50. def("EmptyStatement").bases("Statement").build();
  51. def("BlockStatement")
  52. .bases("Statement")
  53. .build("body")
  54. .field("body", [def("Statement")]);
  55. // TODO Figure out how to silently coerce Expressions to
  56. // ExpressionStatements where a Statement was expected.
  57. def("ExpressionStatement")
  58. .bases("Statement")
  59. .build("expression")
  60. .field("expression", def("Expression"));
  61. def("IfStatement")
  62. .bases("Statement")
  63. .build("test", "consequent", "alternate")
  64. .field("test", def("Expression"))
  65. .field("consequent", def("Statement"))
  66. .field("alternate", or(def("Statement"), null), defaults["null"]);
  67. def("LabeledStatement")
  68. .bases("Statement")
  69. .build("label", "body")
  70. .field("label", def("Identifier"))
  71. .field("body", def("Statement"));
  72. def("BreakStatement")
  73. .bases("Statement")
  74. .build("label")
  75. .field("label", or(def("Identifier"), null), defaults["null"]);
  76. def("ContinueStatement")
  77. .bases("Statement")
  78. .build("label")
  79. .field("label", or(def("Identifier"), null), defaults["null"]);
  80. def("WithStatement")
  81. .bases("Statement")
  82. .build("object", "body")
  83. .field("object", def("Expression"))
  84. .field("body", def("Statement"));
  85. def("SwitchStatement")
  86. .bases("Statement")
  87. .build("discriminant", "cases", "lexical")
  88. .field("discriminant", def("Expression"))
  89. .field("cases", [def("SwitchCase")])
  90. .field("lexical", Boolean, defaults["false"]);
  91. def("ReturnStatement")
  92. .bases("Statement")
  93. .build("argument")
  94. .field("argument", or(def("Expression"), null));
  95. def("ThrowStatement")
  96. .bases("Statement")
  97. .build("argument")
  98. .field("argument", def("Expression"));
  99. def("TryStatement")
  100. .bases("Statement")
  101. .build("block", "handler", "finalizer")
  102. .field("block", def("BlockStatement"))
  103. .field("handler", or(def("CatchClause"), null), function () {
  104. return this.handlers && this.handlers[0] || null;
  105. })
  106. .field("handlers", [def("CatchClause")], function () {
  107. return this.handler ? [this.handler] : [];
  108. }, true) // Indicates this field is hidden from eachField iteration.
  109. .field("guardedHandlers", [def("CatchClause")], defaults.emptyArray)
  110. .field("finalizer", or(def("BlockStatement"), null), defaults["null"]);
  111. def("CatchClause")
  112. .bases("Node")
  113. .build("param", "guard", "body")
  114. // https://github.com/tc39/proposal-optional-catch-binding
  115. .field("param", or(def("Pattern"), null), defaults["null"])
  116. .field("guard", or(def("Expression"), null), defaults["null"])
  117. .field("body", def("BlockStatement"));
  118. def("WhileStatement")
  119. .bases("Statement")
  120. .build("test", "body")
  121. .field("test", def("Expression"))
  122. .field("body", def("Statement"));
  123. def("DoWhileStatement")
  124. .bases("Statement")
  125. .build("body", "test")
  126. .field("body", def("Statement"))
  127. .field("test", def("Expression"));
  128. def("ForStatement")
  129. .bases("Statement")
  130. .build("init", "test", "update", "body")
  131. .field("init", or(def("VariableDeclaration"), def("Expression"), null))
  132. .field("test", or(def("Expression"), null))
  133. .field("update", or(def("Expression"), null))
  134. .field("body", def("Statement"));
  135. def("ForInStatement")
  136. .bases("Statement")
  137. .build("left", "right", "body")
  138. .field("left", or(def("VariableDeclaration"), def("Expression")))
  139. .field("right", def("Expression"))
  140. .field("body", def("Statement"));
  141. def("DebuggerStatement").bases("Statement").build();
  142. def("Declaration").bases("Statement");
  143. def("FunctionDeclaration")
  144. .bases("Function", "Declaration")
  145. .build("id", "params", "body")
  146. .field("id", def("Identifier"));
  147. def("FunctionExpression")
  148. .bases("Function", "Expression")
  149. .build("id", "params", "body");
  150. def("VariableDeclaration")
  151. .bases("Declaration")
  152. .build("kind", "declarations")
  153. .field("kind", or("var", "let", "const"))
  154. .field("declarations", [def("VariableDeclarator")]);
  155. def("VariableDeclarator")
  156. .bases("Node")
  157. .build("id", "init")
  158. .field("id", def("Pattern"))
  159. .field("init", or(def("Expression"), null), defaults["null"]);
  160. def("Expression").bases("Node");
  161. def("ThisExpression").bases("Expression").build();
  162. def("ArrayExpression")
  163. .bases("Expression")
  164. .build("elements")
  165. .field("elements", [or(def("Expression"), null)]);
  166. def("ObjectExpression")
  167. .bases("Expression")
  168. .build("properties")
  169. .field("properties", [def("Property")]);
  170. // TODO Not in the Mozilla Parser API, but used by Esprima.
  171. def("Property")
  172. .bases("Node") // Want to be able to visit Property Nodes.
  173. .build("kind", "key", "value")
  174. .field("kind", or("init", "get", "set"))
  175. .field("key", or(def("Literal"), def("Identifier")))
  176. .field("value", def("Expression"));
  177. def("SequenceExpression")
  178. .bases("Expression")
  179. .build("expressions")
  180. .field("expressions", [def("Expression")]);
  181. var UnaryOperator = or("-", "+", "!", "~", "typeof", "void", "delete");
  182. def("UnaryExpression")
  183. .bases("Expression")
  184. .build("operator", "argument", "prefix")
  185. .field("operator", UnaryOperator)
  186. .field("argument", def("Expression"))
  187. // Esprima doesn't bother with this field, presumably because it's
  188. // always true for unary operators.
  189. .field("prefix", Boolean, defaults["true"]);
  190. var BinaryOperator = or("==", "!=", "===", "!==", "<", "<=", ">", ">=", "<<", ">>", ">>>", "+", "-", "*", "/", "%", "**", "&", // TODO Missing from the Parser API.
  191. "|", "^", "in", "instanceof");
  192. def("BinaryExpression")
  193. .bases("Expression")
  194. .build("operator", "left", "right")
  195. .field("operator", BinaryOperator)
  196. .field("left", def("Expression"))
  197. .field("right", def("Expression"));
  198. var AssignmentOperator = or("=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "|=", "^=", "&=");
  199. def("AssignmentExpression")
  200. .bases("Expression")
  201. .build("operator", "left", "right")
  202. .field("operator", AssignmentOperator)
  203. .field("left", or(def("Pattern"), def("MemberExpression")))
  204. .field("right", def("Expression"));
  205. var UpdateOperator = or("++", "--");
  206. def("UpdateExpression")
  207. .bases("Expression")
  208. .build("operator", "argument", "prefix")
  209. .field("operator", UpdateOperator)
  210. .field("argument", def("Expression"))
  211. .field("prefix", Boolean);
  212. var LogicalOperator = or("||", "&&");
  213. def("LogicalExpression")
  214. .bases("Expression")
  215. .build("operator", "left", "right")
  216. .field("operator", LogicalOperator)
  217. .field("left", def("Expression"))
  218. .field("right", def("Expression"));
  219. def("ConditionalExpression")
  220. .bases("Expression")
  221. .build("test", "consequent", "alternate")
  222. .field("test", def("Expression"))
  223. .field("consequent", def("Expression"))
  224. .field("alternate", def("Expression"));
  225. def("NewExpression")
  226. .bases("Expression")
  227. .build("callee", "arguments")
  228. .field("callee", def("Expression"))
  229. // The Mozilla Parser API gives this type as [or(def("Expression"),
  230. // null)], but null values don't really make sense at the call site.
  231. // TODO Report this nonsense.
  232. .field("arguments", [def("Expression")]);
  233. def("CallExpression")
  234. .bases("Expression")
  235. .build("callee", "arguments")
  236. .field("callee", def("Expression"))
  237. // See comment for NewExpression above.
  238. .field("arguments", [def("Expression")]);
  239. def("MemberExpression")
  240. .bases("Expression")
  241. .build("object", "property", "computed")
  242. .field("object", def("Expression"))
  243. .field("property", or(def("Identifier"), def("Expression")))
  244. .field("computed", Boolean, function () {
  245. var type = this.property.type;
  246. if (type === 'Literal' ||
  247. type === 'MemberExpression' ||
  248. type === 'BinaryExpression') {
  249. return true;
  250. }
  251. return false;
  252. });
  253. def("Pattern").bases("Node");
  254. def("SwitchCase")
  255. .bases("Node")
  256. .build("test", "consequent")
  257. .field("test", or(def("Expression"), null))
  258. .field("consequent", [def("Statement")]);
  259. def("Identifier")
  260. .bases("Expression", "Pattern")
  261. .build("name")
  262. .field("name", String)
  263. .field("optional", Boolean, defaults["false"]);
  264. def("Literal")
  265. .bases("Expression")
  266. .build("value")
  267. .field("value", or(String, Boolean, null, Number, RegExp))
  268. .field("regex", or({
  269. pattern: String,
  270. flags: String
  271. }, null), function () {
  272. if (this.value instanceof RegExp) {
  273. var flags = "";
  274. if (this.value.ignoreCase)
  275. flags += "i";
  276. if (this.value.multiline)
  277. flags += "m";
  278. if (this.value.global)
  279. flags += "g";
  280. return {
  281. pattern: this.value.source,
  282. flags: flags
  283. };
  284. }
  285. return null;
  286. });
  287. // Abstract (non-buildable) comment supertype. Not a Node.
  288. def("Comment")
  289. .bases("Printable")
  290. .field("value", String)
  291. // A .leading comment comes before the node, whereas a .trailing
  292. // comment comes after it. These two fields should not both be true,
  293. // but they might both be false when the comment falls inside a node
  294. // and the node has no children for the comment to lead or trail,
  295. // e.g. { /*dangling*/ }.
  296. .field("leading", Boolean, defaults["true"])
  297. .field("trailing", Boolean, defaults["false"]);
  298. }
  299. exports.default = default_1;
  300. module.exports = exports["default"];