spider-src 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/Gemfile +7 -0
  4. data/LICENSE.txt +74 -0
  5. data/README.md +37 -0
  6. data/Rakefile +25 -0
  7. data/lib/spider-src/support/spider/.eslintrc +17 -0
  8. data/lib/spider-src/support/spider/.npmignore +9 -0
  9. data/lib/spider-src/support/spider/.travis.yml +7 -0
  10. data/lib/spider-src/support/spider/.yo-rc.json +3 -0
  11. data/lib/spider-src/support/spider/CHANGELOG.md +64 -0
  12. data/lib/spider-src/support/spider/Gruntfile.js +97 -0
  13. data/lib/spider-src/support/spider/Gruntfile.spider +93 -0
  14. data/lib/spider-src/support/spider/LICENSE +201 -0
  15. data/lib/spider-src/support/spider/README.md +50 -0
  16. data/lib/spider-src/support/spider/cli.js +119 -0
  17. data/lib/spider-src/support/spider/lib/ast/CaseClause.js +179 -0
  18. data/lib/spider-src/support/spider/lib/ast/CatchClause.js +26 -0
  19. data/lib/spider-src/support/spider/lib/ast/ExportBatchSpecifier.js +19 -0
  20. data/lib/spider-src/support/spider/lib/ast/ExportSpecifier.js +33 -0
  21. data/lib/spider-src/support/spider/lib/ast/ImportDefaultSpecifier.js +23 -0
  22. data/lib/spider-src/support/spider/lib/ast/ImportNamespaceSpecifier.js +23 -0
  23. data/lib/spider-src/support/spider/lib/ast/ImportSpecifier.js +40 -0
  24. data/lib/spider-src/support/spider/lib/ast/Node.js +93 -0
  25. data/lib/spider-src/support/spider/lib/ast/Parameter.js +229 -0
  26. data/lib/spider-src/support/spider/lib/ast/Program.js +58 -0
  27. data/lib/spider-src/support/spider/lib/ast/Property.js +32 -0
  28. data/lib/spider-src/support/spider/lib/ast/Range.js +257 -0
  29. data/lib/spider-src/support/spider/lib/ast/VariableDeclarator.js +29 -0
  30. data/lib/spider-src/support/spider/lib/ast/expressions/ArrayExpression.js +41 -0
  31. data/lib/spider-src/support/spider/lib/ast/expressions/ArrayPattern.js +45 -0
  32. data/lib/spider-src/support/spider/lib/ast/expressions/AssignmentExpression.js +29 -0
  33. data/lib/spider-src/support/spider/lib/ast/expressions/BinaryExpression.js +104 -0
  34. data/lib/spider-src/support/spider/lib/ast/expressions/CallExpression.js +139 -0
  35. data/lib/spider-src/support/spider/lib/ast/expressions/ConditionalExpression.js +31 -0
  36. data/lib/spider-src/support/spider/lib/ast/expressions/CurryCallExpression.js +102 -0
  37. data/lib/spider-src/support/spider/lib/ast/expressions/ExistentialExpression.js +83 -0
  38. data/lib/spider-src/support/spider/lib/ast/expressions/ForInExpression.js +116 -0
  39. data/lib/spider-src/support/spider/lib/ast/expressions/FunctionExpression.js +157 -0
  40. data/lib/spider-src/support/spider/lib/ast/expressions/InExpression.js +99 -0
  41. data/lib/spider-src/support/spider/lib/ast/expressions/LogicalExpression.js +50 -0
  42. data/lib/spider-src/support/spider/lib/ast/expressions/MemberExpression.js +43 -0
  43. data/lib/spider-src/support/spider/lib/ast/expressions/NewExpression.js +46 -0
  44. data/lib/spider-src/support/spider/lib/ast/expressions/NullCheckCallExpression.js +132 -0
  45. data/lib/spider-src/support/spider/lib/ast/expressions/NullCoalescingExpression.js +114 -0
  46. data/lib/spider-src/support/spider/lib/ast/expressions/NullPropagatingExpression.js +161 -0
  47. data/lib/spider-src/support/spider/lib/ast/expressions/ObjectExpression.js +39 -0
  48. data/lib/spider-src/support/spider/lib/ast/expressions/ObjectPattern.js +49 -0
  49. data/lib/spider-src/support/spider/lib/ast/expressions/RangeMemberExpression.js +157 -0
  50. data/lib/spider-src/support/spider/lib/ast/expressions/SplatExpression.js +48 -0
  51. data/lib/spider-src/support/spider/lib/ast/expressions/SuperExpression.js +170 -0
  52. data/lib/spider-src/support/spider/lib/ast/expressions/ThisExpression.js +22 -0
  53. data/lib/spider-src/support/spider/lib/ast/expressions/UnaryExpression.js +147 -0
  54. data/lib/spider-src/support/spider/lib/ast/expressions/UpdateExpression.js +26 -0
  55. data/lib/spider-src/support/spider/lib/ast/literals/BooleanLiteral.js +24 -0
  56. data/lib/spider-src/support/spider/lib/ast/literals/Identifier.js +60 -0
  57. data/lib/spider-src/support/spider/lib/ast/literals/NullLiteral.js +24 -0
  58. data/lib/spider-src/support/spider/lib/ast/literals/NumberLiteral.js +24 -0
  59. data/lib/spider-src/support/spider/lib/ast/literals/RegularExpressionLiteral.js +25 -0
  60. data/lib/spider-src/support/spider/lib/ast/literals/StringLiteral.js +90 -0
  61. data/lib/spider-src/support/spider/lib/ast/literals/UndefinedLiteral.js +30 -0
  62. data/lib/spider-src/support/spider/lib/ast/statements/BlockStatement.js +47 -0
  63. data/lib/spider-src/support/spider/lib/ast/statements/BreakStatement.js +19 -0
  64. data/lib/spider-src/support/spider/lib/ast/statements/ContinueStatement.js +19 -0
  65. data/lib/spider-src/support/spider/lib/ast/statements/DebuggerStatement.js +19 -0
  66. data/lib/spider-src/support/spider/lib/ast/statements/DoWhileStatement.js +25 -0
  67. data/lib/spider-src/support/spider/lib/ast/statements/ExportDeclarationStatement.js +51 -0
  68. data/lib/spider-src/support/spider/lib/ast/statements/ExpressionStatement.js +22 -0
  69. data/lib/spider-src/support/spider/lib/ast/statements/FallthroughStatement.js +74 -0
  70. data/lib/spider-src/support/spider/lib/ast/statements/ForInStatement.js +79 -0
  71. data/lib/spider-src/support/spider/lib/ast/statements/ForOfStatement.js +98 -0
  72. data/lib/spider-src/support/spider/lib/ast/statements/ForStatement.js +43 -0
  73. data/lib/spider-src/support/spider/lib/ast/statements/FunctionDeclarationStatement.js +104 -0
  74. data/lib/spider-src/support/spider/lib/ast/statements/GoStatement.js +41 -0
  75. data/lib/spider-src/support/spider/lib/ast/statements/IfStatement.js +32 -0
  76. data/lib/spider-src/support/spider/lib/ast/statements/ImportDeclarationStatement.js +40 -0
  77. data/lib/spider-src/support/spider/lib/ast/statements/PushStatement.js +37 -0
  78. data/lib/spider-src/support/spider/lib/ast/statements/ReturnStatement.js +26 -0
  79. data/lib/spider-src/support/spider/lib/ast/statements/SwitchStatement.js +159 -0
  80. data/lib/spider-src/support/spider/lib/ast/statements/ThrowStatement.js +22 -0
  81. data/lib/spider-src/support/spider/lib/ast/statements/TryStatement.js +36 -0
  82. data/lib/spider-src/support/spider/lib/ast/statements/UntilStatement.js +31 -0
  83. data/lib/spider-src/support/spider/lib/ast/statements/UseStatement.js +49 -0
  84. data/lib/spider-src/support/spider/lib/ast/statements/VariableDeclarationStatement.js +36 -0
  85. data/lib/spider-src/support/spider/lib/ast/statements/WhileStatement.js +25 -0
  86. data/lib/spider-src/support/spider/lib/ast.js +16 -0
  87. data/lib/spider-src/support/spider/lib/parser.js +14878 -0
  88. data/lib/spider-src/support/spider/lib/spider.js +217 -0
  89. data/lib/spider-src/support/spider/package.json +61 -0
  90. data/lib/spider-src/support/spider/spider-script.js +6 -0
  91. data/lib/spider-src/support/spider/src/ast/CaseClause.spider +179 -0
  92. data/lib/spider-src/support/spider/src/ast/CatchClause.spider +30 -0
  93. data/lib/spider-src/support/spider/src/ast/ExportBatchSpecifier.spider +19 -0
  94. data/lib/spider-src/support/spider/src/ast/ExportSpecifier.spider +37 -0
  95. data/lib/spider-src/support/spider/src/ast/ImportDefaultSpecifier.spider +25 -0
  96. data/lib/spider-src/support/spider/src/ast/ImportNamespaceSpecifier.spider +25 -0
  97. data/lib/spider-src/support/spider/src/ast/ImportSpecifier.spider +44 -0
  98. data/lib/spider-src/support/spider/src/ast/Node.spider +104 -0
  99. data/lib/spider-src/support/spider/src/ast/Parameter.spider +233 -0
  100. data/lib/spider-src/support/spider/src/ast/Program.spider +109 -0
  101. data/lib/spider-src/support/spider/src/ast/Property.spider +36 -0
  102. data/lib/spider-src/support/spider/src/ast/Range.spider +291 -0
  103. data/lib/spider-src/support/spider/src/ast/VariableDeclarator.spider +33 -0
  104. data/lib/spider-src/support/spider/src/ast/expressions/ArrayExpression.spider +32 -0
  105. data/lib/spider-src/support/spider/src/ast/expressions/ArrayPattern.spider +37 -0
  106. data/lib/spider-src/support/spider/src/ast/expressions/AssignmentExpression.spider +34 -0
  107. data/lib/spider-src/support/spider/src/ast/expressions/BinaryExpression.spider +125 -0
  108. data/lib/spider-src/support/spider/src/ast/expressions/CallExpression.spider +149 -0
  109. data/lib/spider-src/support/spider/src/ast/expressions/ConditionalExpression.spider +34 -0
  110. data/lib/spider-src/support/spider/src/ast/expressions/CurryCallExpression.spider +109 -0
  111. data/lib/spider-src/support/spider/src/ast/expressions/ExistentialExpression.spider +102 -0
  112. data/lib/spider-src/support/spider/src/ast/expressions/ForInExpression.spider +140 -0
  113. data/lib/spider-src/support/spider/src/ast/expressions/FunctionExpression.spider +183 -0
  114. data/lib/spider-src/support/spider/src/ast/expressions/InExpression.spider +114 -0
  115. data/lib/spider-src/support/spider/src/ast/expressions/LogicalExpression.spider +62 -0
  116. data/lib/spider-src/support/spider/src/ast/expressions/MemberExpression.spider +57 -0
  117. data/lib/spider-src/support/spider/src/ast/expressions/NewExpression.spider +40 -0
  118. data/lib/spider-src/support/spider/src/ast/expressions/NullCheckCallExpression.spider +151 -0
  119. data/lib/spider-src/support/spider/src/ast/expressions/NullCoalescingExpression.spider +151 -0
  120. data/lib/spider-src/support/spider/src/ast/expressions/NullPropagatingExpression.spider +190 -0
  121. data/lib/spider-src/support/spider/src/ast/expressions/ObjectExpression.spider +30 -0
  122. data/lib/spider-src/support/spider/src/ast/expressions/ObjectPattern.spider +42 -0
  123. data/lib/spider-src/support/spider/src/ast/expressions/RangeMemberExpression.spider +179 -0
  124. data/lib/spider-src/support/spider/src/ast/expressions/SplatExpression.spider +49 -0
  125. data/lib/spider-src/support/spider/src/ast/expressions/SuperExpression.spider +235 -0
  126. data/lib/spider-src/support/spider/src/ast/expressions/ThisExpression.spider +21 -0
  127. data/lib/spider-src/support/spider/src/ast/expressions/UnaryExpression.spider +158 -0
  128. data/lib/spider-src/support/spider/src/ast/expressions/UpdateExpression.spider +28 -0
  129. data/lib/spider-src/support/spider/src/ast/literals/BooleanLiteral.spider +23 -0
  130. data/lib/spider-src/support/spider/src/ast/literals/Identifier.spider +68 -0
  131. data/lib/spider-src/support/spider/src/ast/literals/NullLiteral.spider +23 -0
  132. data/lib/spider-src/support/spider/src/ast/literals/NumberLiteral.spider +23 -0
  133. data/lib/spider-src/support/spider/src/ast/literals/RegularExpressionLiteral.spider +24 -0
  134. data/lib/spider-src/support/spider/src/ast/literals/StringLiteral.spider +91 -0
  135. data/lib/spider-src/support/spider/src/ast/literals/UndefinedLiteral.spider +30 -0
  136. data/lib/spider-src/support/spider/src/ast/statements/BlockStatement.spider +45 -0
  137. data/lib/spider-src/support/spider/src/ast/statements/BreakStatement.spider +19 -0
  138. data/lib/spider-src/support/spider/src/ast/statements/ContinueStatement.spider +19 -0
  139. data/lib/spider-src/support/spider/src/ast/statements/DebuggerStatement.spider +19 -0
  140. data/lib/spider-src/support/spider/src/ast/statements/DoWhileStatement.spider +28 -0
  141. data/lib/spider-src/support/spider/src/ast/statements/ExportDeclarationStatement.spider +46 -0
  142. data/lib/spider-src/support/spider/src/ast/statements/ExpressionStatement.spider +22 -0
  143. data/lib/spider-src/support/spider/src/ast/statements/FallthroughStatement.spider +85 -0
  144. data/lib/spider-src/support/spider/src/ast/statements/ForInStatement.spider +92 -0
  145. data/lib/spider-src/support/spider/src/ast/statements/ForOfStatement.spider +117 -0
  146. data/lib/spider-src/support/spider/src/ast/statements/ForStatement.spider +51 -0
  147. data/lib/spider-src/support/spider/src/ast/statements/FunctionDeclarationStatement.spider +115 -0
  148. data/lib/spider-src/support/spider/src/ast/statements/GoStatement.spider +44 -0
  149. data/lib/spider-src/support/spider/src/ast/statements/IfStatement.spider +38 -0
  150. data/lib/spider-src/support/spider/src/ast/statements/ImportDeclarationStatement.spider +33 -0
  151. data/lib/spider-src/support/spider/src/ast/statements/PushStatement.spider +40 -0
  152. data/lib/spider-src/support/spider/src/ast/statements/ReturnStatement.spider +28 -0
  153. data/lib/spider-src/support/spider/src/ast/statements/SwitchStatement.spider +161 -0
  154. data/lib/spider-src/support/spider/src/ast/statements/ThrowStatement.spider +23 -0
  155. data/lib/spider-src/support/spider/src/ast/statements/TryStatement.spider +42 -0
  156. data/lib/spider-src/support/spider/src/ast/statements/UntilStatement.spider +36 -0
  157. data/lib/spider-src/support/spider/src/ast/statements/UseStatement.spider +62 -0
  158. data/lib/spider-src/support/spider/src/ast/statements/VariableDeclarationStatement.spider +34 -0
  159. data/lib/spider-src/support/spider/src/ast/statements/WhileStatement.spider +28 -0
  160. data/lib/spider-src/support/spider/src/ast.spider +80 -0
  161. data/lib/spider-src/support/spider/src/spider.pegjs +1434 -0
  162. data/lib/spider-src/support/spider/src/spider.spider +276 -0
  163. data/lib/spider-src/support/spider/test/spider_test.js +1787 -0
  164. data/lib/spider-src/version.rb +5 -0
  165. data/lib/spider-src.rb +37 -0
  166. data/spider-src.gemspec +24 -0
  167. data/test/test_spider_src.rb +33 -0
  168. metadata +225 -0
@@ -0,0 +1,28 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn UpdateExpression(argument, operator, prefix)
6
+ extends Node {
7
+
8
+ this.type = 'UpdateExpression';
9
+ this.operator = operator;
10
+ this.prefix = prefix;
11
+
12
+ this.argument = argument;
13
+ this.argument.parent = this;
14
+ }
15
+
16
+ UpdateExpression.prototype.codegen = () -> {
17
+ if !super.codegen() {
18
+ return;
19
+ }
20
+
21
+ return this;
22
+ };
23
+
24
+ UpdateExpression.prototype.hasCallExpression = () -> {
25
+ return this.argument != null && this.left.hasCallExpression();
26
+ };
27
+
28
+ exports.UpdateExpression = UpdateExpression;
@@ -0,0 +1,23 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn BooleanLiteral(text)
6
+ extends Node {
7
+
8
+ this.type = 'Literal';
9
+ this.value = text == "true";
10
+ this.raw = text;
11
+ }
12
+
13
+ BooleanLiteral.prototype.codegen = () -> {
14
+ if !super.codegen() {
15
+ return;
16
+ }
17
+
18
+ return this;
19
+ };
20
+
21
+ BooleanLiteral.prototype.hasCallExpression = () -> false;
22
+
23
+ exports.BooleanLiteral = BooleanLiteral;
@@ -0,0 +1,68 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn Identifier(name)
6
+ extends Node {
7
+
8
+ this.type = 'Identifier';
9
+ this.global = false;
10
+
11
+ ::Object.defineProperty(this, 'name', {
12
+ value: name,
13
+ enumerable: true
14
+ });
15
+ }
16
+
17
+ Identifier.prototype.codegen = (undefinedCheck = true) -> {
18
+ if !super.codegen() {
19
+ return;
20
+ }
21
+
22
+ // Compile-time undefined check
23
+ if (undefinedCheck && !this.global) {
24
+ // If this is not a new identifier, ...
25
+ if !(this.parent?.type in ["FunctionDeclaration", "VariableDeclarator"] &&
26
+ this.parent.id == this) {
27
+ // ... and this identifier is undefined, raise an error
28
+ if (!this.parent.isIdentifierDefined(this.name)) {
29
+ Node.getErrorManager().error({
30
+ type: "UndefinedIdentifier",
31
+ identifier: this.name,
32
+ message: "undefined " + this.name,
33
+ loc: this.loc
34
+ });
35
+ }
36
+ } else {
37
+ // If this is a new identifier, and this identifier
38
+ // is already defined, raise an error
39
+ if (this.parent.isIdentifierDefined(this.name)) {
40
+ Node.getErrorManager().error({
41
+ type: "AlreadyDefinedIdentifier",
42
+ identifier: this.name,
43
+ message: this.name + " is already defined",
44
+ loc: this.loc
45
+ });
46
+ } else {
47
+ // otherwise, define this identifier
48
+ this.parent.getContext().node.defineIdentifier(this);
49
+ }
50
+ }
51
+ }
52
+
53
+ return this;
54
+ };
55
+
56
+ Identifier.prototype.hasCallExpression = () -> false;
57
+
58
+ Identifier.prototype.asGlobal = () -> {
59
+ this.global = true;
60
+ return this;
61
+ };
62
+
63
+ Identifier.prototype.asPredefinedCollection = () -> {
64
+ this.predefinedCollection = true;
65
+ return this;
66
+ };
67
+
68
+ exports.Identifier = Identifier;
@@ -0,0 +1,23 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn NullLiteral()
6
+ extends Node {
7
+
8
+ this.type = 'Literal';
9
+ this.value = null;
10
+ this.raw = "null";
11
+ }
12
+
13
+ NullLiteral.prototype.codegen = () -> {
14
+ if !super.codegen() {
15
+ return;
16
+ }
17
+
18
+ return this;
19
+ };
20
+
21
+ NullLiteral.prototype.hasCallExpression = () -> false;
22
+
23
+ exports.NullLiteral = NullLiteral;
@@ -0,0 +1,23 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn NumberLiteral(text)
6
+ extends Node {
7
+
8
+ this.type = 'Literal';
9
+ this.value = ::Number(text);
10
+ this.raw = text;
11
+ }
12
+
13
+ NumberLiteral.prototype.codegen = () -> {
14
+ if !super.codegen() {
15
+ return;
16
+ }
17
+
18
+ return this;
19
+ };
20
+
21
+ NumberLiteral.prototype.hasCallExpression = () -> false;
22
+
23
+ exports.NumberLiteral = NumberLiteral;
@@ -0,0 +1,24 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn RegularExpressionLiteral(pattern, flags)
6
+ extends Node {
7
+
8
+ this.type = 'Literal';
9
+ this.pattern = pattern;
10
+ this.flags = flags;
11
+ }
12
+
13
+ RegularExpressionLiteral.prototype.codegen = () -> {
14
+ if !super.codegen() {
15
+ return;
16
+ }
17
+
18
+ this.value = new ::RegExp(this.pattern, this.flags);
19
+ return this;
20
+ };
21
+
22
+ RegularExpressionLiteral.prototype.hasCallExpression = () -> false;
23
+
24
+ exports.RegularExpressionLiteral = RegularExpressionLiteral;
@@ -0,0 +1,91 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn StringLiteral(chars, column)
6
+ extends Node {
7
+
8
+ this.type = 'StringLiteral';
9
+ this.chars = chars;
10
+ this.column = column;
11
+ }
12
+
13
+ StringLiteral.prototype.codegen = () -> {
14
+ if !super.codegen() {
15
+ return;
16
+ }
17
+
18
+ var elements = [];
19
+
20
+ for value in this.chars {
21
+ var lastElement;
22
+
23
+ if typeof value == 'string' {
24
+ lastElement = elements[elements.length - 1];
25
+ if lastElement?.type == 'Literal' {
26
+ lastElement.value += value;
27
+ } else {
28
+ elements.push({
29
+ type: 'Literal',
30
+ value: value
31
+ });
32
+ }
33
+ } else if value?.type == "StringLiteralNewLine" {
34
+ lastElement = elements[elements.length - 1];
35
+ if lastElement?.type == 'Literal' {
36
+ lastElement.value += value.toString(this.column - 1);
37
+ } else {
38
+ elements.push({
39
+ type: 'Literal',
40
+ value: value.toString(this.column - 1)
41
+ });
42
+ }
43
+ } else {
44
+ value.parent = this;
45
+ elements.push(value.codegen());
46
+ }
47
+ }
48
+
49
+ if elements.length == 0 {
50
+ return {
51
+ "type": "Literal",
52
+ "value": ""
53
+ };
54
+ } else if elements.length == 1 {
55
+ return elements[0];
56
+ }
57
+
58
+ var reduced = elements.reduce((left, right) -> {
59
+ return {
60
+ type: 'BinaryExpression',
61
+ operator: '+',
62
+ left: left,
63
+ right: right
64
+ };
65
+ });
66
+
67
+ this.type = reduced.type;
68
+ this.operator = reduced.operator;
69
+ this.left = reduced.left;
70
+ this.right = reduced.right;
71
+
72
+ return this;
73
+ };
74
+
75
+ StringLiteral.prototype.hasCallExpression = () -> false;
76
+
77
+ StringLiteral.NewLine = fn (text) {
78
+ this.type = "StringLiteralNewLine";
79
+
80
+ this.toString = (column) -> {
81
+ var t = text.replace(/\r\n/g, '').replace(/\t/g, ' ');
82
+
83
+ if t.length < column {
84
+ return '';
85
+ }
86
+
87
+ return t.substring(column);
88
+ };
89
+ };
90
+
91
+ exports.StringLiteral = StringLiteral;
@@ -0,0 +1,30 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn UndefinedLiteral()
6
+ extends Node {
7
+
8
+ this.type = 'UndefinedLiteral';
9
+ }
10
+
11
+ UndefinedLiteral.prototype.codegen = () -> {
12
+ if !super.codegen() {
13
+ return;
14
+ }
15
+
16
+ this.type = "UnaryExpression";
17
+ this.operator = "void";
18
+ this.argument = {
19
+ "type": "Literal",
20
+ "value": 0,
21
+ "raw": "0"
22
+ };
23
+ this.prefix = true;
24
+
25
+ return this;
26
+ };
27
+
28
+ UndefinedLiteral.prototype.hasCallExpression = () -> false;
29
+
30
+ exports.UndefinedLiteral = UndefinedLiteral;
@@ -0,0 +1,45 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn BlockStatement(body)
6
+ extends Node {
7
+
8
+ this.type = 'BlockStatement';
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
+
20
+ BlockStatement.prototype.codegen = () -> {
21
+ if !super.codegen() {
22
+ return;
23
+ }
24
+
25
+ var i = 0;
26
+ while (i < this.body.length) {
27
+ var statement = this.body[i];
28
+
29
+ if !statement || statement.codeGenerated {
30
+ i++;
31
+ continue;
32
+ }
33
+
34
+ if statement.codegen?() {
35
+ this.body[this.body.indexOf(statement)] = statement;
36
+ i++;
37
+ } else {
38
+ this.body.splice(i, 1);
39
+ }
40
+ }
41
+
42
+ return this;
43
+ };
44
+
45
+ exports.BlockStatement = BlockStatement;
@@ -0,0 +1,19 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn BreakStatement()
6
+ extends Node {
7
+
8
+ this.type = 'BreakStatement';
9
+ }
10
+
11
+ BreakStatement.prototype.codegen = () -> {
12
+ if !super.codegen() {
13
+ return;
14
+ }
15
+
16
+ return this;
17
+ };
18
+
19
+ exports.BreakStatement = BreakStatement;
@@ -0,0 +1,19 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn ContinueStatement()
6
+ extends Node {
7
+
8
+ this.type = 'ContinueStatement';
9
+ }
10
+
11
+ ContinueStatement.prototype.codegen = () -> {
12
+ if !super.codegen() {
13
+ return;
14
+ }
15
+
16
+ return this;
17
+ };
18
+
19
+ exports.ContinueStatement = ContinueStatement;
@@ -0,0 +1,19 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn DebuggerStatement()
6
+ extends Node {
7
+
8
+ this.type = 'DebuggerStatement';
9
+ }
10
+
11
+ DebuggerStatement.prototype.codegen = () -> {
12
+ if !super.codegen() {
13
+ return;
14
+ }
15
+
16
+ return this;
17
+ };
18
+
19
+ exports.DebuggerStatement = DebuggerStatement;
@@ -0,0 +1,28 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn DoWhileStatement(test, body)
6
+ extends Node {
7
+
8
+ this.type = 'DoWhileStatement';
9
+
10
+ this.test = test;
11
+ this.test.parent = this;
12
+
13
+ this.body = body;
14
+ this.body.parent = this;
15
+ }
16
+
17
+ DoWhileStatement.prototype.codegen = () -> {
18
+ if !super.codegen() {
19
+ return;
20
+ }
21
+
22
+ this.test = this.test.codegen();
23
+ this.body = this.body.blockWrap().codegen();
24
+
25
+ return this;
26
+ };
27
+
28
+ exports.DoWhileStatement = DoWhileStatement;
@@ -0,0 +1,46 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn ExportDeclarationStatement(specifiers, source, declaration, isDefault)
6
+ extends Node {
7
+
8
+ this.type = "ExportDeclaration";
9
+ this['default'] = isDefault;
10
+
11
+ this.specifiers = specifiers;
12
+ if specifiers? {
13
+ for specifier in this.specifiers {
14
+ specifier.parent = this;
15
+ }
16
+ }
17
+
18
+ this.source = source;
19
+ if source? {
20
+ this.source.parent = this;
21
+ }
22
+
23
+ this.declaration = declaration;
24
+ if declaration? {
25
+ this.declaration.parent = this;
26
+ }
27
+ }
28
+
29
+ ExportDeclarationStatement.prototype.codegen = () -> {
30
+ if !super.codegen() {
31
+ return;
32
+ }
33
+
34
+ if this.specifiers? {
35
+ for specifier, i in this.specifiers {
36
+ this.specifiers[i] = specifier.codegen();
37
+ }
38
+ }
39
+
40
+ this.source = this.source?.codegen();
41
+ this.declaration = this.declaration?.codegen();
42
+
43
+ return this;
44
+ };
45
+
46
+ exports.ExportDeclarationStatement = ExportDeclarationStatement;
@@ -0,0 +1,22 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn ExpressionStatement(expression)
6
+ extends Node {
7
+
8
+ this.type = 'ExpressionStatement';
9
+ this.expression = expression;
10
+ this.expression.parent = this;
11
+ }
12
+
13
+ ExpressionStatement.prototype.codegen = () -> {
14
+ if !super.codegen() {
15
+ return;
16
+ }
17
+
18
+ this.expression = this.expression.codegen();
19
+ return this;
20
+ };
21
+
22
+ exports.ExpressionStatement = ExpressionStatement;
@@ -0,0 +1,85 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn FallthroughStatement()
6
+ extends Node {
7
+
8
+ this.type = 'FallthroughStatement';
9
+ }
10
+
11
+ FallthroughStatement.prototype.codegen = () -> {
12
+ if !super.codegen() {
13
+ return;
14
+ }
15
+
16
+ var parent = this.parent;
17
+ var iterations = 0;
18
+
19
+ while parent? and !parent.switchCase {
20
+ parent = parent.parent;
21
+ iterations++;
22
+ }
23
+
24
+ if parent? {
25
+ parent.fallthrough = true;
26
+ } else {
27
+ Node.getErrorManager().error({
28
+ type: "InvalidFallthroughContext",
29
+ message: "fallthrough statement is only allowed in a switch case clause.",
30
+ loc: this.loc
31
+ });
32
+ }
33
+
34
+ var switchStatement = parent.parent;
35
+
36
+ if !switchStatement.fallthroughId {
37
+ switchStatement.fallthroughId = {
38
+ "type": "Identifier",
39
+ "name": FallthroughStatement.getNextVariableName()
40
+ };
41
+ }
42
+
43
+ switchStatement.branchFallthrough = true;
44
+
45
+ parent.body.body = [{
46
+ "type": "ExpressionStatement",
47
+ "codeGenerated": true,
48
+ "expression": {
49
+ "type": "AssignmentExpression",
50
+ "operator": "=",
51
+ "left": switchStatement.fallthroughId,
52
+ "right": {
53
+ "type": "Literal",
54
+ "value": 2
55
+ }
56
+ }
57
+ }].concat(parent.body.body);
58
+
59
+ this.type = "ExpressionStatement";
60
+ this.expression = {
61
+ "type": "AssignmentExpression",
62
+ "operator": "=",
63
+ "left": switchStatement.fallthroughId,
64
+ "right": {
65
+ "type": "Literal",
66
+ "value": 1
67
+ }
68
+ };
69
+
70
+ return this;
71
+ };
72
+
73
+ FallthroughStatement.getNextVariableName = () -> {
74
+ if (!this.fallthroughIndex?) {
75
+ this.fallthroughIndex = 0;
76
+ }
77
+
78
+ return "fallthrough" + this.fallthroughIndex++;
79
+ };
80
+
81
+ FallthroughStatement.resetVariableNames = () -> {
82
+ this.fallthroughIndex = 0;
83
+ };
84
+
85
+ exports.FallthroughStatement = FallthroughStatement;
@@ -0,0 +1,92 @@
1
+ use :node;
2
+
3
+ var Node = module.require('../Node').Node;
4
+
5
+ fn ForInStatement(item, index, array, body)
6
+ extends Node {
7
+
8
+ this.type = 'ForInStatement';
9
+
10
+ this.item = item;
11
+ this.item.parent = this;
12
+
13
+ this.index = index;
14
+ if this.index? {
15
+ this.index.parent = this;
16
+ }
17
+
18
+ this.array = array;
19
+ this.array.parent = this;
20
+
21
+ this.body = body;
22
+ this.body.parent = this;
23
+ }
24
+
25
+ ForInStatement.prototype.codegen = () -> {
26
+ if !super.codegen() {
27
+ return;
28
+ }
29
+
30
+ this.item = this.item.codegen(false);
31
+
32
+ if this.index? {
33
+ var context = this.getContext();
34
+ this.index = this.index.codegen(false);
35
+
36
+ context.node.body.splice(context.position, 0, {
37
+ "type": "VariableDeclaration",
38
+ "declarations": [{
39
+ "type": "VariableDeclarator",
40
+ "id": this.index,
41
+ "init": {
42
+ "type": "Literal",
43
+ "value": 0
44
+ }
45
+ }],
46
+ "kind": "let"
47
+ });
48
+ }
49
+
50
+ if !this.array.codeGenerated {
51
+ this.array = this.array.codegen();
52
+ }
53
+
54
+ this.body = this.body.blockWrap();
55
+ this.body.defineIdentifier(this.item);
56
+
57
+ if this.index? {
58
+ this.body.defineIdentifier(this.index);
59
+ }
60
+
61
+ this.body = this.body.codegen();
62
+
63
+ if this.index? {
64
+ this.body.body.push({
65
+ "type": "ExpressionStatement",
66
+ "codeGenerated": true,
67
+ "expression": {
68
+ "type": "UpdateExpression",
69
+ "operator": "++",
70
+ "argument": this.index,
71
+ "prefix": false
72
+ }
73
+ });
74
+ }
75
+
76
+ this.type = "ForOfStatement";
77
+ this.right = this.array;
78
+ this.left = {
79
+ "type": "VariableDeclaration",
80
+ "declarations": [{
81
+ "type": "VariableDeclarator",
82
+ "id": this.item,
83
+ "init": null
84
+ }],
85
+ "kind": "let"
86
+ };
87
+ this.each = false;
88
+
89
+ return this;
90
+ };
91
+
92
+ exports.ForInStatement = ForInStatement;