to_source 0.2.15 → 0.2.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/.gitignore +6 -6
  2. data/Changelog.md +4 -0
  3. data/README.md +1 -1
  4. data/bin/to_source +1 -0
  5. data/config/flay.yml +1 -1
  6. data/config/flog.yml +1 -1
  7. data/config/roodi.yml +4 -4
  8. data/config/site.reek +5 -2
  9. data/config/yardstick.yml +1 -1
  10. data/lib/to_source.rb +1 -1
  11. data/lib/to_source/command.rb +63 -1
  12. data/lib/to_source/emitter.rb +221 -32
  13. data/lib/to_source/emitter/access.rb +8 -0
  14. data/lib/to_source/emitter/actual_arguments.rb +51 -8
  15. data/lib/to_source/emitter/alias.rb +11 -2
  16. data/lib/to_source/emitter/assignment.rb +62 -22
  17. data/lib/to_source/emitter/attribute_assignment.rb +11 -2
  18. data/lib/to_source/emitter/begin.rb +34 -14
  19. data/lib/to_source/emitter/binary_operator.rb +34 -17
  20. data/lib/to_source/emitter/binary_operator_method.rb +36 -17
  21. data/lib/to_source/emitter/block.rb +7 -0
  22. data/lib/to_source/emitter/block_argument.rb +7 -0
  23. data/lib/to_source/emitter/block_pass.rb +7 -0
  24. data/lib/to_source/emitter/case.rb +85 -0
  25. data/lib/to_source/emitter/class.rb +21 -6
  26. data/lib/to_source/emitter/concat_arguments.rb +11 -3
  27. data/lib/to_source/emitter/default_arguments.rb +7 -0
  28. data/lib/to_source/emitter/define.rb +46 -8
  29. data/lib/to_source/emitter/defined.rb +7 -0
  30. data/lib/to_source/emitter/element_assignment.rb +10 -1
  31. data/lib/to_source/emitter/element_reference.rb +10 -1
  32. data/lib/to_source/emitter/empty_body.rb +9 -0
  33. data/lib/to_source/emitter/ensure.rb +34 -7
  34. data/lib/to_source/emitter/ensure_body.rb +14 -5
  35. data/lib/to_source/emitter/execute_string.rb +9 -0
  36. data/lib/to_source/emitter/formal_arguments.rb +131 -39
  37. data/lib/to_source/emitter/if.rb +59 -14
  38. data/lib/to_source/emitter/iter.rb +10 -3
  39. data/lib/to_source/emitter/keyword_value.rb +28 -4
  40. data/lib/to_source/emitter/literal.rb +99 -14
  41. data/lib/to_source/emitter/literal/dynamic.rb +88 -13
  42. data/lib/to_source/emitter/loop.rb +14 -11
  43. data/lib/to_source/emitter/match3.rb +7 -0
  44. data/lib/to_source/emitter/module.rb +10 -3
  45. data/lib/to_source/emitter/multiple_assignment.rb +19 -0
  46. data/lib/to_source/emitter/nth_ref.rb +7 -0
  47. data/lib/to_source/emitter/op_assign1.rb +7 -0
  48. data/lib/to_source/emitter/op_assign2.rb +7 -0
  49. data/lib/to_source/emitter/pattern_arguments.rb +7 -0
  50. data/lib/to_source/emitter/rescue.rb +10 -4
  51. data/lib/to_source/emitter/rescue_condition.rb +40 -3
  52. data/lib/to_source/emitter/scope.rb +7 -0
  53. data/lib/to_source/emitter/scope_name.rb +7 -0
  54. data/lib/to_source/emitter/scoped_name.rb +7 -0
  55. data/lib/to_source/emitter/send.rb +71 -5
  56. data/lib/to_source/emitter/send_with_arguments.rb +53 -7
  57. data/lib/to_source/emitter/singleton_class.rb +17 -5
  58. data/lib/to_source/emitter/splat.rb +7 -0
  59. data/lib/to_source/emitter/splat_when.rb +7 -0
  60. data/lib/to_source/emitter/static.rb +19 -0
  61. data/lib/to_source/emitter/super.rb +49 -4
  62. data/lib/to_source/emitter/to_array.rb +7 -0
  63. data/lib/to_source/emitter/to_string.rb +7 -0
  64. data/lib/to_source/emitter/toplevel.rb +9 -0
  65. data/lib/to_source/emitter/unary_operator_method.rb +7 -0
  66. data/lib/to_source/emitter/unless.rb +23 -4
  67. data/lib/to_source/emitter/util.rb +8 -0
  68. data/lib/to_source/emitter/when.rb +28 -3
  69. data/lib/to_source/emitter/yield.rb +9 -0
  70. data/lib/to_source/emitter/z_super.rb +7 -0
  71. data/lib/to_source/state.rb +95 -11
  72. data/spec/unit/to_source/class_methods/run_spec.rb +13 -0
  73. data/to_source.gemspec +1 -1
  74. metadata +3 -4
  75. data/lib/to_source/buffer.rb +0 -40
  76. data/lib/to_source/emitter/receiver_case.rb +0 -35
@@ -1,32 +1,57 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for when nodes
3
4
  class When < self
4
5
 
5
6
  handle(Rubinius::AST::When)
6
7
 
7
8
  private
8
9
 
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
9
16
  def dispatch
10
17
  emit('when ')
11
18
  emit_single
12
19
  emit_conditions
13
20
  emit_splat
14
- indent
15
- visit(node.body)
16
- unindent
21
+ indented do
22
+ visit(node.body)
23
+ end
17
24
  end
18
25
 
26
+ # Emit single
27
+ #
28
+ # @return [undefined]
29
+ #
30
+ # @api private
31
+ #
19
32
  def emit_single
20
33
  single = node.single
21
34
  visit(single) if single
22
35
  end
23
36
 
37
+ # Emit splat
38
+ #
39
+ # @return [undefined]
40
+ #
41
+ # @api private
42
+ #
24
43
  def emit_splat
25
44
  splat = node.splat
26
45
  return unless splat
27
46
  visit(splat)
28
47
  end
29
48
 
49
+ # Emit conditions
50
+ #
51
+ # @return [undefined]
52
+ #
53
+ # @api private
54
+ #
30
55
  def emit_conditions
31
56
  conditions = node.conditions
32
57
  return unless conditions
@@ -1,9 +1,18 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for yield nodes
3
4
  class Yield < self
4
5
 
5
6
  handle(Rubinius::AST::Yield)
6
7
 
8
+ private
9
+
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
7
16
  def dispatch
8
17
  emit('yield')
9
18
  arguments = node.arguments
@@ -1,11 +1,18 @@
1
1
  module ToSource
2
2
  class Emitter
3
+ # Emitter for zsuper nodes
3
4
  class ZSuper < self
4
5
 
5
6
  handle(Rubinius::AST::ZSuper)
6
7
 
7
8
  private
8
9
 
10
+ # Perform dispatch
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
9
16
  def dispatch
10
17
  emit('super')
11
18
  block = node.block
@@ -1,55 +1,139 @@
1
1
  module ToSource
2
+ # Emitter state
2
3
  class State
3
4
 
5
+ # Return last command
6
+ #
7
+ # @return [Command]
8
+ #
9
+ # @api private
10
+ #
4
11
  attr_reader :last
12
+
13
+ # Return current indentation level
14
+ #
15
+ # @return [Fixnum]
16
+ #
17
+ # @api private
18
+ #
5
19
  attr_reader :identation
20
+
21
+ # Return buffer
22
+ #
23
+ # @return [Array]
24
+ #
25
+ # @api private
26
+ #
6
27
  attr_reader :buffer
7
28
 
29
+ # Initialize object
30
+ #
31
+ # @return [undefined]
32
+ #
33
+ # @api private
34
+ #
8
35
  def initialize
9
36
  @last = Command::NULL
10
37
  @indentation = 0
11
38
  @buffer = []
12
39
  end
13
40
 
41
+ # Execute command
42
+ #
43
+ # @param [Command] command
44
+ #
45
+ # @return [self]
46
+ #
47
+ # @api private
48
+ #
14
49
  def execute(command)
15
50
  command.run(self)
16
51
  @last = command
52
+ self
17
53
  end
18
54
 
19
- def last_keyword?
20
- last.kind_of?(Command::Token::Keyword)
21
- end
22
-
55
+ # Write string to buffer
56
+ #
57
+ # @param [String] string
58
+ #
59
+ # @return [self]
60
+ #
61
+ # @api private
62
+ #
23
63
  def write(string)
24
64
  @buffer << string
65
+ self
25
66
  end
26
67
 
27
- def space
28
- write(' ')
68
+ # Return source
69
+ #
70
+ # @return [String]
71
+ #
72
+ # @api private
73
+ #
74
+ def source
75
+ buffer.join('')
29
76
  end
30
77
 
78
+ # Push command
79
+ #
80
+ # @param [Command] command
81
+ #
82
+ # @return [self]
83
+ #
84
+ # @api private
85
+ #
31
86
  def push(command)
32
87
  indent
33
88
  write(command.content)
89
+ self
34
90
  end
35
-
91
+
92
+ # Indent line if needed
93
+ #
94
+ # @return [self]
95
+ #
96
+ # @api private
97
+ #
36
98
  def indent
37
99
  return unless blank?
38
100
  write(' ' * @indentation)
101
+ self
39
102
  end
40
103
 
104
+ # Test for blank line
105
+ #
106
+ # @return [true]
107
+ # if line is blank
108
+ #
109
+ # @return [false]
110
+ # otherwise
111
+ #
112
+ # @api private
113
+ #
41
114
  def blank?
42
115
  buffer.last == "\n"
43
116
  end
44
117
 
118
+ # Write newline
119
+ #
120
+ # @return [self]
121
+ #
122
+ # @api private
123
+ #
45
124
  def new_line
46
125
  write("\n")
126
+ self
47
127
  end
48
128
 
49
- def source
50
- buffer.join('')
51
- end
52
-
129
+ # Perform shift by width
130
+ #
131
+ # @param [Fixnum] width
132
+ #
133
+ # @return [self]
134
+ #
135
+ # @api private
136
+ #
53
137
  def shift(width)
54
138
  @indentation += width
55
139
  @indentation = 0 if @indentation < 0
@@ -814,6 +814,19 @@ describe ToSource,'.to_source' do
814
814
  end
815
815
 
816
816
  context 'case statement' do
817
+ context 'without else branch' do
818
+ assert_source <<-RUBY
819
+ case
820
+ when bar
821
+ baz
822
+ when baz
823
+ bar
824
+ end
825
+ RUBY
826
+ end
827
+ end
828
+
829
+ context 'receiver case statement' do
817
830
  context 'without else branch' do
818
831
  assert_source <<-RUBY
819
832
  case foo
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = 'to_source'
4
- s.version = '0.2.15'
4
+ s.version = '0.2.16'
5
5
  s.authors = ['Markus Schirp']
6
6
  s.email = ['mbj@seonic.net']
7
7
  s.homepage = 'http://github.com/mbj/to_source'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: to_source
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.15
4
+ version: 0.2.16
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-24 00:00:00.000000000 Z
12
+ date: 2013-01-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: adamantium
@@ -104,7 +104,6 @@ files:
104
104
  - config/site.reek
105
105
  - config/yardstick.yml
106
106
  - lib/to_source.rb
107
- - lib/to_source/buffer.rb
108
107
  - lib/to_source/command.rb
109
108
  - lib/to_source/emitter.rb
110
109
  - lib/to_source/emitter/access.rb
@@ -118,6 +117,7 @@ files:
118
117
  - lib/to_source/emitter/block.rb
119
118
  - lib/to_source/emitter/block_argument.rb
120
119
  - lib/to_source/emitter/block_pass.rb
120
+ - lib/to_source/emitter/case.rb
121
121
  - lib/to_source/emitter/class.rb
122
122
  - lib/to_source/emitter/concat_arguments.rb
123
123
  - lib/to_source/emitter/default_arguments.rb
@@ -143,7 +143,6 @@ files:
143
143
  - lib/to_source/emitter/op_assign1.rb
144
144
  - lib/to_source/emitter/op_assign2.rb
145
145
  - lib/to_source/emitter/pattern_arguments.rb
146
- - lib/to_source/emitter/receiver_case.rb
147
146
  - lib/to_source/emitter/rescue.rb
148
147
  - lib/to_source/emitter/rescue_condition.rb
149
148
  - lib/to_source/emitter/scope.rb
@@ -1,40 +0,0 @@
1
- module ToSource
2
- class Buffer
3
- include Adamantium::Flat
4
-
5
- attr_reader :lines
6
-
7
- def initialize(lines = [])
8
- @lines = lines
9
- end
10
-
11
- def to_s
12
- @lines.join("\n")
13
- end
14
-
15
- def indent
16
- new(lines.map { |line| " #{line}" })
17
- end
18
-
19
- def body(body)
20
- self
21
- end
22
-
23
- def class_open(name, superclass)
24
- push('class')
25
- end
26
-
27
- def push(token)
28
- new(lines.dup << token)
29
- end
30
-
31
- def end
32
- push('end')
33
- end
34
-
35
- def new(*args)
36
- self.class.new(*args)
37
- end
38
-
39
- end
40
- end
@@ -1,35 +0,0 @@
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