spider-src 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +74 -0
- data/README.md +37 -0
- data/Rakefile +25 -0
- data/lib/spider-src/support/spider/.eslintrc +17 -0
- data/lib/spider-src/support/spider/.npmignore +9 -0
- data/lib/spider-src/support/spider/.travis.yml +7 -0
- data/lib/spider-src/support/spider/.yo-rc.json +3 -0
- data/lib/spider-src/support/spider/CHANGELOG.md +64 -0
- data/lib/spider-src/support/spider/Gruntfile.js +97 -0
- data/lib/spider-src/support/spider/Gruntfile.spider +93 -0
- data/lib/spider-src/support/spider/LICENSE +201 -0
- data/lib/spider-src/support/spider/README.md +50 -0
- data/lib/spider-src/support/spider/cli.js +119 -0
- data/lib/spider-src/support/spider/lib/ast/CaseClause.js +179 -0
- data/lib/spider-src/support/spider/lib/ast/CatchClause.js +26 -0
- data/lib/spider-src/support/spider/lib/ast/ExportBatchSpecifier.js +19 -0
- data/lib/spider-src/support/spider/lib/ast/ExportSpecifier.js +33 -0
- data/lib/spider-src/support/spider/lib/ast/ImportDefaultSpecifier.js +23 -0
- data/lib/spider-src/support/spider/lib/ast/ImportNamespaceSpecifier.js +23 -0
- data/lib/spider-src/support/spider/lib/ast/ImportSpecifier.js +40 -0
- data/lib/spider-src/support/spider/lib/ast/Node.js +93 -0
- data/lib/spider-src/support/spider/lib/ast/Parameter.js +229 -0
- data/lib/spider-src/support/spider/lib/ast/Program.js +58 -0
- data/lib/spider-src/support/spider/lib/ast/Property.js +32 -0
- data/lib/spider-src/support/spider/lib/ast/Range.js +257 -0
- data/lib/spider-src/support/spider/lib/ast/VariableDeclarator.js +29 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/ArrayExpression.js +41 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/ArrayPattern.js +45 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/AssignmentExpression.js +29 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/BinaryExpression.js +104 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/CallExpression.js +139 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/ConditionalExpression.js +31 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/CurryCallExpression.js +102 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/ExistentialExpression.js +83 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/ForInExpression.js +116 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/FunctionExpression.js +157 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/InExpression.js +99 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/LogicalExpression.js +50 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/MemberExpression.js +43 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/NewExpression.js +46 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/NullCheckCallExpression.js +132 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/NullCoalescingExpression.js +114 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/NullPropagatingExpression.js +161 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/ObjectExpression.js +39 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/ObjectPattern.js +49 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/RangeMemberExpression.js +157 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/SplatExpression.js +48 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/SuperExpression.js +170 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/ThisExpression.js +22 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/UnaryExpression.js +147 -0
- data/lib/spider-src/support/spider/lib/ast/expressions/UpdateExpression.js +26 -0
- data/lib/spider-src/support/spider/lib/ast/literals/BooleanLiteral.js +24 -0
- data/lib/spider-src/support/spider/lib/ast/literals/Identifier.js +60 -0
- data/lib/spider-src/support/spider/lib/ast/literals/NullLiteral.js +24 -0
- data/lib/spider-src/support/spider/lib/ast/literals/NumberLiteral.js +24 -0
- data/lib/spider-src/support/spider/lib/ast/literals/RegularExpressionLiteral.js +25 -0
- data/lib/spider-src/support/spider/lib/ast/literals/StringLiteral.js +90 -0
- data/lib/spider-src/support/spider/lib/ast/literals/UndefinedLiteral.js +30 -0
- data/lib/spider-src/support/spider/lib/ast/statements/BlockStatement.js +47 -0
- data/lib/spider-src/support/spider/lib/ast/statements/BreakStatement.js +19 -0
- data/lib/spider-src/support/spider/lib/ast/statements/ContinueStatement.js +19 -0
- data/lib/spider-src/support/spider/lib/ast/statements/DebuggerStatement.js +19 -0
- data/lib/spider-src/support/spider/lib/ast/statements/DoWhileStatement.js +25 -0
- data/lib/spider-src/support/spider/lib/ast/statements/ExportDeclarationStatement.js +51 -0
- data/lib/spider-src/support/spider/lib/ast/statements/ExpressionStatement.js +22 -0
- data/lib/spider-src/support/spider/lib/ast/statements/FallthroughStatement.js +74 -0
- data/lib/spider-src/support/spider/lib/ast/statements/ForInStatement.js +79 -0
- data/lib/spider-src/support/spider/lib/ast/statements/ForOfStatement.js +98 -0
- data/lib/spider-src/support/spider/lib/ast/statements/ForStatement.js +43 -0
- data/lib/spider-src/support/spider/lib/ast/statements/FunctionDeclarationStatement.js +104 -0
- data/lib/spider-src/support/spider/lib/ast/statements/GoStatement.js +41 -0
- data/lib/spider-src/support/spider/lib/ast/statements/IfStatement.js +32 -0
- data/lib/spider-src/support/spider/lib/ast/statements/ImportDeclarationStatement.js +40 -0
- data/lib/spider-src/support/spider/lib/ast/statements/PushStatement.js +37 -0
- data/lib/spider-src/support/spider/lib/ast/statements/ReturnStatement.js +26 -0
- data/lib/spider-src/support/spider/lib/ast/statements/SwitchStatement.js +159 -0
- data/lib/spider-src/support/spider/lib/ast/statements/ThrowStatement.js +22 -0
- data/lib/spider-src/support/spider/lib/ast/statements/TryStatement.js +36 -0
- data/lib/spider-src/support/spider/lib/ast/statements/UntilStatement.js +31 -0
- data/lib/spider-src/support/spider/lib/ast/statements/UseStatement.js +49 -0
- data/lib/spider-src/support/spider/lib/ast/statements/VariableDeclarationStatement.js +36 -0
- data/lib/spider-src/support/spider/lib/ast/statements/WhileStatement.js +25 -0
- data/lib/spider-src/support/spider/lib/ast.js +16 -0
- data/lib/spider-src/support/spider/lib/parser.js +14878 -0
- data/lib/spider-src/support/spider/lib/spider.js +217 -0
- data/lib/spider-src/support/spider/package.json +61 -0
- data/lib/spider-src/support/spider/spider-script.js +6 -0
- data/lib/spider-src/support/spider/src/ast/CaseClause.spider +179 -0
- data/lib/spider-src/support/spider/src/ast/CatchClause.spider +30 -0
- data/lib/spider-src/support/spider/src/ast/ExportBatchSpecifier.spider +19 -0
- data/lib/spider-src/support/spider/src/ast/ExportSpecifier.spider +37 -0
- data/lib/spider-src/support/spider/src/ast/ImportDefaultSpecifier.spider +25 -0
- data/lib/spider-src/support/spider/src/ast/ImportNamespaceSpecifier.spider +25 -0
- data/lib/spider-src/support/spider/src/ast/ImportSpecifier.spider +44 -0
- data/lib/spider-src/support/spider/src/ast/Node.spider +104 -0
- data/lib/spider-src/support/spider/src/ast/Parameter.spider +233 -0
- data/lib/spider-src/support/spider/src/ast/Program.spider +109 -0
- data/lib/spider-src/support/spider/src/ast/Property.spider +36 -0
- data/lib/spider-src/support/spider/src/ast/Range.spider +291 -0
- data/lib/spider-src/support/spider/src/ast/VariableDeclarator.spider +33 -0
- data/lib/spider-src/support/spider/src/ast/expressions/ArrayExpression.spider +32 -0
- data/lib/spider-src/support/spider/src/ast/expressions/ArrayPattern.spider +37 -0
- data/lib/spider-src/support/spider/src/ast/expressions/AssignmentExpression.spider +34 -0
- data/lib/spider-src/support/spider/src/ast/expressions/BinaryExpression.spider +125 -0
- data/lib/spider-src/support/spider/src/ast/expressions/CallExpression.spider +149 -0
- data/lib/spider-src/support/spider/src/ast/expressions/ConditionalExpression.spider +34 -0
- data/lib/spider-src/support/spider/src/ast/expressions/CurryCallExpression.spider +109 -0
- data/lib/spider-src/support/spider/src/ast/expressions/ExistentialExpression.spider +102 -0
- data/lib/spider-src/support/spider/src/ast/expressions/ForInExpression.spider +140 -0
- data/lib/spider-src/support/spider/src/ast/expressions/FunctionExpression.spider +183 -0
- data/lib/spider-src/support/spider/src/ast/expressions/InExpression.spider +114 -0
- data/lib/spider-src/support/spider/src/ast/expressions/LogicalExpression.spider +62 -0
- data/lib/spider-src/support/spider/src/ast/expressions/MemberExpression.spider +57 -0
- data/lib/spider-src/support/spider/src/ast/expressions/NewExpression.spider +40 -0
- data/lib/spider-src/support/spider/src/ast/expressions/NullCheckCallExpression.spider +151 -0
- data/lib/spider-src/support/spider/src/ast/expressions/NullCoalescingExpression.spider +151 -0
- data/lib/spider-src/support/spider/src/ast/expressions/NullPropagatingExpression.spider +190 -0
- data/lib/spider-src/support/spider/src/ast/expressions/ObjectExpression.spider +30 -0
- data/lib/spider-src/support/spider/src/ast/expressions/ObjectPattern.spider +42 -0
- data/lib/spider-src/support/spider/src/ast/expressions/RangeMemberExpression.spider +179 -0
- data/lib/spider-src/support/spider/src/ast/expressions/SplatExpression.spider +49 -0
- data/lib/spider-src/support/spider/src/ast/expressions/SuperExpression.spider +235 -0
- data/lib/spider-src/support/spider/src/ast/expressions/ThisExpression.spider +21 -0
- data/lib/spider-src/support/spider/src/ast/expressions/UnaryExpression.spider +158 -0
- data/lib/spider-src/support/spider/src/ast/expressions/UpdateExpression.spider +28 -0
- data/lib/spider-src/support/spider/src/ast/literals/BooleanLiteral.spider +23 -0
- data/lib/spider-src/support/spider/src/ast/literals/Identifier.spider +68 -0
- data/lib/spider-src/support/spider/src/ast/literals/NullLiteral.spider +23 -0
- data/lib/spider-src/support/spider/src/ast/literals/NumberLiteral.spider +23 -0
- data/lib/spider-src/support/spider/src/ast/literals/RegularExpressionLiteral.spider +24 -0
- data/lib/spider-src/support/spider/src/ast/literals/StringLiteral.spider +91 -0
- data/lib/spider-src/support/spider/src/ast/literals/UndefinedLiteral.spider +30 -0
- data/lib/spider-src/support/spider/src/ast/statements/BlockStatement.spider +45 -0
- data/lib/spider-src/support/spider/src/ast/statements/BreakStatement.spider +19 -0
- data/lib/spider-src/support/spider/src/ast/statements/ContinueStatement.spider +19 -0
- data/lib/spider-src/support/spider/src/ast/statements/DebuggerStatement.spider +19 -0
- data/lib/spider-src/support/spider/src/ast/statements/DoWhileStatement.spider +28 -0
- data/lib/spider-src/support/spider/src/ast/statements/ExportDeclarationStatement.spider +46 -0
- data/lib/spider-src/support/spider/src/ast/statements/ExpressionStatement.spider +22 -0
- data/lib/spider-src/support/spider/src/ast/statements/FallthroughStatement.spider +85 -0
- data/lib/spider-src/support/spider/src/ast/statements/ForInStatement.spider +92 -0
- data/lib/spider-src/support/spider/src/ast/statements/ForOfStatement.spider +117 -0
- data/lib/spider-src/support/spider/src/ast/statements/ForStatement.spider +51 -0
- data/lib/spider-src/support/spider/src/ast/statements/FunctionDeclarationStatement.spider +115 -0
- data/lib/spider-src/support/spider/src/ast/statements/GoStatement.spider +44 -0
- data/lib/spider-src/support/spider/src/ast/statements/IfStatement.spider +38 -0
- data/lib/spider-src/support/spider/src/ast/statements/ImportDeclarationStatement.spider +33 -0
- data/lib/spider-src/support/spider/src/ast/statements/PushStatement.spider +40 -0
- data/lib/spider-src/support/spider/src/ast/statements/ReturnStatement.spider +28 -0
- data/lib/spider-src/support/spider/src/ast/statements/SwitchStatement.spider +161 -0
- data/lib/spider-src/support/spider/src/ast/statements/ThrowStatement.spider +23 -0
- data/lib/spider-src/support/spider/src/ast/statements/TryStatement.spider +42 -0
- data/lib/spider-src/support/spider/src/ast/statements/UntilStatement.spider +36 -0
- data/lib/spider-src/support/spider/src/ast/statements/UseStatement.spider +62 -0
- data/lib/spider-src/support/spider/src/ast/statements/VariableDeclarationStatement.spider +34 -0
- data/lib/spider-src/support/spider/src/ast/statements/WhileStatement.spider +28 -0
- data/lib/spider-src/support/spider/src/ast.spider +80 -0
- data/lib/spider-src/support/spider/src/spider.pegjs +1434 -0
- data/lib/spider-src/support/spider/src/spider.spider +276 -0
- data/lib/spider-src/support/spider/test/spider_test.js +1787 -0
- data/lib/spider-src/version.rb +5 -0
- data/lib/spider-src.rb +37 -0
- data/spider-src.gemspec +24 -0
- data/test/test_spider_src.rb +33 -0
- metadata +225 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
use :node;
|
2
|
+
|
3
|
+
fn Node() {
|
4
|
+
var self = this;
|
5
|
+
self.codeGenerated = false;
|
6
|
+
self.definedIdentifiers = [];
|
7
|
+
|
8
|
+
::Object.defineProperty(self, 'parent', {
|
9
|
+
value: null,
|
10
|
+
writable: true,
|
11
|
+
configurable: true,
|
12
|
+
enumerable: false
|
13
|
+
});
|
14
|
+
|
15
|
+
self.getContext = () -> {
|
16
|
+
if self.type == 'Program' ||
|
17
|
+
self.type == 'BlockStatement' {
|
18
|
+
return {
|
19
|
+
node: self,
|
20
|
+
position: -1
|
21
|
+
};
|
22
|
+
}
|
23
|
+
|
24
|
+
if !self.parent? {
|
25
|
+
return null;
|
26
|
+
}
|
27
|
+
|
28
|
+
var context = self.parent.getContext();
|
29
|
+
|
30
|
+
if !context? {
|
31
|
+
return null;
|
32
|
+
}
|
33
|
+
|
34
|
+
if context.position == -1 {
|
35
|
+
return {
|
36
|
+
node: context.node,
|
37
|
+
position: context.node.body.indexOf(self)
|
38
|
+
};
|
39
|
+
} else {
|
40
|
+
return context;
|
41
|
+
}
|
42
|
+
};
|
43
|
+
|
44
|
+
self.defineIdentifier = (identifier) -> {
|
45
|
+
self.definedIdentifiers.push(identifier);
|
46
|
+
};
|
47
|
+
|
48
|
+
self.isIdentifierDefined = (name) -> {
|
49
|
+
var defined = false;
|
50
|
+
|
51
|
+
for identifier in self.definedIdentifiers {
|
52
|
+
if identifier.name == name {
|
53
|
+
defined = true;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
return defined || (self.parent && self.parent.isIdentifierDefined(name));
|
58
|
+
};
|
59
|
+
|
60
|
+
self.getDefinedIdentifier = (name) -> {
|
61
|
+
var id;
|
62
|
+
|
63
|
+
for identifier in self.definedIdentifiers {
|
64
|
+
if identifier.name == name {
|
65
|
+
id = identifier;
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
return id ?? (self.parent.getDefinedIdentifier(name) if self.parent else null);
|
70
|
+
};
|
71
|
+
|
72
|
+
self.blockWrap = () -> {
|
73
|
+
if self.type == 'BlockStatement' {
|
74
|
+
return self;
|
75
|
+
}
|
76
|
+
|
77
|
+
var myParent = self.parent;
|
78
|
+
var blockStatement = module.require('./statements/BlockStatement');
|
79
|
+
|
80
|
+
var block = new blockStatement.BlockStatement([self]);
|
81
|
+
block.parent = myParent;
|
82
|
+
|
83
|
+
return block;
|
84
|
+
};
|
85
|
+
}
|
86
|
+
|
87
|
+
Node.prototype.codegen = () -> {
|
88
|
+
if this.codeGenerated {
|
89
|
+
return false;
|
90
|
+
}
|
91
|
+
|
92
|
+
this.codeGenerated = true;
|
93
|
+
return true;
|
94
|
+
};
|
95
|
+
|
96
|
+
Node.setErrorManager = (errorManager) -> {
|
97
|
+
this.errorManager = errorManager;
|
98
|
+
};
|
99
|
+
|
100
|
+
Node.getErrorManager = () -> {
|
101
|
+
return this.errorManager;
|
102
|
+
};
|
103
|
+
|
104
|
+
exports.Node = Node;
|
@@ -0,0 +1,233 @@
|
|
1
|
+
use :node;
|
2
|
+
|
3
|
+
var Node = module.require('./Node').Node;
|
4
|
+
|
5
|
+
fn Parameter(id, defaultValue, splat)
|
6
|
+
extends Node {
|
7
|
+
|
8
|
+
this.type = 'Parameter';
|
9
|
+
this.splat = splat;
|
10
|
+
|
11
|
+
this.id = id;
|
12
|
+
this.id.parent = this;
|
13
|
+
|
14
|
+
this.defaultValue = defaultValue;
|
15
|
+
|
16
|
+
if this.defaultValue? {
|
17
|
+
this.defaultValue.parent = this;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
Parameter.prototype.codegen = () -> {
|
22
|
+
if !super.codegen() {
|
23
|
+
return;
|
24
|
+
}
|
25
|
+
|
26
|
+
this.id = this.id.codegen(false);
|
27
|
+
|
28
|
+
if this.defaultValue? {
|
29
|
+
this.defaultValue = this.defaultValue.codegen();
|
30
|
+
}
|
31
|
+
|
32
|
+
return this;
|
33
|
+
};
|
34
|
+
|
35
|
+
|
36
|
+
Parameter.prototype.hasCallExpression = () -> {
|
37
|
+
return false;
|
38
|
+
};
|
39
|
+
|
40
|
+
Parameter.generateFunctionBody = (func, params, body, defaults) -> {
|
41
|
+
var splatPosition = -1;
|
42
|
+
|
43
|
+
for param, i in params {
|
44
|
+
if param.splat {
|
45
|
+
if splatPosition != -1 {
|
46
|
+
Node.getErrorManager().error({
|
47
|
+
type: "MultipleSplatsDisallowed",
|
48
|
+
message: "multiple splats are disallowed in a function declaration",
|
49
|
+
loc: param.loc
|
50
|
+
});
|
51
|
+
}
|
52
|
+
|
53
|
+
splatPosition = i;
|
54
|
+
}
|
55
|
+
|
56
|
+
param = param.codegen();
|
57
|
+
defaults.push(param.defaultValue);
|
58
|
+
params[i] = param.id;
|
59
|
+
func.defineIdentifier(param.id);
|
60
|
+
}
|
61
|
+
|
62
|
+
if splatPosition != -1 {
|
63
|
+
var declarations = [{
|
64
|
+
"type": "VariableDeclarator",
|
65
|
+
"id": {
|
66
|
+
"type": "Identifier",
|
67
|
+
"name": "__splat"
|
68
|
+
},
|
69
|
+
"init": null
|
70
|
+
}];
|
71
|
+
|
72
|
+
for param, i in params {
|
73
|
+
var init;
|
74
|
+
if i < splatPosition {
|
75
|
+
init = {
|
76
|
+
"type": "MemberExpression",
|
77
|
+
"computed": true,
|
78
|
+
"object": {
|
79
|
+
"type": "Identifier",
|
80
|
+
"name": "arguments"
|
81
|
+
},
|
82
|
+
"property": {
|
83
|
+
"type": "Literal",
|
84
|
+
"value": i
|
85
|
+
}
|
86
|
+
};
|
87
|
+
} else if i == splatPosition {
|
88
|
+
init = {
|
89
|
+
"type": "ConditionalExpression",
|
90
|
+
"test": {
|
91
|
+
"type": "BinaryExpression",
|
92
|
+
"operator": "<=",
|
93
|
+
"left": {
|
94
|
+
"type": "Literal",
|
95
|
+
"value": params.length
|
96
|
+
},
|
97
|
+
"right": {
|
98
|
+
"type": "MemberExpression",
|
99
|
+
"computed": false,
|
100
|
+
"object": {
|
101
|
+
"type": "Identifier",
|
102
|
+
"name": "arguments"
|
103
|
+
},
|
104
|
+
"property": {
|
105
|
+
"type": "Identifier",
|
106
|
+
"name": "length"
|
107
|
+
}
|
108
|
+
}
|
109
|
+
},
|
110
|
+
"consequent": {
|
111
|
+
"type": "CallExpression",
|
112
|
+
"callee": {
|
113
|
+
"type": "MemberExpression",
|
114
|
+
"computed": false,
|
115
|
+
"object": {
|
116
|
+
"type": "MemberExpression",
|
117
|
+
"computed": false,
|
118
|
+
"object": {
|
119
|
+
"type": "ArrayExpression",
|
120
|
+
"elements": []
|
121
|
+
},
|
122
|
+
"property": {
|
123
|
+
"type": "Identifier",
|
124
|
+
"name": "slice"
|
125
|
+
}
|
126
|
+
},
|
127
|
+
"property": {
|
128
|
+
"type": "Identifier",
|
129
|
+
"name": "call"
|
130
|
+
}
|
131
|
+
},
|
132
|
+
"arguments": [{
|
133
|
+
"type": "Identifier",
|
134
|
+
"name": "arguments"
|
135
|
+
}, {
|
136
|
+
"type": "Literal",
|
137
|
+
"value": splatPosition
|
138
|
+
}]
|
139
|
+
},
|
140
|
+
"alternate": {
|
141
|
+
"type": "ArrayExpression",
|
142
|
+
"elements": []
|
143
|
+
}
|
144
|
+
};
|
145
|
+
|
146
|
+
if splatPosition < params.length - 1 {
|
147
|
+
init.consequent.arguments.push({
|
148
|
+
"type": "AssignmentExpression",
|
149
|
+
"operator": "=",
|
150
|
+
"left": {
|
151
|
+
"type": "Identifier",
|
152
|
+
"name": "__splat"
|
153
|
+
},
|
154
|
+
"right": {
|
155
|
+
"type": "BinaryExpression",
|
156
|
+
"operator": "-",
|
157
|
+
"left": {
|
158
|
+
"type": "MemberExpression",
|
159
|
+
"computed": false,
|
160
|
+
"object": {
|
161
|
+
"type": "Identifier",
|
162
|
+
"name": "arguments"
|
163
|
+
},
|
164
|
+
"property": {
|
165
|
+
"type": "Identifier",
|
166
|
+
"name": "length"
|
167
|
+
}
|
168
|
+
},
|
169
|
+
"right": {
|
170
|
+
"type": "Literal",
|
171
|
+
"value": params.length - splatPosition - 1
|
172
|
+
}
|
173
|
+
}
|
174
|
+
});
|
175
|
+
|
176
|
+
init.alternate = {
|
177
|
+
"type": "SequenceExpression",
|
178
|
+
"expressions": [{
|
179
|
+
"type": "AssignmentExpression",
|
180
|
+
"operator": "=",
|
181
|
+
"left": {
|
182
|
+
"type": "Identifier",
|
183
|
+
"name": "__splat"
|
184
|
+
},
|
185
|
+
"right": {
|
186
|
+
"type": "Literal",
|
187
|
+
"value": splatPosition
|
188
|
+
}
|
189
|
+
}, {
|
190
|
+
"type": "ArrayExpression",
|
191
|
+
"elements": []
|
192
|
+
}]
|
193
|
+
};
|
194
|
+
}
|
195
|
+
} else {
|
196
|
+
init = {
|
197
|
+
"type": "MemberExpression",
|
198
|
+
"computed": true,
|
199
|
+
"object": {
|
200
|
+
"type": "Identifier",
|
201
|
+
"name": "arguments"
|
202
|
+
},
|
203
|
+
"property": {
|
204
|
+
"type": "UpdateExpression",
|
205
|
+
"operator": "++",
|
206
|
+
"argument": {
|
207
|
+
"type": "Identifier",
|
208
|
+
"name": "__splat"
|
209
|
+
},
|
210
|
+
"prefix": false
|
211
|
+
}
|
212
|
+
};
|
213
|
+
}
|
214
|
+
|
215
|
+
declarations.push({
|
216
|
+
"type": "VariableDeclarator",
|
217
|
+
"id": param,
|
218
|
+
"init": init
|
219
|
+
});
|
220
|
+
}
|
221
|
+
|
222
|
+
body.body = [{
|
223
|
+
"type": "VariableDeclaration",
|
224
|
+
"codeGenerated": true,
|
225
|
+
"declarations": declarations,
|
226
|
+
"kind": "let"
|
227
|
+
}].concat(body.body);
|
228
|
+
|
229
|
+
params.length = 0;
|
230
|
+
}
|
231
|
+
};
|
232
|
+
|
233
|
+
exports.Parameter = Parameter;
|
@@ -0,0 +1,109 @@
|
|
1
|
+
use :node;
|
2
|
+
|
3
|
+
var Node = module.require('./Node').Node;
|
4
|
+
|
5
|
+
fn Program(body)
|
6
|
+
extends Node {
|
7
|
+
|
8
|
+
this.type = 'Program';
|
9
|
+
this.body = body;
|
10
|
+
|
11
|
+
for statement, i in body {
|
12
|
+
if statement? {
|
13
|
+
statement.parent = this;
|
14
|
+
} else {
|
15
|
+
body[i] = { type: 'EmptyStatement' };
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
this.definedIdentifiers = Program.prototype.generateIdentifiers(
|
20
|
+
'Infinity',
|
21
|
+
'NaN',
|
22
|
+
'eval',
|
23
|
+
'uneval',
|
24
|
+
'isFinite',
|
25
|
+
'isNaN',
|
26
|
+
'parseFloat',
|
27
|
+
'parseInt',
|
28
|
+
'decodeURI',
|
29
|
+
'decodeURIComponent',
|
30
|
+
'encodeURI',
|
31
|
+
'encodeURIComponent',
|
32
|
+
'escape',
|
33
|
+
'unescape',
|
34
|
+
'Object',
|
35
|
+
'Function',
|
36
|
+
'Boolean',
|
37
|
+
'Symbol',
|
38
|
+
'Error',
|
39
|
+
'EvalError',
|
40
|
+
'InternalError',
|
41
|
+
'RangeError',
|
42
|
+
'ReferenceError',
|
43
|
+
'StopIteration',
|
44
|
+
'SyntaxError',
|
45
|
+
'TypeError',
|
46
|
+
'URIError',
|
47
|
+
'Number',
|
48
|
+
'Math',
|
49
|
+
'Date',
|
50
|
+
'String',
|
51
|
+
'RegExp',
|
52
|
+
'Array',
|
53
|
+
'Int8Array',
|
54
|
+
'Uint8Array',
|
55
|
+
'Uint8ClampedArray',
|
56
|
+
'Int16Array',
|
57
|
+
'Uint16Array',
|
58
|
+
'Int32Array',
|
59
|
+
'Uint32Array',
|
60
|
+
'Float32Array',
|
61
|
+
'Float64Array',
|
62
|
+
'Map',
|
63
|
+
'Set',
|
64
|
+
'WeakMap',
|
65
|
+
'WeakSet',
|
66
|
+
'ArrayBuffer',
|
67
|
+
'DataView',
|
68
|
+
'JSON',
|
69
|
+
'Iterator',
|
70
|
+
'Generator',
|
71
|
+
'Promise',
|
72
|
+
'arguments');
|
73
|
+
}
|
74
|
+
|
75
|
+
Program.prototype.codegen = () -> {
|
76
|
+
if !super.codegen() {
|
77
|
+
return;
|
78
|
+
}
|
79
|
+
|
80
|
+
var i = 0;
|
81
|
+
while (i < this.body.length) {
|
82
|
+
var statement = this.body[i];
|
83
|
+
|
84
|
+
if !statement || statement.codeGenerated {
|
85
|
+
i++;
|
86
|
+
continue;
|
87
|
+
}
|
88
|
+
|
89
|
+
if statement.codegen && statement.codegen() {
|
90
|
+
this.body[this.body.indexOf(statement)] = statement;
|
91
|
+
i++;
|
92
|
+
} else {
|
93
|
+
this.body.splice(i, 1);
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
return this;
|
98
|
+
};
|
99
|
+
|
100
|
+
Program.prototype.generateIdentifiers = (identifiers...) -> {
|
101
|
+
return identifiers.map((id) -> {
|
102
|
+
return {
|
103
|
+
"type": "Identifier",
|
104
|
+
"name": id
|
105
|
+
};
|
106
|
+
});
|
107
|
+
};
|
108
|
+
|
109
|
+
exports.Program = Program;
|
@@ -0,0 +1,36 @@
|
|
1
|
+
use :node;
|
2
|
+
|
3
|
+
var Node = module.require('./Node').Node;
|
4
|
+
|
5
|
+
fn Property(key, value, shorthand, method)
|
6
|
+
extends Node {
|
7
|
+
|
8
|
+
this.type = 'Property';
|
9
|
+
this.kind = 'init';
|
10
|
+
this.method = method;
|
11
|
+
this.shorthand = shorthand;
|
12
|
+
this.computed = false;
|
13
|
+
|
14
|
+
this.key = key;
|
15
|
+
this.key.parent = this;
|
16
|
+
|
17
|
+
this.value = value;
|
18
|
+
this.value.parent = this;
|
19
|
+
}
|
20
|
+
|
21
|
+
Property.prototype.codegen = () -> {
|
22
|
+
if !super.codegen() {
|
23
|
+
return;
|
24
|
+
}
|
25
|
+
|
26
|
+
this.key = this.key.codegen(false);
|
27
|
+
this.value = this.value.codegen(this.parent.type != "ObjectPattern");
|
28
|
+
|
29
|
+
return this;
|
30
|
+
};
|
31
|
+
|
32
|
+
Property.prototype.hasCallExpression = () -> {
|
33
|
+
return this.value.hasCallExpression();
|
34
|
+
};
|
35
|
+
|
36
|
+
exports.Property = Property;
|