coffee-script 0.3.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +2 -2
- data/README.md +15 -0
- data/lib/coffee-script.rb +1 -21
- data/lib/coffee_script.rb +31 -0
- metadata +30 -46
- data/README +0 -41
- data/bin/coffee +0 -5
- data/coffee-script.gemspec +0 -27
- data/examples/blocks.coffee +0 -57
- data/examples/code.coffee +0 -173
- data/examples/poignant.coffee +0 -186
- data/examples/potion.coffee +0 -205
- data/examples/underscore.coffee +0 -603
- data/extras/CoffeeScript.tmbundle/Preferences/CoffeeScript.tmPreferences +0 -24
- data/extras/CoffeeScript.tmbundle/Syntaxes/CoffeeScript.tmLanguage +0 -361
- data/extras/CoffeeScript.tmbundle/info.plist +0 -10
- data/extras/EXTRAS +0 -20
- data/extras/coffee.vim +0 -111
- data/lib/coffee_script/coffee-script.js +0 -50
- data/lib/coffee_script/command_line.rb +0 -235
- data/lib/coffee_script/grammar.y +0 -481
- data/lib/coffee_script/lexer.js +0 -363
- data/lib/coffee_script/lexer.rb +0 -272
- data/lib/coffee_script/narwhal/coffee-script.js +0 -96
- data/lib/coffee_script/nodes.js +0 -443
- data/lib/coffee_script/nodes.rb +0 -1050
- data/lib/coffee_script/parse_error.rb +0 -29
- data/lib/coffee_script/parser.js +0 -477
- data/lib/coffee_script/parser.rb +0 -2611
- data/lib/coffee_script/repl.js +0 -33
- data/lib/coffee_script/rewriter.js +0 -377
- data/lib/coffee_script/rewriter.rb +0 -289
- data/lib/coffee_script/runner.js +0 -11
- data/lib/coffee_script/scope.js +0 -73
- data/lib/coffee_script/scope.rb +0 -91
- data/lib/coffee_script/value.rb +0 -64
- data/package.json +0 -8
@@ -1,96 +0,0 @@
|
|
1
|
-
(function(){
|
2
|
-
var File, OS, Readline, checkForErrors, coffeePath, factories, loader, puts;
|
3
|
-
// The Narwhal-compatibility wrapper for CoffeeScript.
|
4
|
-
// Require external dependencies.
|
5
|
-
OS = require('os');
|
6
|
-
File = require('file');
|
7
|
-
Readline = require('readline');
|
8
|
-
// The path to the CoffeeScript Compiler.
|
9
|
-
coffeePath = File.path(module.path).dirname().dirname().dirname().dirname().join('bin', 'coffee');
|
10
|
-
// Our general-purpose error handler.
|
11
|
-
checkForErrors = function checkForErrors(coffeeProcess) {
|
12
|
-
if (coffeeProcess.wait() === 0) {
|
13
|
-
return true;
|
14
|
-
}
|
15
|
-
system.stderr.print(coffeeProcess.stderr.read());
|
16
|
-
throw new Error("CoffeeScript compile error");
|
17
|
-
};
|
18
|
-
// Alias print to "puts", for Node.js compatibility:
|
19
|
-
puts = print;
|
20
|
-
// Run a simple REPL, round-tripping to the CoffeeScript compiler for every
|
21
|
-
// command.
|
22
|
-
exports.run = function run(args) {
|
23
|
-
var __a, __b, i, path, result;
|
24
|
-
if (args.length) {
|
25
|
-
__a = args;
|
26
|
-
for (i = 0; i < __a.length; i++) {
|
27
|
-
path = __a[i];
|
28
|
-
exports.evalCS(File.read(path));
|
29
|
-
delete args[i];
|
30
|
-
}
|
31
|
-
return true;
|
32
|
-
}
|
33
|
-
__b = [];
|
34
|
-
while (true) {
|
35
|
-
__b.push((function() {
|
36
|
-
try {
|
37
|
-
system.stdout.write('coffee> ').flush();
|
38
|
-
result = exports.evalCS(Readline.readline(), ['--globals']);
|
39
|
-
if (result !== undefined) {
|
40
|
-
return print(result);
|
41
|
-
}
|
42
|
-
} catch (e) {
|
43
|
-
return print(e);
|
44
|
-
}
|
45
|
-
}).call(this));
|
46
|
-
}
|
47
|
-
return __b;
|
48
|
-
};
|
49
|
-
// Compile a given CoffeeScript file into JavaScript.
|
50
|
-
exports.compileFile = function compileFile(path) {
|
51
|
-
var coffee;
|
52
|
-
coffee = OS.popen([coffeePath, "--print", "--no-wrap", path]);
|
53
|
-
checkForErrors(coffee);
|
54
|
-
return coffee.stdout.read();
|
55
|
-
};
|
56
|
-
// Compile a string of CoffeeScript into JavaScript.
|
57
|
-
exports.compile = function compile(source, flags) {
|
58
|
-
var coffee;
|
59
|
-
coffee = OS.popen([coffeePath, "--eval", "--no-wrap"].concat(flags || []));
|
60
|
-
coffee.stdin.write(source).flush().close();
|
61
|
-
checkForErrors(coffee);
|
62
|
-
return coffee.stdout.read();
|
63
|
-
};
|
64
|
-
// Evaluating a string of CoffeeScript first compiles it externally.
|
65
|
-
exports.evalCS = function evalCS(source, flags) {
|
66
|
-
return eval(exports.compile(source, flags));
|
67
|
-
};
|
68
|
-
// Make a factory for the CoffeeScript environment.
|
69
|
-
exports.makeNarwhalFactory = function makeNarwhalFactory(path) {
|
70
|
-
var code, factoryText;
|
71
|
-
code = exports.compileFile(path);
|
72
|
-
factoryText = "function(require,exports,module,system,print){" + code + "/**/\n}";
|
73
|
-
if (system.engine === "rhino") {
|
74
|
-
return Packages.org.mozilla.javascript.Context.getCurrentContext().compileFunction(global, factoryText, path, 0, null);
|
75
|
-
} else {
|
76
|
-
// eval requires parentheses, but parentheses break compileFunction.
|
77
|
-
return eval("(" + factoryText + ")");
|
78
|
-
}
|
79
|
-
};
|
80
|
-
// The Narwhal loader for '.coffee' files.
|
81
|
-
factories = {
|
82
|
-
};
|
83
|
-
loader = {
|
84
|
-
};
|
85
|
-
// Reload the coffee-script environment from source.
|
86
|
-
loader.reload = function reload(topId, path) {
|
87
|
-
return factories[topId] = function() {
|
88
|
-
return exports.makeNarwhalFactory(path);
|
89
|
-
};
|
90
|
-
};
|
91
|
-
// Ensure that the coffee-script environment is loaded.
|
92
|
-
loader.load = function load(topId, path) {
|
93
|
-
return factories[topId] = factories[topId] || this.reload(topId, path);
|
94
|
-
};
|
95
|
-
require.loader.loaders.unshift([".coffee", loader]);
|
96
|
-
})();
|
data/lib/coffee_script/nodes.js
DELETED
@@ -1,443 +0,0 @@
|
|
1
|
-
(function(){
|
2
|
-
var compact, dup, flatten;
|
3
|
-
var __hasProp = Object.prototype.hasOwnProperty;
|
4
|
-
// The abstract base class for all CoffeeScript nodes.
|
5
|
-
// All nodes are implement a "compile_node" method, which performs the
|
6
|
-
// code generation for that node. To compile a node, call the "compile"
|
7
|
-
// method, which wraps "compile_node" in some extra smarts, to know when the
|
8
|
-
// generated code should be wrapped up in a closure. An options hash is passed
|
9
|
-
// and cloned throughout, containing messages from higher in the AST,
|
10
|
-
// information about the current scope, and indentation level.
|
11
|
-
exports.Node = function Node() {
|
12
|
-
var __a;
|
13
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
14
|
-
this.values = arguments;
|
15
|
-
__a = this.name = this.constructor.name;
|
16
|
-
return Node === this.constructor ? this : __a;
|
17
|
-
};
|
18
|
-
exports.Expressions = function Expressions() {
|
19
|
-
var __a;
|
20
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
21
|
-
this.name = this.constructor.name;
|
22
|
-
__a = this.values = arguments;
|
23
|
-
return Expressions === this.constructor ? this : __a;
|
24
|
-
};
|
25
|
-
exports.LiteralNode = function LiteralNode() {
|
26
|
-
var __a;
|
27
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
28
|
-
this.name = this.constructor.name;
|
29
|
-
__a = this.values = arguments;
|
30
|
-
return LiteralNode === this.constructor ? this : __a;
|
31
|
-
};
|
32
|
-
exports.ReturnNode = function ReturnNode() {
|
33
|
-
var __a;
|
34
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
35
|
-
this.name = this.constructor.name;
|
36
|
-
__a = this.values = arguments;
|
37
|
-
return ReturnNode === this.constructor ? this : __a;
|
38
|
-
};
|
39
|
-
exports.CommentNode = function CommentNode() {
|
40
|
-
var __a;
|
41
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
42
|
-
this.name = this.constructor.name;
|
43
|
-
__a = this.values = arguments;
|
44
|
-
return CommentNode === this.constructor ? this : __a;
|
45
|
-
};
|
46
|
-
exports.CallNode = function CallNode() {
|
47
|
-
var __a;
|
48
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
49
|
-
this.name = this.constructor.name;
|
50
|
-
__a = this.values = arguments;
|
51
|
-
return CallNode === this.constructor ? this : __a;
|
52
|
-
};
|
53
|
-
exports.ExtendsNode = function ExtendsNode() {
|
54
|
-
var __a;
|
55
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
56
|
-
this.name = this.constructor.name;
|
57
|
-
__a = this.values = arguments;
|
58
|
-
return ExtendsNode === this.constructor ? this : __a;
|
59
|
-
};
|
60
|
-
exports.ValueNode = function ValueNode() {
|
61
|
-
var __a;
|
62
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
63
|
-
this.name = this.constructor.name;
|
64
|
-
__a = this.values = arguments;
|
65
|
-
return ValueNode === this.constructor ? this : __a;
|
66
|
-
};
|
67
|
-
exports.AccessorNode = function AccessorNode() {
|
68
|
-
var __a;
|
69
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
70
|
-
this.name = this.constructor.name;
|
71
|
-
__a = this.values = arguments;
|
72
|
-
return AccessorNode === this.constructor ? this : __a;
|
73
|
-
};
|
74
|
-
exports.IndexNode = function IndexNode() {
|
75
|
-
var __a;
|
76
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
77
|
-
this.name = this.constructor.name;
|
78
|
-
__a = this.values = arguments;
|
79
|
-
return IndexNode === this.constructor ? this : __a;
|
80
|
-
};
|
81
|
-
exports.RangeNode = function RangeNode() {
|
82
|
-
var __a;
|
83
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
84
|
-
this.name = this.constructor.name;
|
85
|
-
__a = this.values = arguments;
|
86
|
-
return RangeNode === this.constructor ? this : __a;
|
87
|
-
};
|
88
|
-
exports.SliceNode = function SliceNode() {
|
89
|
-
var __a;
|
90
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
91
|
-
this.name = this.constructor.name;
|
92
|
-
__a = this.values = arguments;
|
93
|
-
return SliceNode === this.constructor ? this : __a;
|
94
|
-
};
|
95
|
-
exports.AssignNode = function AssignNode() {
|
96
|
-
var __a;
|
97
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
98
|
-
this.name = this.constructor.name;
|
99
|
-
__a = this.values = arguments;
|
100
|
-
return AssignNode === this.constructor ? this : __a;
|
101
|
-
};
|
102
|
-
exports.OpNode = function OpNode() {
|
103
|
-
var __a;
|
104
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
105
|
-
this.name = this.constructor.name;
|
106
|
-
__a = this.values = arguments;
|
107
|
-
return OpNode === this.constructor ? this : __a;
|
108
|
-
};
|
109
|
-
exports.CodeNode = function CodeNode() {
|
110
|
-
var __a;
|
111
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
112
|
-
this.name = this.constructor.name;
|
113
|
-
__a = this.values = arguments;
|
114
|
-
return CodeNode === this.constructor ? this : __a;
|
115
|
-
};
|
116
|
-
exports.SplatNode = function SplatNode() {
|
117
|
-
var __a;
|
118
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
119
|
-
this.name = this.constructor.name;
|
120
|
-
__a = this.values = arguments;
|
121
|
-
return SplatNode === this.constructor ? this : __a;
|
122
|
-
};
|
123
|
-
exports.ObjectNode = function ObjectNode() {
|
124
|
-
var __a;
|
125
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
126
|
-
this.name = this.constructor.name;
|
127
|
-
__a = this.values = arguments;
|
128
|
-
return ObjectNode === this.constructor ? this : __a;
|
129
|
-
};
|
130
|
-
exports.ArrayNode = function ArrayNode() {
|
131
|
-
var __a;
|
132
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
133
|
-
this.name = this.constructor.name;
|
134
|
-
__a = this.values = arguments;
|
135
|
-
return ArrayNode === this.constructor ? this : __a;
|
136
|
-
};
|
137
|
-
exports.PushNode = function PushNode() {
|
138
|
-
var __a;
|
139
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
140
|
-
this.name = this.constructor.name;
|
141
|
-
__a = this.values = arguments;
|
142
|
-
return PushNode === this.constructor ? this : __a;
|
143
|
-
};
|
144
|
-
exports.ClosureNode = function ClosureNode() {
|
145
|
-
var __a;
|
146
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
147
|
-
this.name = this.constructor.name;
|
148
|
-
__a = this.values = arguments;
|
149
|
-
return ClosureNode === this.constructor ? this : __a;
|
150
|
-
};
|
151
|
-
exports.WhileNode = function WhileNode() {
|
152
|
-
var __a;
|
153
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
154
|
-
this.name = this.constructor.name;
|
155
|
-
__a = this.values = arguments;
|
156
|
-
return WhileNode === this.constructor ? this : __a;
|
157
|
-
};
|
158
|
-
exports.ForNode = function ForNode() {
|
159
|
-
var __a;
|
160
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
161
|
-
this.name = this.constructor.name;
|
162
|
-
__a = this.values = arguments;
|
163
|
-
return ForNode === this.constructor ? this : __a;
|
164
|
-
};
|
165
|
-
exports.TryNode = function TryNode() {
|
166
|
-
var __a;
|
167
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
168
|
-
this.name = this.constructor.name;
|
169
|
-
__a = this.values = arguments;
|
170
|
-
return TryNode === this.constructor ? this : __a;
|
171
|
-
};
|
172
|
-
exports.ThrowNode = function ThrowNode() {
|
173
|
-
var __a;
|
174
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
175
|
-
this.name = this.constructor.name;
|
176
|
-
__a = this.values = arguments;
|
177
|
-
return ThrowNode === this.constructor ? this : __a;
|
178
|
-
};
|
179
|
-
exports.ExistenceNode = function ExistenceNode() {
|
180
|
-
var __a;
|
181
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
182
|
-
this.name = this.constructor.name;
|
183
|
-
__a = this.values = arguments;
|
184
|
-
return ExistenceNode === this.constructor ? this : __a;
|
185
|
-
};
|
186
|
-
exports.ParentheticalNode = function ParentheticalNode() {
|
187
|
-
var __a;
|
188
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
189
|
-
this.name = this.constructor.name;
|
190
|
-
__a = this.values = arguments;
|
191
|
-
return ParentheticalNode === this.constructor ? this : __a;
|
192
|
-
};
|
193
|
-
exports.IfNode = function IfNode() {
|
194
|
-
var __a;
|
195
|
-
var arguments = Array.prototype.slice.call(arguments, 0);
|
196
|
-
this.name = this.constructor.name;
|
197
|
-
__a = this.values = arguments;
|
198
|
-
return IfNode === this.constructor ? this : __a;
|
199
|
-
};
|
200
|
-
exports.Expressions.wrap = function wrap(values) {
|
201
|
-
return this.values = values;
|
202
|
-
};
|
203
|
-
// Some helper functions
|
204
|
-
// TODO -- shallow (1 deep) flatten..
|
205
|
-
// need recursive version..
|
206
|
-
flatten = function flatten(aggList, newList) {
|
207
|
-
var __a, __b, item;
|
208
|
-
__a = newList;
|
209
|
-
for (__b = 0; __b < __a.length; __b++) {
|
210
|
-
item = __a[__b];
|
211
|
-
aggList.push(item);
|
212
|
-
}
|
213
|
-
return aggList;
|
214
|
-
};
|
215
|
-
compact = function compact(input) {
|
216
|
-
var __a, __b, __c, compected, item;
|
217
|
-
compected = [];
|
218
|
-
__a = []; __b = input;
|
219
|
-
for (__c = 0; __c < __b.length; __c++) {
|
220
|
-
item = __b[__c];
|
221
|
-
__a.push((typeof item !== "undefined" && item !== null) ? compacted.push(item) : null);
|
222
|
-
}
|
223
|
-
return __a;
|
224
|
-
};
|
225
|
-
dup = function dup(input) {
|
226
|
-
var __a, __b, __c, key, output, val;
|
227
|
-
output = null;
|
228
|
-
if (input instanceof Array) {
|
229
|
-
output = [];
|
230
|
-
__a = input;
|
231
|
-
for (__b = 0; __b < __a.length; __b++) {
|
232
|
-
val = __a[__b];
|
233
|
-
output.push(val);
|
234
|
-
}
|
235
|
-
} else {
|
236
|
-
output = {
|
237
|
-
};
|
238
|
-
__c = input;
|
239
|
-
for (key in __c) {
|
240
|
-
val = __c[key];
|
241
|
-
if (__hasProp.call(__c, key)) {
|
242
|
-
output.key = val;
|
243
|
-
}
|
244
|
-
}
|
245
|
-
output;
|
246
|
-
}
|
247
|
-
return output;
|
248
|
-
};
|
249
|
-
exports.Node.prototype.TAB = ' ';
|
250
|
-
// Tag this node as a statement, meaning that it can't be used directly as
|
251
|
-
// the result of an expression.
|
252
|
-
exports.Node.prototype.mark_as_statement = function mark_as_statement() {
|
253
|
-
return this.is_statement = function is_statement() {
|
254
|
-
return true;
|
255
|
-
};
|
256
|
-
};
|
257
|
-
// Tag this node as a statement that cannot be transformed into an expression.
|
258
|
-
// (break, continue, etc.) It doesn't make sense to try to transform it.
|
259
|
-
exports.Node.prototype.mark_as_statement_only = function mark_as_statement_only() {
|
260
|
-
this.mark_as_statement();
|
261
|
-
return this.is_statement_only = function is_statement_only() {
|
262
|
-
return true;
|
263
|
-
};
|
264
|
-
};
|
265
|
-
// This node needs to know if it's being compiled as a top-level statement,
|
266
|
-
// in order to compile without special expression conversion.
|
267
|
-
exports.Node.prototype.mark_as_top_sensitive = function mark_as_top_sensitive() {
|
268
|
-
return this.is_top_sensitive = function is_top_sensitive() {
|
269
|
-
return true;
|
270
|
-
};
|
271
|
-
};
|
272
|
-
// Provide a quick implementation of a children method.
|
273
|
-
exports.Node.prototype.children = function children(attributes) {
|
274
|
-
var __a, __b, agg, compacted, item;
|
275
|
-
// TODO -- are these optimal impls of flatten and compact
|
276
|
-
// .. do better ones exist in a stdlib?
|
277
|
-
agg = [];
|
278
|
-
__a = attributes;
|
279
|
-
for (__b = 0; __b < __a.length; __b++) {
|
280
|
-
item = __a[__b];
|
281
|
-
agg = flatten(agg, item);
|
282
|
-
}
|
283
|
-
compacted = compact(agg);
|
284
|
-
return this.children = function children() {
|
285
|
-
return compacted;
|
286
|
-
};
|
287
|
-
};
|
288
|
-
exports.Node.prototype.write = function write(code) {
|
289
|
-
// hm..
|
290
|
-
// TODO -- should print to STDOUT in "VERBOSE" how to
|
291
|
-
// go about this.. ? jsonify 'this'?
|
292
|
-
// use node's puts ??
|
293
|
-
return code;
|
294
|
-
};
|
295
|
-
// This is extremely important -- we convert JS statements into expressions
|
296
|
-
// by wrapping them in a closure, only if it's possible, and we're not at
|
297
|
-
// the top level of a block (which would be unnecessary), and we haven't
|
298
|
-
// already been asked to return the result.
|
299
|
-
exports.Node.prototype.compile = function compile(o) {
|
300
|
-
var closure, opts, top;
|
301
|
-
// TODO -- need JS dup/clone
|
302
|
-
opts = (typeof !o !== "undefined" && !o !== null) ? {
|
303
|
-
} : o;
|
304
|
-
this.options = opts;
|
305
|
-
this.indent = opts.indent;
|
306
|
-
top = this.options.top;
|
307
|
-
!this.is_top_sentitive() ? (this.options.top = undefined) : null;
|
308
|
-
closure = this.is_statement() && !this.is_statement_only() && !top && typeof (this) === "CommentNode";
|
309
|
-
closure = closure && !this.do_i_contain(function(n) {
|
310
|
-
return n.is_statement_only();
|
311
|
-
});
|
312
|
-
return closure ? this.compile_closure(this.options) : compile_node(this.options);
|
313
|
-
};
|
314
|
-
// Statements converted into expressions share scope with their parent
|
315
|
-
// closure, to preserve JavaScript-style lexical scope.
|
316
|
-
exports.Node.prototype.compile_closure = function compile_closure(o) {
|
317
|
-
var opts;
|
318
|
-
opts = (typeof !o !== "undefined" && !o !== null) ? {
|
319
|
-
} : o;
|
320
|
-
this.indent = opts.indent;
|
321
|
-
opts.shared_scope = o.scope;
|
322
|
-
return exports.ClosureNode.wrap(this).compile(opts);
|
323
|
-
};
|
324
|
-
// Quick short method for the current indentation level, plus tabbing in.
|
325
|
-
exports.Node.prototype.idt = function idt(tLvl) {
|
326
|
-
var __a, __b, __c, __d, tabAmt, tabs, x;
|
327
|
-
tabs = (typeof tLvl !== "undefined" && tLvl !== null) ? tLvl : 0;
|
328
|
-
tabAmt = '';
|
329
|
-
__c = 0; __d = tabs;
|
330
|
-
for (__b=0, x=__c; (__c <= __d ? x < __d : x > __d); (__c <= __d ? x += 1 : x -= 1), __b++) {
|
331
|
-
tabAmt = tabAmt + this.TAB;
|
332
|
-
}
|
333
|
-
return this.indent + tabAmt;
|
334
|
-
};
|
335
|
-
//Does this node, or any of it's children, contain a node of a certain kind?
|
336
|
-
exports.Node.prototype.do_i_contain = function do_i_contain(block) {
|
337
|
-
var __a, __b, node;
|
338
|
-
__a = this.children;
|
339
|
-
for (__b = 0; __b < __a.length; __b++) {
|
340
|
-
node = __a[__b];
|
341
|
-
if (block(node)) {
|
342
|
-
return true;
|
343
|
-
}
|
344
|
-
if (node instanceof exports.Node && node.do_i_contain(block)) {
|
345
|
-
return true;
|
346
|
-
}
|
347
|
-
}
|
348
|
-
return false;
|
349
|
-
};
|
350
|
-
// Default implementations of the common node methods.
|
351
|
-
exports.Node.prototype.unwrap = function unwrap() {
|
352
|
-
return this;
|
353
|
-
};
|
354
|
-
exports.Node.prototype.children = [];
|
355
|
-
exports.Node.prototype.is_a_statement = function is_a_statement() {
|
356
|
-
return false;
|
357
|
-
};
|
358
|
-
exports.Node.prototype.is_a_statement_only = function is_a_statement_only() {
|
359
|
-
return false;
|
360
|
-
};
|
361
|
-
exports.Node.prototype.is_top_sensitive = function is_top_sensitive() {
|
362
|
-
return false;
|
363
|
-
};
|
364
|
-
// A collection of nodes, each one representing an expression.
|
365
|
-
// exports.Expressions: (nodes) ->
|
366
|
-
// this.mark_as_statement()
|
367
|
-
// this.expressions: []
|
368
|
-
// this.children([this.expressions])
|
369
|
-
// for n in nodes
|
370
|
-
// this.expressions: flatten this.expressions, n
|
371
|
-
// exports.Expressions extends exports.Node
|
372
|
-
exports.Expressions.prototype.TRAILING_WHITESPACE = /\s+$/;
|
373
|
-
// Wrap up a node as an Expressions, unless it already is.
|
374
|
-
exports.Expressions.prototype.wrap = function wrap(nodes) {
|
375
|
-
if (nodes.length === 1 && nodes[0] instanceof exports.Expressions) {
|
376
|
-
return nodes[0];
|
377
|
-
}
|
378
|
-
return new Expressions(nodes);
|
379
|
-
};
|
380
|
-
// Tack an expression on to the end of this expression list.
|
381
|
-
exports.Expressions.prototype.push = function push(node) {
|
382
|
-
this.expressions.push(node);
|
383
|
-
return this;
|
384
|
-
};
|
385
|
-
// Tack an expression on to the beginning of this expression list.
|
386
|
-
exports.Expressions.prototype.unshift = function unshift(node) {
|
387
|
-
this.expressions.unshift(node);
|
388
|
-
return this;
|
389
|
-
};
|
390
|
-
// If this Expressions consists of a single node, pull it back out.
|
391
|
-
exports.Expressions.prototype.unwrap = function unwrap() {
|
392
|
-
return this.expressions.length === 1 ? this.expressions[0] : this;
|
393
|
-
};
|
394
|
-
// Is this an empty block of code?
|
395
|
-
exports.Expressions.prototype.is_empty = function is_empty() {
|
396
|
-
return this.expressions.length === 0;
|
397
|
-
};
|
398
|
-
// Is the node last in this block of expressions.
|
399
|
-
exports.Expressions.prototype.is_last = function is_last(node) {
|
400
|
-
var arr_length;
|
401
|
-
arr_length = this.expressions.length;
|
402
|
-
this.last_index = this.last_index || this.expressions[arr_length - 1] instanceof exports.CommentNode ? -2 : -1;
|
403
|
-
return node === this.expressions[arr_length - this.last_index];
|
404
|
-
};
|
405
|
-
exports.Expressions.prototype.compile = function compile(o) {
|
406
|
-
var opts;
|
407
|
-
opts = (typeof o !== "undefined" && o !== null) ? o : {
|
408
|
-
};
|
409
|
-
return opts.scope ? exports.Expressions.__superClass__.compile.call(this, dup(opts)) : this.compile_root(o);
|
410
|
-
};
|
411
|
-
// Compile each expression in the Expressions body.
|
412
|
-
exports.Expressions.prototype.compile_node = function compile_node(options) {
|
413
|
-
var __a, __b, __c, __d, __e, code, compiled, e, line, opts;
|
414
|
-
opts = (typeof options !== "undefined" && options !== null) ? options : {
|
415
|
-
};
|
416
|
-
compiled = [];
|
417
|
-
__a = this.expressions;
|
418
|
-
for (__b = 0; __b < __a.length; __b++) {
|
419
|
-
e = __a[__b];
|
420
|
-
compiled.push(this.compile_expression(e, dup(options)));
|
421
|
-
}
|
422
|
-
code = '';
|
423
|
-
__c = []; __d = compiled;
|
424
|
-
for (__e = 0; __e < __d.length; __e++) {
|
425
|
-
line = __d[__e];
|
426
|
-
__c.push((code = code + line + '\n'));
|
427
|
-
}
|
428
|
-
return __c;
|
429
|
-
};
|
430
|
-
// If this is the top-level Expressions, wrap everything in a safety closure.
|
431
|
-
exports.Expressions.prototype.compile_root = function compile_root(o) {
|
432
|
-
var code, indent, opts;
|
433
|
-
opts = (typeof o !== "undefined" && o !== null) ? o : {
|
434
|
-
};
|
435
|
-
indent = opts.no_wrap ? '' : this.TAB;
|
436
|
-
this.indent = indent;
|
437
|
-
opts.indent = indent;
|
438
|
-
opts.scope = new Scope(null, this, null);
|
439
|
-
code = opts.globals ? compile_node(opts) : compile_with_declarations(opts);
|
440
|
-
code.replace(this.TRAILING_WHITESPACE, '');
|
441
|
-
return this.write(opts.no_wrap ? code : "(function(){\n" + code + "\n})();");
|
442
|
-
};
|
443
|
-
})();
|