coffee-script 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/coffee-script.gemspec +2 -2
- data/examples/blocks.coffee +57 -0
- data/extras/CoffeeScript.tmbundle/Syntaxes/CoffeeScript.tmLanguage +6 -0
- data/lib/coffee-script.rb +1 -1
- data/lib/coffee_script/coffee-script.js +50 -0
- data/lib/coffee_script/command_line.rb +17 -11
- data/lib/coffee_script/grammar.y +11 -9
- data/lib/coffee_script/lexer.js +363 -0
- data/lib/coffee_script/lexer.rb +2 -4
- data/lib/coffee_script/narwhal/{lib/coffee-script.js → coffee-script.js} +21 -5
- data/lib/coffee_script/nodes.js +443 -0
- data/lib/coffee_script/nodes.rb +24 -9
- data/lib/coffee_script/parser.js +477 -0
- data/lib/coffee_script/parser.rb +1222 -1140
- data/lib/coffee_script/repl.js +33 -0
- data/lib/coffee_script/rewriter.js +377 -0
- data/lib/coffee_script/rewriter.rb +26 -26
- data/lib/coffee_script/runner.js +11 -0
- data/lib/coffee_script/scope.js +73 -0
- data/package.json +2 -3
- metadata +12 -6
- data/lib/coffee_script/narwhal/coffee-script.coffee +0 -62
- data/lib/coffee_script/narwhal/lib/coffee-script/loader.js +0 -21
- data/lib/coffee_script/narwhal/loader.coffee +0 -19
@@ -0,0 +1,11 @@
|
|
1
|
+
(function(){
|
2
|
+
var coffee, paths;
|
3
|
+
// Quickie script to compile and run all the files given as arguments.
|
4
|
+
process.mixin(require('sys'));
|
5
|
+
coffee = require('./coffee-script');
|
6
|
+
paths = process.ARGV;
|
7
|
+
paths = paths.slice(2, paths.length);
|
8
|
+
paths.length ? coffee.compile_files(paths, function(js) {
|
9
|
+
return eval(js);
|
10
|
+
}) : require('./repl');
|
11
|
+
})();
|
@@ -0,0 +1,73 @@
|
|
1
|
+
(function(){
|
2
|
+
var dup;
|
3
|
+
var __hasProp = Object.prototype.hasOwnProperty;
|
4
|
+
dup = function dup(input) {
|
5
|
+
var __a, __b, __c, key, output, val;
|
6
|
+
output = null;
|
7
|
+
if (input instanceof Array) {
|
8
|
+
output = [];
|
9
|
+
__a = input;
|
10
|
+
for (__b = 0; __b < __a.length; __b++) {
|
11
|
+
val = __a[__b];
|
12
|
+
output.push(val);
|
13
|
+
}
|
14
|
+
} else {
|
15
|
+
output = {
|
16
|
+
};
|
17
|
+
__c = input;
|
18
|
+
for (key in __c) {
|
19
|
+
val = __c[key];
|
20
|
+
if (__hasProp.call(__c, key)) {
|
21
|
+
output.key = val;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
output;
|
25
|
+
}
|
26
|
+
return output;
|
27
|
+
};
|
28
|
+
// scope objects form a tree corresponding to the shape of the function
|
29
|
+
// definitions present in the script. They provide lexical scope, to determine
|
30
|
+
// whether a variable has been seen before or if it needs to be declared.
|
31
|
+
exports.Scope = function Scope(parent, expressions, func) {
|
32
|
+
var __a;
|
33
|
+
// Initialize a scope with its parent, for lookups up the chain,
|
34
|
+
// as well as the Expressions body where it should declare its variables,
|
35
|
+
// and the function that it wraps.
|
36
|
+
this.parent = parent;
|
37
|
+
this.expressions = expressions;
|
38
|
+
this.function = func;
|
39
|
+
this.variables = {
|
40
|
+
};
|
41
|
+
__a = this.temp_variable = this.parent ? dup(this.parent.temp_variable) : '__a';
|
42
|
+
return Scope === this.constructor ? this : __a;
|
43
|
+
};
|
44
|
+
// Look up a variable in lexical scope, or declare it if not found.
|
45
|
+
exports.Scope.prototype.find = function find(name, rem) {
|
46
|
+
var found, remote;
|
47
|
+
remote = (typeof rem !== "undefined" && rem !== null) ? rem : false;
|
48
|
+
found = this.check(name);
|
49
|
+
if (found || remote) {
|
50
|
+
return found;
|
51
|
+
}
|
52
|
+
this.variables[name] = 'var';
|
53
|
+
return found;
|
54
|
+
};
|
55
|
+
// Define a local variable as originating from a parameter in current scope
|
56
|
+
// -- no var required.
|
57
|
+
exports.Scope.prototype.parameter = function parameter(name) {
|
58
|
+
return this.variables[name] = 'param';
|
59
|
+
};
|
60
|
+
// Just check to see if a variable has already been declared.
|
61
|
+
exports.Scope.prototype.check = function check(name) {
|
62
|
+
if ((typeof this.variables[name] !== "undefined" && this.variables[name] !== null)) {
|
63
|
+
return true;
|
64
|
+
}
|
65
|
+
// TODO: what does that ruby !! mean..? need to follow up
|
66
|
+
// .. this next line is prolly wrong ..
|
67
|
+
return !!(this.parent && this.parent.check(name));
|
68
|
+
};
|
69
|
+
// You can reset a found variable on the immediate scope.
|
70
|
+
exports.Scope.prototype.reset = function reset(name) {
|
71
|
+
return this.variables[name] = undefined;
|
72
|
+
};
|
73
|
+
})();
|
data/package.json
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
{
|
2
2
|
"name": "coffee-script",
|
3
|
-
"lib": "lib/coffee_script/narwhal
|
4
|
-
"preload": ["coffee-script/loader"],
|
3
|
+
"lib": "lib/coffee_script/narwhal",
|
5
4
|
"description": "Unfancy JavaScript",
|
6
5
|
"keywords": ["javascript", "language"],
|
7
6
|
"author": "Jeremy Ashkenas",
|
8
|
-
"version": "0.3.
|
7
|
+
"version": "0.3.2"
|
9
8
|
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coffee-script
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Ashkenas
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-02-08 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -23,6 +23,7 @@ extra_rdoc_files: []
|
|
23
23
|
|
24
24
|
files:
|
25
25
|
- bin/coffee
|
26
|
+
- examples/blocks.coffee
|
26
27
|
- examples/code.coffee
|
27
28
|
- examples/poignant.coffee
|
28
29
|
- examples/potion.coffee
|
@@ -33,17 +34,22 @@ files:
|
|
33
34
|
- extras/CoffeeScript.tmbundle/Syntaxes/CoffeeScript.tmLanguage
|
34
35
|
- extras/EXTRAS
|
35
36
|
- lib/coffee-script.rb
|
37
|
+
- lib/coffee_script/coffee-script.js
|
36
38
|
- lib/coffee_script/command_line.rb
|
37
39
|
- lib/coffee_script/grammar.y
|
40
|
+
- lib/coffee_script/lexer.js
|
38
41
|
- lib/coffee_script/lexer.rb
|
39
|
-
- lib/coffee_script/narwhal/coffee-script.
|
40
|
-
- lib/coffee_script/
|
41
|
-
- lib/coffee_script/narwhal/lib/coffee-script.js
|
42
|
-
- lib/coffee_script/narwhal/loader.coffee
|
42
|
+
- lib/coffee_script/narwhal/coffee-script.js
|
43
|
+
- lib/coffee_script/nodes.js
|
43
44
|
- lib/coffee_script/nodes.rb
|
44
45
|
- lib/coffee_script/parse_error.rb
|
46
|
+
- lib/coffee_script/parser.js
|
45
47
|
- lib/coffee_script/parser.rb
|
48
|
+
- lib/coffee_script/repl.js
|
49
|
+
- lib/coffee_script/rewriter.js
|
46
50
|
- lib/coffee_script/rewriter.rb
|
51
|
+
- lib/coffee_script/runner.js
|
52
|
+
- lib/coffee_script/scope.js
|
47
53
|
- lib/coffee_script/scope.rb
|
48
54
|
- lib/coffee_script/value.rb
|
49
55
|
- coffee-script.gemspec
|
@@ -1,62 +0,0 @@
|
|
1
|
-
# This (javascript) file is generated from lib/coffee_script/narwhal/coffee-script.coffee
|
2
|
-
|
3
|
-
# Executes the `coffee` Ruby program to convert from CoffeeScript
|
4
|
-
# to Javascript. Eventually this will hopefully happen entirely within JS.
|
5
|
-
|
6
|
-
# Require external dependencies.
|
7
|
-
OS: require('os')
|
8
|
-
File: require('file')
|
9
|
-
Readline: require('readline')
|
10
|
-
|
11
|
-
# The path to the CoffeeScript Compiler.
|
12
|
-
coffeePath: File.path(module.path).dirname().dirname().dirname().dirname().dirname().join('bin', 'coffee')
|
13
|
-
|
14
|
-
# Our general-purpose error handler.
|
15
|
-
checkForErrors: (coffeeProcess) ->
|
16
|
-
return true if coffeeProcess.wait() is 0
|
17
|
-
system.stderr.print(coffeeProcess.stderr.read())
|
18
|
-
throw new Error("CoffeeScript compile error")
|
19
|
-
|
20
|
-
# Run a simple REPL, round-tripping to the CoffeeScript compiler for every
|
21
|
-
# command.
|
22
|
-
exports.run: (args) ->
|
23
|
-
if args.length
|
24
|
-
for path, i in args
|
25
|
-
exports.evalCS(File.read(path))
|
26
|
-
delete args[i]
|
27
|
-
return true
|
28
|
-
|
29
|
-
while true
|
30
|
-
try
|
31
|
-
system.stdout.write('coffee> ').flush()
|
32
|
-
result: exports.evalCS(Readline.readline(), ['--globals'])
|
33
|
-
print(result) if result isnt undefined
|
34
|
-
catch e
|
35
|
-
print(e)
|
36
|
-
|
37
|
-
# Compile a given CoffeeScript file into JavaScript.
|
38
|
-
exports.compileFile: (path) ->
|
39
|
-
coffee: OS.popen([coffeePath, "--print", "--no-wrap", path])
|
40
|
-
checkForErrors(coffee)
|
41
|
-
coffee.stdout.read()
|
42
|
-
|
43
|
-
# Compile a string of CoffeeScript into JavaScript.
|
44
|
-
exports.compile: (source, flags) ->
|
45
|
-
coffee: OS.popen([coffeePath, "--eval", "--no-wrap"].concat(flags or []))
|
46
|
-
coffee.stdin.write(source).flush().close()
|
47
|
-
checkForErrors(coffee)
|
48
|
-
coffee.stdout.read()
|
49
|
-
|
50
|
-
# Evaluating a string of CoffeeScript first compiles it externally.
|
51
|
-
exports.evalCS: (source, flags) ->
|
52
|
-
eval(exports.compile(source, flags))
|
53
|
-
|
54
|
-
# Make a factory for the CoffeeScript environment.
|
55
|
-
exports.makeNarwhalFactory: (path) ->
|
56
|
-
code: exports.compileFile(path)
|
57
|
-
factoryText: "function(require,exports,module,system,print){" + code + "/**/\n}"
|
58
|
-
if system.engine is "rhino"
|
59
|
-
Packages.org.mozilla.javascript.Context.getCurrentContext().compileFunction(global, factoryText, path, 0, null)
|
60
|
-
else
|
61
|
-
# eval requires parentheses, but parentheses break compileFunction.
|
62
|
-
eval("(" + factoryText + ")")
|
@@ -1,21 +0,0 @@
|
|
1
|
-
(function(){
|
2
|
-
var coffeescript, factories, loader;
|
3
|
-
// This (javascript) file is generated from lib/coffee_script/narwhal/loader.coffee
|
4
|
-
coffeescript = null;
|
5
|
-
factories = {
|
6
|
-
};
|
7
|
-
loader = {
|
8
|
-
// Reload the coffee-script environment from source.
|
9
|
-
reload: function reload(topId, path) {
|
10
|
-
coffeescript = coffeescript || require('coffee-script');
|
11
|
-
return factories[topId] = function() {
|
12
|
-
return coffeescript.makeNarwhalFactory(path);
|
13
|
-
};
|
14
|
-
},
|
15
|
-
// Ensure that the coffee-script environment is loaded.
|
16
|
-
load: function load(topId, path) {
|
17
|
-
return factories[topId] = factories[topId] || this.reload(topId, path);
|
18
|
-
}
|
19
|
-
};
|
20
|
-
require.loader.loaders.unshift([".coffee", loader]);
|
21
|
-
})();
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# This (javascript) file is generated from lib/coffee_script/narwhal/loader.coffee
|
2
|
-
|
3
|
-
coffeescript: null
|
4
|
-
factories: {}
|
5
|
-
|
6
|
-
loader: {
|
7
|
-
|
8
|
-
# Reload the coffee-script environment from source.
|
9
|
-
reload: (topId, path) ->
|
10
|
-
coffeescript ||= require('coffee-script')
|
11
|
-
factories[topId]: -> coffeescript.makeNarwhalFactory(path)
|
12
|
-
|
13
|
-
# Ensure that the coffee-script environment is loaded.
|
14
|
-
load: (topId, path) ->
|
15
|
-
factories[topId] ||= this.reload(topId, path)
|
16
|
-
|
17
|
-
}
|
18
|
-
|
19
|
-
require.loader.loaders.unshift([".coffee", loader])
|