coffee-script 0.3.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/lib/coffee_script/runner.js
DELETED
@@ -1,11 +0,0 @@
|
|
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
|
-
})();
|
data/lib/coffee_script/scope.js
DELETED
@@ -1,73 +0,0 @@
|
|
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/lib/coffee_script/scope.rb
DELETED
@@ -1,91 +0,0 @@
|
|
1
|
-
module CoffeeScript
|
2
|
-
|
3
|
-
# Scope objects form a tree corresponding to the shape of the function
|
4
|
-
# definitions present in the script. They provide lexical scope, to determine
|
5
|
-
# whether a variable has been seen before or if it needs to be declared.
|
6
|
-
class Scope
|
7
|
-
|
8
|
-
attr_reader :parent, :expressions, :function, :variables, :temp_variable
|
9
|
-
|
10
|
-
# Initialize a scope with its parent, for lookups up the chain,
|
11
|
-
# as well as the Expressions body where it should declare its variables,
|
12
|
-
# and the function that it wraps.
|
13
|
-
def initialize(parent, expressions, function)
|
14
|
-
@parent, @expressions, @function = parent, expressions, function
|
15
|
-
@variables = {}
|
16
|
-
@temp_variable = @parent ? @parent.temp_variable.dup : '__a'
|
17
|
-
end
|
18
|
-
|
19
|
-
# Look up a variable in lexical scope, or declare it if not found.
|
20
|
-
def find(name, remote=false)
|
21
|
-
found = check(name)
|
22
|
-
return found if found || remote
|
23
|
-
@variables[name.to_sym] = :var
|
24
|
-
found
|
25
|
-
end
|
26
|
-
|
27
|
-
# Define a local variable as originating from a parameter in current scope
|
28
|
-
# -- no var required.
|
29
|
-
def parameter(name)
|
30
|
-
@variables[name.to_sym] = :param
|
31
|
-
end
|
32
|
-
|
33
|
-
# Just check to see if a variable has already been declared.
|
34
|
-
def check(name)
|
35
|
-
return true if @variables[name.to_sym]
|
36
|
-
!!(@parent && @parent.check(name))
|
37
|
-
end
|
38
|
-
|
39
|
-
# You can reset a found variable on the immediate scope.
|
40
|
-
def reset(name)
|
41
|
-
@variables[name.to_sym] = false
|
42
|
-
end
|
43
|
-
|
44
|
-
# Find an available, short, name for a compiler-generated variable.
|
45
|
-
def free_variable
|
46
|
-
@temp_variable.succ! while check(@temp_variable)
|
47
|
-
@variables[@temp_variable.to_sym] = :var
|
48
|
-
Value.new(@temp_variable.dup)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Ensure that an assignment is made at the top of scope (or top-level
|
52
|
-
# scope, if requested).
|
53
|
-
def assign(name, value, top=false)
|
54
|
-
return @parent.assign(name, value, top) if top && @parent
|
55
|
-
@variables[name.to_sym] = Value.new(value)
|
56
|
-
end
|
57
|
-
|
58
|
-
def declarations?(body)
|
59
|
-
!declared_variables.empty? && body == @expressions
|
60
|
-
end
|
61
|
-
|
62
|
-
def assignments?(body)
|
63
|
-
!assigned_variables.empty? && body == @expressions
|
64
|
-
end
|
65
|
-
|
66
|
-
# Return the list of variables first declared in current scope.
|
67
|
-
def declared_variables
|
68
|
-
@variables.select {|k, v| v == :var }.map {|pair| pair[0].to_s }.sort
|
69
|
-
end
|
70
|
-
|
71
|
-
# Return the list of variables that are supposed to be assigned at the top
|
72
|
-
# of scope.
|
73
|
-
def assigned_variables
|
74
|
-
@variables.select {|k, v| v.is_a?(Value) }.sort_by {|pair| pair[0].to_s }
|
75
|
-
end
|
76
|
-
|
77
|
-
def compiled_declarations
|
78
|
-
declared_variables.join(', ')
|
79
|
-
end
|
80
|
-
|
81
|
-
def compiled_assignments
|
82
|
-
assigned_variables.map {|name, val| "#{name} = #{val}"}.join(', ')
|
83
|
-
end
|
84
|
-
|
85
|
-
def inspect
|
86
|
-
"<Scope:#{__id__} #{@variables.inspect}>"
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
end
|
data/lib/coffee_script/value.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
module CoffeeScript
|
2
|
-
|
3
|
-
# Instead of producing raw Ruby objects, the Lexer produces values of this
|
4
|
-
# class, wrapping native objects tagged with line number information.
|
5
|
-
# Values masquerade as both strings and nodes -- being used both as nodes in
|
6
|
-
# the AST, and as literally-interpolated values in the generated code.
|
7
|
-
class Value
|
8
|
-
attr_reader :value, :line
|
9
|
-
|
10
|
-
def initialize(value, line=nil)
|
11
|
-
@value, @line = value, line
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_str
|
15
|
-
@value.to_s
|
16
|
-
end
|
17
|
-
alias_method :to_s, :to_str
|
18
|
-
|
19
|
-
def to_sym
|
20
|
-
to_str.to_sym
|
21
|
-
end
|
22
|
-
|
23
|
-
def compile(o={})
|
24
|
-
to_s
|
25
|
-
end
|
26
|
-
|
27
|
-
def inspect
|
28
|
-
@value.inspect
|
29
|
-
end
|
30
|
-
|
31
|
-
def ==(other)
|
32
|
-
@value == other
|
33
|
-
end
|
34
|
-
|
35
|
-
def [](index)
|
36
|
-
@value[index]
|
37
|
-
end
|
38
|
-
|
39
|
-
def eql?(other)
|
40
|
-
@value.eql?(other)
|
41
|
-
end
|
42
|
-
|
43
|
-
def hash
|
44
|
-
@value.hash
|
45
|
-
end
|
46
|
-
|
47
|
-
def match(regex)
|
48
|
-
@value.match(regex)
|
49
|
-
end
|
50
|
-
|
51
|
-
def children
|
52
|
-
[]
|
53
|
-
end
|
54
|
-
|
55
|
-
def statement_only?
|
56
|
-
false
|
57
|
-
end
|
58
|
-
|
59
|
-
def contains?
|
60
|
-
false
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|