to_source 0.2.9 → 0.2.11
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/Changelog.md +13 -0
- data/LICENSE +21 -0
- data/README.md +6 -22
- data/TODO +3 -3
- data/lib/to_source.rb +68 -3
- data/lib/to_source/buffer.rb +40 -0
- data/lib/to_source/command.rb +44 -0
- data/lib/to_source/emitter.rb +76 -0
- data/lib/to_source/emitter/access.rb +20 -0
- data/lib/to_source/emitter/actual_arguments.rb +46 -0
- data/lib/to_source/emitter/alias.rb +18 -0
- data/lib/to_source/emitter/assignment.rb +77 -0
- data/lib/to_source/emitter/attribute_assignment.rb +19 -0
- data/lib/to_source/emitter/begin.rb +51 -0
- data/lib/to_source/emitter/binary_operator.rb +36 -0
- data/lib/to_source/emitter/binary_operator_method.rb +29 -0
- data/lib/to_source/emitter/block.rb +22 -0
- data/lib/to_source/emitter/block_argument.rb +16 -0
- data/lib/to_source/emitter/block_pass.rb +16 -0
- data/lib/to_source/emitter/class.rb +29 -0
- data/lib/to_source/emitter/concat_arguments.rb +20 -0
- data/lib/to_source/emitter/default_arguments.rb +15 -0
- data/lib/to_source/emitter/define.rb +61 -0
- data/lib/to_source/emitter/defined.rb +17 -0
- data/lib/to_source/emitter/element_assignment.rb +20 -0
- data/lib/to_source/emitter/element_reference.rb +16 -0
- data/lib/to_source/emitter/empty_body.rb +12 -0
- data/lib/to_source/emitter/ensure.rb +23 -0
- data/lib/to_source/emitter/ensure_body.rb +18 -0
- data/lib/to_source/emitter/execute_string.rb +13 -0
- data/lib/to_source/emitter/formal_arguments.rb +120 -0
- data/lib/to_source/emitter/if.rb +51 -0
- data/lib/to_source/emitter/iter.rb +20 -0
- data/lib/to_source/emitter/keyword_value.rb +43 -0
- data/lib/to_source/emitter/literal.rb +239 -0
- data/lib/to_source/emitter/match3.rb +17 -0
- data/lib/to_source/emitter/module.rb +21 -0
- data/lib/to_source/emitter/multiple_assignment.rb +23 -0
- data/lib/to_source/emitter/nth_ref.rb +15 -0
- data/lib/to_source/emitter/op_assign1.rb +19 -0
- data/lib/to_source/emitter/op_assign2.rb +19 -0
- data/lib/to_source/emitter/pattern_arguments.rb +17 -0
- data/lib/to_source/emitter/receiver_case.rb +35 -0
- data/lib/to_source/emitter/rescue.rb +21 -0
- data/lib/to_source/emitter/rescue_condition.rb +56 -0
- data/lib/to_source/emitter/scope.rb +17 -0
- data/lib/to_source/emitter/scope_name.rb +16 -0
- data/lib/to_source/emitter/scoped_name.rb +17 -0
- data/lib/to_source/emitter/send.rb +47 -0
- data/lib/to_source/emitter/send_with_arguments.rb +62 -0
- data/lib/to_source/emitter/singleton_class.rb +23 -0
- data/lib/to_source/emitter/splat.rb +17 -0
- data/lib/to_source/emitter/splat_when.rb +16 -0
- data/lib/to_source/emitter/static.rb +33 -0
- data/lib/to_source/emitter/super.rb +47 -0
- data/lib/to_source/emitter/to_array.rb +15 -0
- data/lib/to_source/emitter/to_string.rb +17 -0
- data/lib/to_source/emitter/toplevel.rb +15 -0
- data/lib/to_source/emitter/unary_operator_method.rb +20 -0
- data/lib/to_source/emitter/unless.rb +16 -0
- data/lib/to_source/emitter/until.rb +20 -0
- data/lib/to_source/emitter/util.rb +19 -0
- data/lib/to_source/emitter/when.rb +38 -0
- data/lib/to_source/emitter/while.rb +20 -0
- data/lib/to_source/emitter/yield.rb +19 -0
- data/lib/to_source/emitter/z_super.rb +17 -0
- data/lib/to_source/state.rb +60 -0
- data/spec/unit/to_source/{visitor/class_methods → class_methods}/run_spec.rb +84 -33
- data/to_source.gemspec +14 -12
- metadata +106 -11
- data/lib/to_source/visitor.rb +0 -1890
@@ -0,0 +1,21 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class Module < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::Module)
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def dispatch
|
10
|
+
emit(:module)
|
11
|
+
space
|
12
|
+
visit(node.name)
|
13
|
+
indent
|
14
|
+
visit(node.body)
|
15
|
+
unindent
|
16
|
+
emit_end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class MultipleAssignment < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::MultipleAssignment)
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def dispatch
|
10
|
+
body = node.left.body
|
11
|
+
run(Util::DelimitedBody, node.left.body)
|
12
|
+
emit(' = ')
|
13
|
+
right = node.right
|
14
|
+
if node.right.kind_of?(Rubinius::AST::ArrayLiteral)
|
15
|
+
run(Util::DelimitedBody, right.body)
|
16
|
+
else
|
17
|
+
visit(right)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class OpAssign1 < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::OpAssign1)
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def dispatch
|
10
|
+
visit(node.receiver)
|
11
|
+
emit('[')
|
12
|
+
visit(node.arguments.array.first)
|
13
|
+
emit('] ||= ')
|
14
|
+
visit(node.value)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class OpAssign2 < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::OpAssign2)
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def dispatch
|
10
|
+
visit(node.receiver)
|
11
|
+
emit('.')
|
12
|
+
emit(node.name)
|
13
|
+
emit(' |= ')
|
14
|
+
visit(node.value)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class ReceiverCase < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::ReceiverCase)
|
6
|
+
|
7
|
+
def dispatch
|
8
|
+
emit('case ')
|
9
|
+
visit(node.receiver)
|
10
|
+
emit_whens
|
11
|
+
emit_else
|
12
|
+
emit_end
|
13
|
+
end
|
14
|
+
|
15
|
+
def emit_else
|
16
|
+
body = node.else
|
17
|
+
return if body.kind_of?(Rubinius::AST::NilLiteral)
|
18
|
+
emit('else')
|
19
|
+
indent
|
20
|
+
visit(body)
|
21
|
+
unindent
|
22
|
+
end
|
23
|
+
|
24
|
+
def emit_whens
|
25
|
+
first = true
|
26
|
+
node.whens.each do |member|
|
27
|
+
new_line if first
|
28
|
+
first = false
|
29
|
+
visit(member)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
|
4
|
+
class Rescue < self
|
5
|
+
|
6
|
+
handle(Rubinius::AST::Rescue)
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def dispatch
|
11
|
+
emit('begin')
|
12
|
+
indent
|
13
|
+
visit(node.body)
|
14
|
+
unindent
|
15
|
+
visit(node.rescue)
|
16
|
+
emit_end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class RescueCondition < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::RescueCondition)
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def dispatch
|
10
|
+
emit('rescue')
|
11
|
+
emit_condition
|
12
|
+
emit_splat
|
13
|
+
emit_assignment
|
14
|
+
emit_body
|
15
|
+
emit_next
|
16
|
+
end
|
17
|
+
|
18
|
+
def emit_body
|
19
|
+
indent
|
20
|
+
visit(node.body)
|
21
|
+
unindent
|
22
|
+
end
|
23
|
+
|
24
|
+
def emit_condition
|
25
|
+
conditions = node.conditions || return
|
26
|
+
|
27
|
+
body = conditions.body
|
28
|
+
|
29
|
+
first = body.first
|
30
|
+
unless body.one? and first.kind_of?(Rubinius::AST::ConstantAccess) and first.name == :StandardError
|
31
|
+
emit(' ')
|
32
|
+
run(Util::DelimitedBody, body)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def emit_splat
|
37
|
+
splat = node.splat || return
|
38
|
+
emit(',') if node.conditions
|
39
|
+
emit(' ')
|
40
|
+
visit(node.splat)
|
41
|
+
end
|
42
|
+
|
43
|
+
def emit_assignment
|
44
|
+
assignment = node.assignment || return
|
45
|
+
emit(' => ')
|
46
|
+
emit(assignment.name)
|
47
|
+
end
|
48
|
+
|
49
|
+
def emit_next
|
50
|
+
condition = node.next || return
|
51
|
+
visit(node.next)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class ScopedName < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::ScopedClassName)
|
6
|
+
handle(Rubinius::AST::ScopedModuleName)
|
7
|
+
handle(Rubinius::AST::ScopedConstant)
|
8
|
+
|
9
|
+
def dispatch
|
10
|
+
visit(node.parent)
|
11
|
+
emit('::')
|
12
|
+
emit(node.name)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class Send < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::Send)
|
6
|
+
|
7
|
+
UNARY_OPERATORS = %w(
|
8
|
+
! ~ -@ +@
|
9
|
+
).map(&:to_sym).to_set.freeze
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def unary_operator_method?
|
14
|
+
UNARY_OPERATORS.include?(node.name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def dispatch
|
18
|
+
if unary_operator_method?
|
19
|
+
run(UnaryOperatorMethod, node)
|
20
|
+
return
|
21
|
+
end
|
22
|
+
|
23
|
+
normal_dispatch
|
24
|
+
end
|
25
|
+
|
26
|
+
def normal_dispatch
|
27
|
+
unless node.privately
|
28
|
+
visit(node.receiver)
|
29
|
+
emit('.')
|
30
|
+
end
|
31
|
+
|
32
|
+
emit(node.name)
|
33
|
+
emit_block
|
34
|
+
end
|
35
|
+
|
36
|
+
def emit_block
|
37
|
+
block = node.block
|
38
|
+
return unless block
|
39
|
+
pass = block.kind_of?(Rubinius::AST::BlockPass19)
|
40
|
+
emit('(') if pass
|
41
|
+
visit(node.block)
|
42
|
+
emit(')') if pass
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class SendWithArguments < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::SendWithArguments)
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def dispatch
|
10
|
+
if node.name == :[]
|
11
|
+
run(ElementReference, node)
|
12
|
+
return
|
13
|
+
end
|
14
|
+
if binary_operator_method?
|
15
|
+
run(BinaryOperatorMethod, node)
|
16
|
+
return
|
17
|
+
end
|
18
|
+
normal_dispatch
|
19
|
+
end
|
20
|
+
|
21
|
+
BINARY_OPERATORS = %w(
|
22
|
+
+ - * / & | && || << >> ==
|
23
|
+
=== != <= < <=> > >= =~ !~ ^
|
24
|
+
**
|
25
|
+
).map(&:to_sym).to_set
|
26
|
+
|
27
|
+
def binary_operator_method?
|
28
|
+
BINARY_OPERATORS.include?(node.name)
|
29
|
+
end
|
30
|
+
|
31
|
+
def emit_receiver
|
32
|
+
unless node.privately
|
33
|
+
visit(node.receiver)
|
34
|
+
emit('.')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def normal_dispatch
|
39
|
+
emit_receiver
|
40
|
+
emit(node.name)
|
41
|
+
emit_arguments
|
42
|
+
end
|
43
|
+
|
44
|
+
def emit_arguments
|
45
|
+
emit('(')
|
46
|
+
emitter = visit(node.arguments)
|
47
|
+
emit_block_pass(emitter)
|
48
|
+
emit(')')
|
49
|
+
end
|
50
|
+
|
51
|
+
def emit_block_pass(emitter)
|
52
|
+
block = node.block
|
53
|
+
|
54
|
+
if block && block.kind_of?(Rubinius::AST::BlockPass19)
|
55
|
+
emit(', ') if emitter.any?
|
56
|
+
visit(block)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
|
4
|
+
class SingletonClass < self
|
5
|
+
|
6
|
+
handle(Rubinius::AST::SClass)
|
7
|
+
|
8
|
+
def dispatch
|
9
|
+
emit(:class)
|
10
|
+
space
|
11
|
+
emit(:<<)
|
12
|
+
space
|
13
|
+
visit(node.receiver)
|
14
|
+
indent
|
15
|
+
# FIXME: attr_reader missing on Rubinius::AST::SClass
|
16
|
+
visit(node.instance_variable_get(:@body))
|
17
|
+
unindent
|
18
|
+
emit_end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|