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
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
|