red 3.5.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +10 -15
- data/README.txt +7 -50
- data/bin/red +12 -19
- data/config/hoe.rb +7 -6
- data/lib/red/errors.rb +2 -64
- data/lib/red/executable.rb +35 -34
- data/lib/red/nodes/assignment_nodes.rb +133 -0
- data/lib/red/nodes/call_nodes.rb +126 -0
- data/lib/red/nodes/control_nodes.rb +126 -0
- data/lib/red/nodes/data_nodes.rb +75 -0
- data/lib/red/nodes/definition_nodes.rb +191 -0
- data/lib/red/nodes/illegal_nodes.rb +33 -0
- data/lib/red/nodes/literal_nodes.rb +148 -0
- data/lib/red/nodes/logic_nodes.rb +89 -0
- data/lib/red/nodes/variable_nodes.rb +76 -0
- data/lib/red/plugin.rb +6 -7
- data/lib/red/version.rb +2 -2
- data/lib/red.rb +209 -131
- data/lib/source/ruby.rb +6744 -0
- metadata +14 -19
- data/lib/javascripts/_dom_ready.js +0 -249
- data/lib/javascripts/prototype_dom_ready.js +0 -1
- data/lib/javascripts/red/unobtrusive.red +0 -6
- data/lib/red/assignment_nodes.rb +0 -164
- data/lib/red/call_nodes.rb +0 -90
- data/lib/red/conditional_nodes.rb +0 -63
- data/lib/red/conjunction_nodes.rb +0 -23
- data/lib/red/constant_nodes.rb +0 -47
- data/lib/red/control_nodes.rb +0 -129
- data/lib/red/data_nodes.rb +0 -93
- data/lib/red/definition_nodes.rb +0 -177
- data/lib/red/illegal_nodes.rb +0 -63
- data/lib/red/literal_nodes.rb +0 -119
- data/lib/red/variable_nodes.rb +0 -37
- data/lib/red/wrap_nodes.rb +0 -51
data/lib/red/constant_nodes.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
module Red
|
2
|
-
class ConstantNode # :nodoc:
|
3
|
-
class BreakNode < ConstantNode # :nodoc:
|
4
|
-
def initialize(*args)
|
5
|
-
raise(BuildError::NoBreakArguments, "Break can't take an argument in JavaScript") unless args.empty?
|
6
|
-
end
|
7
|
-
|
8
|
-
def compile_node(options = {})
|
9
|
-
return "break"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class FalseNode < ConstantNode # :nodoc:
|
14
|
-
def compile_node(options = {})
|
15
|
-
return "false"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class NextNode < ConstantNode # :nodoc:
|
20
|
-
def initialize(*args)
|
21
|
-
raise(BuildError::NoNextArguments, "Next/continue can't take an argument in JavaScript") unless args.empty?
|
22
|
-
end
|
23
|
-
|
24
|
-
def compile_node(options = {})
|
25
|
-
return "continue"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class NilNode < ConstantNode # :nodoc:
|
30
|
-
def compile_node(options = {})
|
31
|
-
return "null"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
class SelfNode < ConstantNode # :nodoc:
|
36
|
-
def compile_node(options = {})
|
37
|
-
return "this"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
class TrueNode < ConstantNode # :nodoc:
|
42
|
-
def compile_node(options = {})
|
43
|
-
return "true"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
data/lib/red/control_nodes.rb
DELETED
@@ -1,129 +0,0 @@
|
|
1
|
-
module Red
|
2
|
-
class ControlNode # :nodoc:
|
3
|
-
class BeginNode # :nodoc:
|
4
|
-
def initialize(body)
|
5
|
-
@@rescue_is_safe = (body.first == :rescue)
|
6
|
-
@body = body.build_node
|
7
|
-
end
|
8
|
-
|
9
|
-
def compile_node(options = {})
|
10
|
-
"%s" % [@body.compile_node]
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
class EnsureNode # :nodoc:
|
15
|
-
def initialize(attempted, ensure_body)
|
16
|
-
@@rescue_is_safe = @ensure_from_rescue = attempted.first == :rescue
|
17
|
-
@attempted, @ensured = [attempted, ensure_body].build_nodes
|
18
|
-
end
|
19
|
-
|
20
|
-
def compile_node(options = {})
|
21
|
-
if @ensure_from_rescue
|
22
|
-
"%s finally { %s; }"
|
23
|
-
else
|
24
|
-
"try { %s; } finally { %s; }"
|
25
|
-
end % self.compile_internals
|
26
|
-
end
|
27
|
-
|
28
|
-
def compile_internals(options = {})
|
29
|
-
return [@attempted, @ensured].compile_nodes
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class ForNode # :nodoc:
|
34
|
-
def initialize(source, iterator, body)
|
35
|
-
@properties_loop = (iterator.last == :property)
|
36
|
-
@source, @iterator, @body = [source, iterator.last, body].build_nodes
|
37
|
-
end
|
38
|
-
|
39
|
-
def compile_node(options = {})
|
40
|
-
source = @source.compile_node(:as_argument => true)
|
41
|
-
iterator = @iterator.compile_node
|
42
|
-
body = @body.compile_node
|
43
|
-
if @properties_loop
|
44
|
-
"for (var property in %s) { %s; }" % [source, body]
|
45
|
-
else
|
46
|
-
"for (var %s = 0; %s < %s.length; %s++) { %s; }" % [iterator, iterator, source, iterator, body]
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class RescueNode # :nodoc:
|
52
|
-
def initialize(attempted, rescue_body)
|
53
|
-
raise(BuildError::NoArbitraryRescue, "JavaScript does not support arbitrary placement of rescue/try blocks") unless @@rescue_is_safe
|
54
|
-
raise(BuildError::NoSpecificRescue, "JavaScript does not support rescuing of specific exception classes") unless !rescue_body[1]
|
55
|
-
@@rescue_is_safe == false
|
56
|
-
@attempted = attempted.build_node
|
57
|
-
if (block = (rescue_body.assoc(:block) || [])[1..-1]) && block.first.last == [:gvar, %s($!)]
|
58
|
-
exception_node = block.shift
|
59
|
-
@exception_variable = exception_node[1].build_node
|
60
|
-
@rescued = block.unshift(:block).build_node
|
61
|
-
else
|
62
|
-
@exception_variable = :e.build_node
|
63
|
-
@rescued = rescue_body[2].build_node
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def compile_node(options = {})
|
68
|
-
return "try { %s; } catch(%s) { %s; }" % self.compile_internals
|
69
|
-
end
|
70
|
-
|
71
|
-
def compile_internals(options = {})
|
72
|
-
return [@attempted, @exception_variable, @rescued].compile_nodes
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
class UntilNode # :nodoc:
|
77
|
-
def initialize(condition, body, run_only_if_condition_met)
|
78
|
-
@condition, @body = [condition, body].build_nodes
|
79
|
-
@do_while_loop = !run_only_if_condition_met
|
80
|
-
end
|
81
|
-
|
82
|
-
def compile_node(options = {})
|
83
|
-
if @do_while_loop
|
84
|
-
return "do { %s; } while (!(%s))" % self.compile_internals.reverse
|
85
|
-
else
|
86
|
-
return "while (!(%s)) { %s; }" % self.compile_internals
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def compile_internals(options = {})
|
91
|
-
condition = @condition.compile_node(:skip_var => true)
|
92
|
-
body = @body.compile_node
|
93
|
-
return [condition, body]
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
class WhileNode # :nodoc:
|
98
|
-
def initialize(condition, body, run_only_if_condition_met)
|
99
|
-
@condition, @body = [condition, body].build_nodes
|
100
|
-
@do_while_loop = !run_only_if_condition_met
|
101
|
-
end
|
102
|
-
|
103
|
-
def compile_node(options = {})
|
104
|
-
if @do_while_loop
|
105
|
-
return "do { %s; } while (%s)" % self.compile_internals.reverse
|
106
|
-
else
|
107
|
-
return "while (%s) { %s; }" % self.compile_internals
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def compile_internals(options = {})
|
112
|
-
condition = @condition.compile_node(:skip_var => true)
|
113
|
-
body = @body.compile_node
|
114
|
-
return [condition, body]
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
class LibraryNode # :nodoc:
|
119
|
-
def initialize(library)
|
120
|
-
@@red_library = @library = library
|
121
|
-
end
|
122
|
-
|
123
|
-
def compile_node(options = {})
|
124
|
-
@@red_library = @library
|
125
|
-
nil
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
data/lib/red/data_nodes.rb
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
module Red
|
2
|
-
class DataNode # :nodoc:
|
3
|
-
attr_reader :value
|
4
|
-
|
5
|
-
def initialize(value = nil)
|
6
|
-
@value = value
|
7
|
-
end
|
8
|
-
|
9
|
-
def compile_node(options = {})
|
10
|
-
return @value.inspect
|
11
|
-
end
|
12
|
-
|
13
|
-
def wrap_string(string, left_wrapper = "", right_wrapper = nil)
|
14
|
-
return "%s%s%s" % [left_wrapper, string, right_wrapper || left_wrapper]
|
15
|
-
end
|
16
|
-
|
17
|
-
class ErrorNode < DataNode # :nodoc:
|
18
|
-
def compile_node(options = {})
|
19
|
-
"/* Error %s */" % [@value]
|
20
|
-
end
|
21
|
-
|
22
|
-
def data_type
|
23
|
-
:error
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class NilNode < DataNode # :nodoc:
|
28
|
-
def compile_node(options = {})
|
29
|
-
""
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class OtherNode < DataNode # :nodoc:
|
34
|
-
end
|
35
|
-
|
36
|
-
class RangeNode < DataNode # :nodoc:
|
37
|
-
def initialize(*args)
|
38
|
-
case @@red_library
|
39
|
-
when :Prototype : super(*args)
|
40
|
-
else raise(BuildError::NoRangeConstructor, "#{@@red_library} JavaScript library has no literal range constructor")
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def compile_node(options = {})
|
45
|
-
case @@red_library
|
46
|
-
when :Prototype : return "$R(%s, %s%s)" % self.compile_internals
|
47
|
-
else return ""
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def compile_internals(options = {})
|
52
|
-
exclusive = @value.exclude_end? ? ", true" : ""
|
53
|
-
return [@value.begin, @value.end, exclusive]
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class StringNode < DataNode # :nodoc:
|
58
|
-
def compile_node(options = {})
|
59
|
-
options[:quotes] ||= "'"
|
60
|
-
return wrap_string(@value, options[:quotes])
|
61
|
-
end
|
62
|
-
|
63
|
-
def data_type
|
64
|
-
:string
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
class SymbolNode < DataNode # :nodoc:
|
69
|
-
def compile_node(options = {})
|
70
|
-
self.camelize!(options[:not_camelized])
|
71
|
-
return wrap_string(@value, options[:quotes])
|
72
|
-
end
|
73
|
-
|
74
|
-
def camelize!(disabled = false)
|
75
|
-
return @value = @value.to_s unless camelize? && !disabled
|
76
|
-
words = @value.to_s.gsub(/@|\$/,'').split(/_| /)
|
77
|
-
underscore = words.shift if words.first.empty?
|
78
|
-
@value = (underscore ? '_' : '') + words[0] + words[1..-1].map {|word| word == word.upcase ? word : word.capitalize }.join
|
79
|
-
end
|
80
|
-
|
81
|
-
def camelize?
|
82
|
-
value = @value.to_s
|
83
|
-
is_not_a_constant_name = value != value.upcase || value =~ (/@|\$/)
|
84
|
-
is_not_a_js_special_attribute = @value.to_s[0..1] != '__'
|
85
|
-
return is_not_a_constant_name && is_not_a_js_special_attribute
|
86
|
-
end
|
87
|
-
|
88
|
-
def data_type
|
89
|
-
:symbol
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
data/lib/red/definition_nodes.rb
DELETED
@@ -1,177 +0,0 @@
|
|
1
|
-
module Red
|
2
|
-
class DefinitionNode # :nodoc:
|
3
|
-
class ClassNode # :nodoc:
|
4
|
-
def initialize(class_name, superclass, scope)
|
5
|
-
raise(BuildError::NoClassInheritance, "Class inheritance is currently not supported#{" for the #{@@red_library} JavaScript library";''}") if superclass
|
6
|
-
old_class = @@red_class
|
7
|
-
@@red_class = @class = class_name
|
8
|
-
@class_name, @superclass = [class_name, superclass].build_nodes
|
9
|
-
block_node = scope.assoc(:block) || scope
|
10
|
-
case @@red_library
|
11
|
-
when :Prototype
|
12
|
-
@initializer = block_node.rassoc(:initialize)
|
13
|
-
@classes = block_node.select {|node| (node.first == :class) rescue false }.build_nodes
|
14
|
-
@properties = block_node.select {|node| (node.first == :cvdecl) rescue false }.build_nodes
|
15
|
-
@functions = block_node.select {|node| ![:block, :scope].include?(node) && ((node.first != :cvdecl) rescue false) }.build_nodes
|
16
|
-
else
|
17
|
-
if initializer_node = block_node.rassoc(:initialize)
|
18
|
-
args_node = initializer_node.assoc(:scope).assoc(:block).assoc(:args)
|
19
|
-
@arguments = (args_node[1..-1] || []).build_nodes
|
20
|
-
@initializer = initializer_node.assoc(:scope).assoc(:block).reject {|node| node == args_node}.build_node
|
21
|
-
end
|
22
|
-
@classes = block_node.select {|node| (node.first == :class) rescue false }.build_nodes
|
23
|
-
@properties = block_node.select {|node| (node.first == :cvdecl) rescue false }.build_nodes
|
24
|
-
@functions = block_node.select {|node| (node != initializer_node) && ![:block, :scope].include?(node) && ((node.first != :cvdecl) rescue false) }.build_nodes
|
25
|
-
end
|
26
|
-
@@red_class = old_class
|
27
|
-
end
|
28
|
-
|
29
|
-
def compile_node(options = {})
|
30
|
-
old_class = @@red_class
|
31
|
-
@@red_class = @class
|
32
|
-
if options[:as_prototype]
|
33
|
-
output = self.compile_as_child_class
|
34
|
-
elsif @initializer
|
35
|
-
case @@red_library
|
36
|
-
when :Prototype
|
37
|
-
output = self.compile_as_prototype_class
|
38
|
-
else
|
39
|
-
output = self.compile_as_standard_class
|
40
|
-
end
|
41
|
-
else
|
42
|
-
output = self.compile_as_virtual_class
|
43
|
-
end
|
44
|
-
@@red_class = old_class
|
45
|
-
return output
|
46
|
-
end
|
47
|
-
|
48
|
-
def compile_as_child_class
|
49
|
-
class_name = @class_name.compile_node
|
50
|
-
slots = (@classes | @properties | @functions).compile_nodes(:as_prototype => true).compact.join(', ')
|
51
|
-
return "%s: { %s }" % [class_name, slots]
|
52
|
-
end
|
53
|
-
|
54
|
-
def compile_as_prototype_class
|
55
|
-
class_name = @class_name.compile_node
|
56
|
-
functions = @functions.compile_nodes(:as_prototype => true).compact.join(', ')
|
57
|
-
properties = @properties.compile_nodes(:as_prototype => true).compact.join(', ')
|
58
|
-
return "%s%s = Class.create({ %s });Object.extend(%s, { %s })" % [self.var?, class_name, functions, class_name, properties]
|
59
|
-
end
|
60
|
-
|
61
|
-
def compile_as_standard_class(options = {})
|
62
|
-
class_name = @class_name.compile_node
|
63
|
-
arguments = @arguments.compile_nodes.join(', ')
|
64
|
-
initializer = @initializer.compile_node
|
65
|
-
functions = @functions.compile_nodes(:as_attribute => true).join('; ')
|
66
|
-
properties = @properties.compile_nodes.join('; ')
|
67
|
-
return "%s%s = function(%s) { %s;%s }; %s" % [self.var?, class_name, arguments, initializer, functions, properties]
|
68
|
-
end
|
69
|
-
|
70
|
-
def compile_as_virtual_class(options = {})
|
71
|
-
class_name = @class_name.compile_node
|
72
|
-
slots = (@properties | @functions).compile_nodes(:as_prototype => true).compact.join(', ')
|
73
|
-
return "%s%s = { %s }" % [self.var?, class_name, slots]
|
74
|
-
end
|
75
|
-
|
76
|
-
def var?
|
77
|
-
return "var " unless @class_name.is_a?(LiteralNode::NamespaceNode)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class ClassMethodNode # :nodoc:
|
82
|
-
def initialize(receiver, function_name, scope)
|
83
|
-
@receiver, @function_name = [receiver, function_name].build_nodes
|
84
|
-
@arguments = (scope.assoc(:block).assoc(:args)[1..-1] || []).build_nodes
|
85
|
-
@lines = (scope.assoc(:block)[2..-1] || []).build_nodes
|
86
|
-
end
|
87
|
-
|
88
|
-
def compile_node(options = {})
|
89
|
-
case false
|
90
|
-
when options[:as_attribute].nil?
|
91
|
-
"this.%s = function(%s) { %s; }"
|
92
|
-
when options[:as_prototype].nil?
|
93
|
-
"%s: function(%s) { %s; }"
|
94
|
-
when !(options[:as_attribute].nil? && options[:as_prototype].nil?)
|
95
|
-
"function %s(%s) { %s; }"
|
96
|
-
end % self.compile_internals
|
97
|
-
end
|
98
|
-
|
99
|
-
def compile_internals(options = {})
|
100
|
-
function_name = @function_name.compile_node
|
101
|
-
arguments = @arguments.compile_nodes.join(', ')
|
102
|
-
lines = @lines.compile_nodes.compact.join('; ')
|
103
|
-
return [function_name, arguments, lines]
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
class InstanceMethodNode # :nodoc:
|
108
|
-
def initialize(function_name, scope)
|
109
|
-
block = scope.assoc(:block)
|
110
|
-
@@rescue_is_safe = (block[2].first == :rescue)
|
111
|
-
@function_name = (function_name == :function ? nil : function_name).build_node
|
112
|
-
@arguments = (block.assoc(:args)[1..-1] || []).build_nodes
|
113
|
-
@lines = (block[2..-1] || []).build_nodes
|
114
|
-
end
|
115
|
-
|
116
|
-
def compile_node(options = {})
|
117
|
-
case false
|
118
|
-
when options[:as_attribute].nil?
|
119
|
-
"this.%s = function(%s) { %s; }"
|
120
|
-
when options[:as_prototype].nil?
|
121
|
-
"%s: function(%s) { %s; }"
|
122
|
-
when !(options[:as_attribute].nil? && options[:as_prototype].nil?)
|
123
|
-
"function %s(%s) { %s; }"
|
124
|
-
end % self.compile_internals
|
125
|
-
end
|
126
|
-
|
127
|
-
def compile_internals(options = {})
|
128
|
-
function_name = @function_name.compile_node
|
129
|
-
arguments = @arguments.compile_nodes.join(', ')
|
130
|
-
lines = @lines.compile_nodes.compact.join('; ')
|
131
|
-
return [function_name, arguments, lines]
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
class ModuleNode # :nodoc:
|
136
|
-
def initialize(module_name, scope)
|
137
|
-
old_module = @@red_module
|
138
|
-
@@red_module = module_name
|
139
|
-
@module_name, @scope = [module_name, scope].build_nodes
|
140
|
-
@@red_module = old_module
|
141
|
-
end
|
142
|
-
|
143
|
-
def compile_node(options = {})
|
144
|
-
return "%s" % self.compile_internals
|
145
|
-
end
|
146
|
-
|
147
|
-
def compile_internals(options = {})
|
148
|
-
old_module = @@red_module
|
149
|
-
@@red_module = @module_name.compile_node
|
150
|
-
scope = @scope.compile_node
|
151
|
-
@@red_module = old_module
|
152
|
-
return [scope]
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
|
157
|
-
class ObjectLiteralNode # :nodoc:
|
158
|
-
def initialize(receiver, scope)
|
159
|
-
old_class = @@red_class
|
160
|
-
@@red_class = @class = receiver.build_node.compile_node
|
161
|
-
block_node = scope.assoc(:block) || scope
|
162
|
-
properties = block_node.select {|node| (node.first == :cvdecl) rescue false }
|
163
|
-
functions = block_node.select {|node| ![:block, :scope].include?(node) }
|
164
|
-
@slots = (properties | functions).build_nodes
|
165
|
-
@@red_class = old_class
|
166
|
-
end
|
167
|
-
|
168
|
-
def compile_node(options = {})
|
169
|
-
old_class = @@red_class
|
170
|
-
@@red_class = @class
|
171
|
-
slots = @slots.compile_nodes(:as_prototype => true).compact.join(', ')
|
172
|
-
@@red_class = old_class
|
173
|
-
return "{ %s }" % [slots]
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
data/lib/red/illegal_nodes.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
module Red
|
2
|
-
class IllegalNode # :nodoc:
|
3
|
-
class BlockArgument < IllegalNode # :nodoc:
|
4
|
-
def initialize(*args)
|
5
|
-
raise(BuildError::NoBlockArguments, "JavaScript does not support block arguments")
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
class FlipflopNode < IllegalNode # :nodoc:
|
10
|
-
def initialize(*args)
|
11
|
-
raise(BuildError::NoFlipflops, "JavaScript does not support flip-flop operators")
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class MatchNode < IllegalNode # :nodoc:
|
16
|
-
def initialize(*args)
|
17
|
-
raise(BuildError::NoArbitraryMatch, "JavaScript does not support arbitrary boolean matching")
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class MultipleAssignmentNode < IllegalNode # :nodoc:
|
22
|
-
def initialize(*args)
|
23
|
-
raise(BuildError::NoMultipleAssignment, "JavaScript does not support catalogued assignment using multiple comma-separated expressions")
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class PostexeNode < IllegalNode # :nodoc:
|
28
|
-
def initialize(*args)
|
29
|
-
raise(BuildError::NoBEGINorEND, "BEGIN and END blocks are not supported")
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class RedoNode < IllegalNode # :nodoc:
|
34
|
-
def initialize(*args)
|
35
|
-
raise(BuildError::NoDoOvers, "JavaScript has no redo keyword")
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class RegexEvaluationNode < IllegalNode # :nodoc:
|
40
|
-
def initialize(*args)
|
41
|
-
raise(BuildError::NoRegexEvaluation, "Construction of JavaScript regular expressions with evaluated content is not supported")
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class RetryNode < IllegalNode # :nodoc:
|
46
|
-
def initialize(*args)
|
47
|
-
raise(BuildError::NoDoOvers, "JavaScript has no retry keyword")
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class SymbolEvaluationNode < IllegalNode # :nodoc:
|
52
|
-
def initialize(*args)
|
53
|
-
raise(BuildError::NoSymbolEvaluation, "Construction of JavaScript identifiers through evaluated symbols is not supported")
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class UndefNode < IllegalNode # :nodoc:
|
58
|
-
def initialize(*args)
|
59
|
-
raise(BuildError::NoUndef, "JavaScript does not support undefinition of methods")
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
data/lib/red/literal_nodes.rb
DELETED
@@ -1,119 +0,0 @@
|
|
1
|
-
module Red
|
2
|
-
class LiteralNode # :nodoc:
|
3
|
-
def initialize(*elements)
|
4
|
-
@initial = elements.shift.build_node
|
5
|
-
@subsequent = elements.build_nodes
|
6
|
-
end
|
7
|
-
|
8
|
-
def compile_node(options = {})
|
9
|
-
content = @initial.compile_node(options)
|
10
|
-
return "%s" % [content]
|
11
|
-
end
|
12
|
-
|
13
|
-
def data_type
|
14
|
-
return :node unless @initial.is_a?(DataNode)
|
15
|
-
case @initial
|
16
|
-
when DataNode::NilNode : :nil
|
17
|
-
when DataNode::RangeNode : :range
|
18
|
-
when DataNode::StringNode : (@subsequent.empty? ? :string : :eval)
|
19
|
-
when DataNode::SymbolNode : :symbol
|
20
|
-
else @initial.value.is_a?(Numeric) ? :numeric : :regexp
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class ArrayNode < LiteralNode # :nodoc:
|
25
|
-
def compile_node(options = {})
|
26
|
-
elements = @subsequent.unshift(@initial).compile_nodes.reject {|element| element.empty? }.join(', ')
|
27
|
-
return "[%s]" % [elements]
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
class HashNode < LiteralNode # :nodoc:
|
32
|
-
def initialize(*array)
|
33
|
-
@hash = {}
|
34
|
-
Hash[*array].each do |k,v|
|
35
|
-
key, value = [k,v].build_nodes
|
36
|
-
raise(BuildError::NoArbitraryHashKeys, "JavaScript does not support non-string objects as hash keys") unless [:string, :symbol].include?(key.data_type)
|
37
|
-
@hash[key] = value
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def compile_node(options = {})
|
42
|
-
pairs = @hash.map { |k,v| "%s: %s" % [k.compile_node(:quotes => "'"), v.compile_node(:as_argument => true)] }.join(', ')
|
43
|
-
"{ %s }" % [pairs]
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
class MultilineNode < LiteralNode # :nodoc:
|
48
|
-
def compile_node(options = {})
|
49
|
-
lines = @subsequent.unshift(@initial).compile_nodes(options).compact.join('; ')
|
50
|
-
return "%s" % [lines]
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
class NamespaceNode < LiteralNode # :nodoc:
|
55
|
-
def compile_node(options = {})
|
56
|
-
namespaces = @initial.compile_node
|
57
|
-
class_name = @subsequent.first.compile_node
|
58
|
-
return "%s.%s" % [namespaces, class_name]
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
class OtherNode < LiteralNode # :nodoc:
|
63
|
-
end
|
64
|
-
|
65
|
-
class RangeNode < LiteralNode # :nodoc:
|
66
|
-
def initialize(*args)
|
67
|
-
case @@red_library
|
68
|
-
when :Prototype : super(*args)
|
69
|
-
else raise(BuildError::NoRangeConstructor, "#{@@red_library} JavaScript library has no literal range constructor")
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def compile_node(options = {})
|
74
|
-
start = @initial.compile_node(:as_argument => true)
|
75
|
-
finish = @subsequent.first.compile_node(:as_argument => true)
|
76
|
-
case @@red_library
|
77
|
-
when :Prototype : return "$R(%s, %s)" % [start, finish]
|
78
|
-
else ""
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
class ExclusiveNode < RangeNode # :nodoc:
|
83
|
-
def compile_node(options = {})
|
84
|
-
start = @initial.compile_node(:as_argument => true)
|
85
|
-
finish = @subsequent.first.compile_node(:as_argument => true)
|
86
|
-
case @@red_library
|
87
|
-
when :Prototype : return "$R(%s, %s, true)" % [start, finish]
|
88
|
-
else ""
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
class SplatNode < LiteralNode # :nodoc:
|
95
|
-
def initialize(*args)
|
96
|
-
case @@red_library
|
97
|
-
when :Prototype : super(*args)
|
98
|
-
else raise(BuildError::NoSplatConstructor, "Splat array constructor not supported for #{@@red_library} JavaScript library")
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def compile_node(options = {})
|
103
|
-
initial = @initial.compile_node
|
104
|
-
case @@red_library
|
105
|
-
when :Prototype : return "$A(%s)" % [initial]
|
106
|
-
else ""
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
class StringNode < LiteralNode # :nodoc:
|
112
|
-
def compile_node(options = {})
|
113
|
-
initial = @initial.compile_node(options)
|
114
|
-
subsequent = @subsequent.map {|element| " + %s" % [element.compile_node]}.join
|
115
|
-
return "%s%s" % [initial, subsequent]
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
data/lib/red/variable_nodes.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module Red
|
2
|
-
class VariableNode # :nodoc:
|
3
|
-
def initialize(variable_name)
|
4
|
-
@variable_name = variable_name.build_node
|
5
|
-
end
|
6
|
-
|
7
|
-
def compile_node(options = {})
|
8
|
-
return "%s" % self.compile_internals
|
9
|
-
end
|
10
|
-
|
11
|
-
def compile_internals(options = {})
|
12
|
-
return [@variable_name.compile_node]
|
13
|
-
end
|
14
|
-
|
15
|
-
class ClassVariableNode < VariableNode # :nodoc:
|
16
|
-
def compile_node(options = {})
|
17
|
-
return "%s.%s" % self.compile_internals
|
18
|
-
end
|
19
|
-
|
20
|
-
def compile_internals(options = {})
|
21
|
-
return [@@red_class, @variable_name.compile_node]
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class InstanceVariableNode < VariableNode # :nodoc:
|
26
|
-
def compile_node(options = {})
|
27
|
-
return "this.%s" % self.compile_internals
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
class GlobalVariableNode < VariableNode # :nodoc:
|
32
|
-
end
|
33
|
-
|
34
|
-
class OtherVariableNode < VariableNode # :nodoc:
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|