red 3.5.0 → 4.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/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
|