1 | "use strict";
|
2 |
|
3 | function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
4 |
|
5 | var FALLBACK_HANDLER = Symbol("fallback handler");
|
6 |
|
7 | module.exports = function (_ref) {
|
8 | var t = _ref.types;
|
9 |
|
10 | var undef = t.unaryExpression("void", t.numericLiteral(0));
|
11 |
|
12 | function isUndef(ob) {
|
13 | return ob === undefined || t.isIdentifier(ob, { name: "undefined" }) || t.isUnaryExpression(ob, { operator: "void" });
|
14 | }
|
15 |
|
16 | function defaultZero(cb) {
|
17 | return function () {
|
18 | var i = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : t.numericLiteral(0);
|
19 |
|
20 | if (t.isNumericLiteral(i)) {
|
21 | for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
22 | args[_key - 1] = arguments[_key];
|
23 | }
|
24 |
|
25 | return cb.call.apply(cb, [this, this, i.value].concat(args));
|
26 | }
|
27 | };
|
28 | }
|
29 |
|
30 | return {
|
31 | ArrayExpression: {
|
32 | members: {
|
33 | length() {
|
34 | return t.numericLiteral(this.elements.length);
|
35 | },
|
36 | [FALLBACK_HANDLER](i) {
|
37 | if (typeof i === "number" || i.match(/^\d+$/)) {
|
38 | return this.elements[i] || undef;
|
39 | }
|
40 | }
|
41 | },
|
42 | calls: {
|
43 | concat() {
|
44 | var _elements;
|
45 |
|
46 | for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
47 | args[_key2] = arguments[_key2];
|
48 | }
|
49 |
|
50 | return t.arrayExpression((_elements = this.elements).concat.apply(_elements, _toConsumableArray(args.map(function (arg) {
|
51 | if (t.isArrayExpression(arg)) return arg.elements;
|
52 | return arg;
|
53 | }))));
|
54 | },
|
55 | join() {
|
56 | var sep = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : t.stringLiteral(",");
|
57 |
|
58 | if (!t.isStringLiteral(sep)) return;
|
59 | var bad = false;
|
60 | var str = this.elements.map(function (el) {
|
61 | if (!t.isLiteral(el)) {
|
62 | bad = true;
|
63 | return;
|
64 | }
|
65 | return el.value;
|
66 | }).join(sep.value);
|
67 | return bad ? undefined : t.stringLiteral(str);
|
68 | },
|
69 | push() {
|
70 | return t.numericLiteral(this.elements.length + arguments.length);
|
71 | },
|
72 | shift() {
|
73 | if (this.elements.length === 0) {
|
74 | return undef;
|
75 | }
|
76 | return t.numericLiteral(this.elements.length - 1);
|
77 | },
|
78 | slice() {
|
79 | var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : t.numericLiteral(0);
|
80 | var end = arguments[1];
|
81 |
|
82 | if (!t.isNumericLiteral(start) || end && !t.isNumericLiteral(end)) {
|
83 | return;
|
84 | }
|
85 | return t.arrayExpression(this.elements.slice(start.value, end && end.value));
|
86 | },
|
87 | pop() {
|
88 | return this.elements[this.elements.length - 1] || undef;
|
89 | },
|
90 | reverse() {
|
91 | return t.arrayExpression(this.elements.reverse());
|
92 | },
|
93 | splice(start, end) {
|
94 | var _elements$slice;
|
95 |
|
96 | if (!t.isNumericLiteral(start) || end && !t.isNumericLiteral(end)) {
|
97 | return;
|
98 | }
|
99 |
|
100 | for (var _len3 = arguments.length, args = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
|
101 | args[_key3 - 2] = arguments[_key3];
|
102 | }
|
103 |
|
104 | if (end) {
|
105 | args.unshift(end.value);
|
106 | }
|
107 | return t.arrayExpression((_elements$slice = this.elements.slice()).splice.apply(_elements$slice, [start.value].concat(args)));
|
108 | }
|
109 | }
|
110 | },
|
111 | StringLiteral: {
|
112 | members: {
|
113 | length() {
|
114 | return t.numericLiteral(this.value.length);
|
115 | },
|
116 | [FALLBACK_HANDLER](i) {
|
117 | if (typeof i === "number" || i.match(/^\d+$/)) {
|
118 | var ch = this.value[i];
|
119 | return ch ? t.stringLiteral(ch) : undef;
|
120 | }
|
121 | }
|
122 | },
|
123 | calls: {
|
124 | split() {
|
125 | var sep = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undef;
|
126 |
|
127 | var realSep = null;
|
128 | if (t.isStringLiteral(sep)) {
|
129 | realSep = sep.value;
|
130 | }
|
131 | if (isUndef(sep)) {
|
132 | realSep = sep;
|
133 | }
|
134 | if (realSep !== null) {
|
135 | return t.arrayExpression(this.value.split(realSep).map(function (str) {
|
136 | return t.stringLiteral(str);
|
137 | }));
|
138 | }
|
139 | },
|
140 | charAt: defaultZero(function (_ref2, i) {
|
141 | var value = _ref2.value;
|
142 | return t.stringLiteral(value.charAt(i));
|
143 | }),
|
144 | charCodeAt: defaultZero(function (_ref3, i) {
|
145 | var value = _ref3.value;
|
146 | return t.numericLiteral(value.charCodeAt(i));
|
147 | }),
|
148 | codePointAt: defaultZero(function (_ref4, i) {
|
149 | var value = _ref4.value;
|
150 | return t.numericLiteral(value.codePointAt(i));
|
151 | })
|
152 | }
|
153 | }
|
154 | };
|
155 | };
|
156 | module.exports.FALLBACK_HANDLER = FALLBACK_HANDLER; |
\ | No newline at end of file |