to_source 0.2.9 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
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