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.
Files changed (71) hide show
  1. data/Changelog.md +13 -0
  2. data/LICENSE +21 -0
  3. data/README.md +6 -22
  4. data/TODO +3 -3
  5. data/lib/to_source.rb +68 -3
  6. data/lib/to_source/buffer.rb +40 -0
  7. data/lib/to_source/command.rb +44 -0
  8. data/lib/to_source/emitter.rb +76 -0
  9. data/lib/to_source/emitter/access.rb +20 -0
  10. data/lib/to_source/emitter/actual_arguments.rb +46 -0
  11. data/lib/to_source/emitter/alias.rb +18 -0
  12. data/lib/to_source/emitter/assignment.rb +77 -0
  13. data/lib/to_source/emitter/attribute_assignment.rb +19 -0
  14. data/lib/to_source/emitter/begin.rb +51 -0
  15. data/lib/to_source/emitter/binary_operator.rb +36 -0
  16. data/lib/to_source/emitter/binary_operator_method.rb +29 -0
  17. data/lib/to_source/emitter/block.rb +22 -0
  18. data/lib/to_source/emitter/block_argument.rb +16 -0
  19. data/lib/to_source/emitter/block_pass.rb +16 -0
  20. data/lib/to_source/emitter/class.rb +29 -0
  21. data/lib/to_source/emitter/concat_arguments.rb +20 -0
  22. data/lib/to_source/emitter/default_arguments.rb +15 -0
  23. data/lib/to_source/emitter/define.rb +61 -0
  24. data/lib/to_source/emitter/defined.rb +17 -0
  25. data/lib/to_source/emitter/element_assignment.rb +20 -0
  26. data/lib/to_source/emitter/element_reference.rb +16 -0
  27. data/lib/to_source/emitter/empty_body.rb +12 -0
  28. data/lib/to_source/emitter/ensure.rb +23 -0
  29. data/lib/to_source/emitter/ensure_body.rb +18 -0
  30. data/lib/to_source/emitter/execute_string.rb +13 -0
  31. data/lib/to_source/emitter/formal_arguments.rb +120 -0
  32. data/lib/to_source/emitter/if.rb +51 -0
  33. data/lib/to_source/emitter/iter.rb +20 -0
  34. data/lib/to_source/emitter/keyword_value.rb +43 -0
  35. data/lib/to_source/emitter/literal.rb +239 -0
  36. data/lib/to_source/emitter/match3.rb +17 -0
  37. data/lib/to_source/emitter/module.rb +21 -0
  38. data/lib/to_source/emitter/multiple_assignment.rb +23 -0
  39. data/lib/to_source/emitter/nth_ref.rb +15 -0
  40. data/lib/to_source/emitter/op_assign1.rb +19 -0
  41. data/lib/to_source/emitter/op_assign2.rb +19 -0
  42. data/lib/to_source/emitter/pattern_arguments.rb +17 -0
  43. data/lib/to_source/emitter/receiver_case.rb +35 -0
  44. data/lib/to_source/emitter/rescue.rb +21 -0
  45. data/lib/to_source/emitter/rescue_condition.rb +56 -0
  46. data/lib/to_source/emitter/scope.rb +17 -0
  47. data/lib/to_source/emitter/scope_name.rb +16 -0
  48. data/lib/to_source/emitter/scoped_name.rb +17 -0
  49. data/lib/to_source/emitter/send.rb +47 -0
  50. data/lib/to_source/emitter/send_with_arguments.rb +62 -0
  51. data/lib/to_source/emitter/singleton_class.rb +23 -0
  52. data/lib/to_source/emitter/splat.rb +17 -0
  53. data/lib/to_source/emitter/splat_when.rb +16 -0
  54. data/lib/to_source/emitter/static.rb +33 -0
  55. data/lib/to_source/emitter/super.rb +47 -0
  56. data/lib/to_source/emitter/to_array.rb +15 -0
  57. data/lib/to_source/emitter/to_string.rb +17 -0
  58. data/lib/to_source/emitter/toplevel.rb +15 -0
  59. data/lib/to_source/emitter/unary_operator_method.rb +20 -0
  60. data/lib/to_source/emitter/unless.rb +16 -0
  61. data/lib/to_source/emitter/until.rb +20 -0
  62. data/lib/to_source/emitter/util.rb +19 -0
  63. data/lib/to_source/emitter/when.rb +38 -0
  64. data/lib/to_source/emitter/while.rb +20 -0
  65. data/lib/to_source/emitter/yield.rb +19 -0
  66. data/lib/to_source/emitter/z_super.rb +17 -0
  67. data/lib/to_source/state.rb +60 -0
  68. data/spec/unit/to_source/{visitor/class_methods → class_methods}/run_spec.rb +84 -33
  69. data/to_source.gemspec +14 -12
  70. metadata +106 -11
  71. data/lib/to_source/visitor.rb +0 -1890
@@ -0,0 +1,17 @@
1
+ module ToSource
2
+ class Emitter
3
+ class Match3 < self
4
+
5
+ handle(Rubinius::AST::Match3)
6
+
7
+ private
8
+
9
+ def dispatch
10
+ visit(node.value)
11
+ emit(' =~ ')
12
+ visit(node.pattern)
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -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,15 @@
1
+ module ToSource
2
+ class Emitter
3
+ class NthRef < self
4
+
5
+ handle(Rubinius::AST::NthRef)
6
+
7
+ private
8
+
9
+ def dispatch
10
+ emit("$#{node.which}")
11
+ end
12
+
13
+ end
14
+ end
15
+ 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,17 @@
1
+ module ToSource
2
+ class Emitter
3
+ class PatternArguments < self
4
+
5
+ handle(Rubinius::AST::PatternArguments)
6
+
7
+ private
8
+
9
+ def dispatch
10
+ emit('(')
11
+ run(Util::DelimitedBody, node.arguments.body)
12
+ emit(')')
13
+ end
14
+
15
+ end
16
+ end
17
+ 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 Scope < self
4
+
5
+ handle(Rubinius::AST::ClassScope)
6
+ handle(Rubinius::AST::ModuleScope)
7
+ handle(Rubinius::AST::SClassScope)
8
+
9
+ private
10
+
11
+ def dispatch
12
+ visit(node.body)
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module ToSource
2
+ class Emitter
3
+ class ScopeName < self
4
+
5
+ handle(Rubinius::AST::ClassName)
6
+ handle(Rubinius::AST::ModuleName)
7
+
8
+ private
9
+
10
+ def dispatch
11
+ emit(node.name)
12
+ end
13
+
14
+ end
15
+ end
16
+ 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