unparser 0.4.9 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/bin/unparser +1 -1
  3. data/lib/unparser.rb +98 -61
  4. data/lib/unparser/ast.rb +0 -1
  5. data/lib/unparser/ast/local_variable_scope.rb +6 -76
  6. data/lib/unparser/buffer.rb +19 -16
  7. data/lib/unparser/cli.rb +26 -39
  8. data/lib/unparser/color.rb +0 -3
  9. data/lib/unparser/comments.rb +0 -26
  10. data/lib/unparser/constants.rb +4 -53
  11. data/lib/unparser/diff.rb +0 -17
  12. data/lib/unparser/dsl.rb +0 -32
  13. data/lib/unparser/emitter.rb +23 -425
  14. data/lib/unparser/emitter/alias.rb +2 -8
  15. data/lib/unparser/emitter/args.rb +45 -0
  16. data/lib/unparser/emitter/argument.rb +8 -166
  17. data/lib/unparser/emitter/array.rb +27 -0
  18. data/lib/unparser/emitter/array_pattern.rb +29 -0
  19. data/lib/unparser/emitter/assignment.rb +36 -127
  20. data/lib/unparser/emitter/begin.rb +9 -84
  21. data/lib/unparser/emitter/binary.rb +7 -20
  22. data/lib/unparser/emitter/block.rb +57 -41
  23. data/lib/unparser/emitter/case.rb +6 -48
  24. data/lib/unparser/emitter/case_guard.rb +27 -0
  25. data/lib/unparser/emitter/case_match.rb +40 -0
  26. data/lib/unparser/emitter/cbase.rb +1 -3
  27. data/lib/unparser/emitter/class.rb +6 -26
  28. data/lib/unparser/emitter/const_pattern.rb +24 -0
  29. data/lib/unparser/emitter/def.rb +7 -51
  30. data/lib/unparser/emitter/defined.rb +2 -12
  31. data/lib/unparser/emitter/dstr.rb +22 -0
  32. data/lib/unparser/emitter/dsym.rb +41 -0
  33. data/lib/unparser/emitter/flipflop.rb +11 -10
  34. data/lib/unparser/emitter/float.rb +29 -0
  35. data/lib/unparser/emitter/flow_modifier.rb +8 -55
  36. data/lib/unparser/emitter/for.rb +5 -19
  37. data/lib/unparser/emitter/hash.rb +74 -0
  38. data/lib/unparser/emitter/hash_pattern.rb +67 -0
  39. data/lib/unparser/emitter/hookexe.rb +5 -11
  40. data/lib/unparser/emitter/if.rb +9 -73
  41. data/lib/unparser/emitter/in_match.rb +21 -0
  42. data/lib/unparser/emitter/in_pattern.rb +34 -0
  43. data/lib/unparser/emitter/index.rb +21 -88
  44. data/lib/unparser/emitter/kwbegin.rb +31 -0
  45. data/lib/unparser/emitter/lambda.rb +0 -8
  46. data/lib/unparser/emitter/masgn.rb +20 -0
  47. data/lib/unparser/emitter/match.rb +3 -17
  48. data/lib/unparser/emitter/match_alt.rb +23 -0
  49. data/lib/unparser/emitter/match_as.rb +21 -0
  50. data/lib/unparser/emitter/match_rest.rb +26 -0
  51. data/lib/unparser/emitter/match_var.rb +19 -0
  52. data/lib/unparser/emitter/mlhs.rb +40 -0
  53. data/lib/unparser/emitter/module.rb +3 -9
  54. data/lib/unparser/emitter/op_assign.rb +12 -27
  55. data/lib/unparser/emitter/pin.rb +19 -0
  56. data/lib/unparser/emitter/primitive.rb +93 -0
  57. data/lib/unparser/emitter/range.rb +35 -0
  58. data/lib/unparser/emitter/regexp.rb +35 -0
  59. data/lib/unparser/emitter/repetition.rb +17 -57
  60. data/lib/unparser/emitter/rescue.rb +1 -97
  61. data/lib/unparser/emitter/root.rb +17 -1
  62. data/lib/unparser/emitter/send.rb +10 -219
  63. data/lib/unparser/emitter/simple.rb +33 -0
  64. data/lib/unparser/emitter/splat.rb +2 -18
  65. data/lib/unparser/emitter/super.rb +1 -29
  66. data/lib/unparser/emitter/undef.rb +1 -9
  67. data/lib/unparser/emitter/variable.rb +1 -31
  68. data/lib/unparser/emitter/xstr.rb +72 -0
  69. data/lib/unparser/emitter/yield.rb +1 -9
  70. data/lib/unparser/generation.rb +250 -0
  71. data/lib/unparser/node_details.rb +21 -0
  72. data/lib/unparser/node_details/send.rb +62 -0
  73. data/lib/unparser/node_helpers.rb +45 -6
  74. data/lib/unparser/validation.rb +37 -35
  75. data/lib/unparser/writer.rb +15 -0
  76. data/lib/unparser/writer/binary.rb +99 -0
  77. data/lib/unparser/writer/dynamic_string.rb +229 -0
  78. data/lib/unparser/writer/resbody.rb +40 -0
  79. data/lib/unparser/writer/rescue.rb +39 -0
  80. data/lib/unparser/writer/send.rb +124 -0
  81. data/lib/unparser/{emitter → writer}/send/attribute_assignment.rb +11 -26
  82. data/lib/unparser/writer/send/binary.rb +27 -0
  83. data/lib/unparser/writer/send/conditional.rb +25 -0
  84. data/lib/unparser/writer/send/regular.rb +33 -0
  85. data/lib/unparser/{emitter → writer}/send/unary.rb +10 -17
  86. metadata +63 -31
  87. data/lib/unparser/emitter/empty.rb +0 -23
  88. data/lib/unparser/emitter/ensure.rb +0 -37
  89. data/lib/unparser/emitter/literal.rb +0 -10
  90. data/lib/unparser/emitter/literal/array.rb +0 -29
  91. data/lib/unparser/emitter/literal/dynamic.rb +0 -53
  92. data/lib/unparser/emitter/literal/dynamic_body.rb +0 -132
  93. data/lib/unparser/emitter/literal/execute_string.rb +0 -38
  94. data/lib/unparser/emitter/literal/hash.rb +0 -156
  95. data/lib/unparser/emitter/literal/primitive.rb +0 -145
  96. data/lib/unparser/emitter/literal/range.rb +0 -36
  97. data/lib/unparser/emitter/literal/regexp.rb +0 -114
  98. data/lib/unparser/emitter/literal/singleton.rb +0 -26
  99. data/lib/unparser/emitter/meta.rb +0 -16
  100. data/lib/unparser/emitter/redo.rb +0 -25
  101. data/lib/unparser/emitter/resbody.rb +0 -76
  102. data/lib/unparser/emitter/retry.rb +0 -25
  103. data/lib/unparser/emitter/send/binary.rb +0 -57
  104. data/lib/unparser/emitter/send/conditional.rb +0 -40
  105. data/lib/unparser/emitter/send/regular.rb +0 -40
  106. data/lib/unparser/preprocessor.rb +0 -159
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Send
6
- # Emitter for binary sends
7
- class Binary < self
8
- include Unterminated
9
-
10
- private
11
-
12
- # Return undefined
13
- #
14
- # @return [undefined]
15
- #
16
- # @api private
17
- #
18
- def dispatch
19
- visit(receiver)
20
- emit_operator
21
- emit_right
22
- end
23
-
24
- # Emit operator
25
- #
26
- # @return [undefined]
27
- #
28
- # @api private
29
- #
30
- def emit_operator
31
- write(WS, string_selector, WS)
32
- end
33
-
34
- # Return right node
35
- #
36
- # @return [Parser::AST::Node]
37
- #
38
- # @api private
39
- #
40
- def right_node
41
- children[2]
42
- end
43
-
44
- # Emit right
45
- #
46
- # @return [undefined]
47
- #
48
- # @api private
49
- #
50
- def emit_right
51
- visit(right_node)
52
- end
53
-
54
- end # Binary
55
- end # Send
56
- end # Emitter
57
- end # Unparser
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Send
6
- # Emitter for "conditional" receiver&.selector(arguments...) case
7
- class Conditional < self
8
- include Terminated
9
-
10
- handle :csend
11
-
12
- private
13
-
14
- # Perform regular dispatch
15
- #
16
- # @return [undefined]
17
- #
18
- # @api private
19
- #
20
- def dispatch
21
- emit_receiver
22
- emit_selector
23
- emit_arguments
24
- end
25
-
26
- # Emit receiver
27
- #
28
- # @return [undefined]
29
- #
30
- # @api private
31
- #
32
- def emit_receiver
33
- visit(receiver)
34
- write(T_AMP, T_DOT)
35
- end
36
-
37
- end # Regular
38
- end # Send
39
- end # Emitter
40
- end # Unparser
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Send
6
- # Emitter for "regular" receiver.selector(arguments...) case
7
- class Regular < self
8
- include Terminated
9
-
10
- private
11
-
12
- # Perform regular dispatch
13
- #
14
- # @return [undefined]
15
- #
16
- # @api private
17
- #
18
- def dispatch
19
- emit_receiver
20
- emit_selector
21
- emit_arguments
22
- end
23
-
24
- # Emit receiver
25
- #
26
- # @return [undefined]
27
- #
28
- # @api private
29
- #
30
- def emit_receiver
31
- return unless first_child
32
-
33
- visit(receiver)
34
- write(T_DOT)
35
- end
36
-
37
- end # Regular
38
- end # Send
39
- end # Emitter
40
- end # Unparser
@@ -1,159 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- # Preprocessor to normalize AST generated by parser
5
- class Preprocessor
6
- include Adamantium::Flat, NodeHelpers, AbstractType, Concord.new(:node, :parent_type), Procto.call(:result)
7
-
8
- # Return preprocessor result
9
- #
10
- # @return [Parser::AST::Node]
11
- #
12
- # @api private
13
- #
14
- abstract_method :result
15
-
16
- EMPTY = Parser::AST::Node.new(:empty)
17
-
18
- # Run preprocessor for node
19
- #
20
- # @param [Parser::AST::Node, nil] node
21
- #
22
- # @return [Parser::AST::Node, nil]
23
- #
24
- # @api private
25
- #
26
- def self.run(node, parent_type = nil)
27
- return EMPTY if node.nil?
28
-
29
- REGISTRY.fetch(node.type, [Noop]).reduce(node) do |current, processor|
30
- processor.call(current, parent_type)
31
- end
32
- end
33
-
34
- REGISTRY = Hash.new { |hash, key| hash[key] = [] }
35
-
36
- # Register preprocessor
37
- #
38
- # @param [Symbol] type
39
- #
40
- # @return [undefined]
41
- #
42
- # @api private
43
- #
44
- def self.register(type)
45
- REGISTRY[type] << self
46
- end
47
- private_class_method :register
48
-
49
- private
50
-
51
- # Visit node
52
- #
53
- # @param [Parser::AST::Node] child
54
- #
55
- # @return [undefined]
56
- #
57
- # @api private
58
- #
59
- def visit(child)
60
- self.class.run(child, node.type)
61
- end
62
-
63
- # Return children
64
- #
65
- # @return [Array<Parser::AST::Node>]
66
- #
67
- # @api private
68
- #
69
- def children
70
- node.children
71
- end
72
-
73
- # Return visited children
74
- #
75
- # @return [Array<Parser::Ast::Node>]
76
- #
77
- # @api private
78
- #
79
- def visited_children
80
- children.map do |node|
81
- if node.is_a?(Parser::AST::Node)
82
- visit(node)
83
- else
84
- node
85
- end
86
- end
87
- end
88
-
89
- # Noop preprocessor that just passes node through.
90
- class Noop < self
91
-
92
- register :int
93
- register :str
94
-
95
- # Return preprocessor result
96
- #
97
- # @return [Parser::AST::Node]
98
- #
99
- # @api private
100
- #
101
- def result
102
- node.updated(nil, visited_children)
103
- end
104
-
105
- end # Noop
106
-
107
- # Preprocessor transforming numeric nodes with infinity as value to round trippable equivalent.
108
- class Infinity < self
109
-
110
- register :float
111
- register :int
112
-
113
- NEG_INFINITY = -(Float::INFINITY - 1)
114
-
115
- # Return preprocessor result
116
- #
117
- # @return [Parser::AST::Node]
118
- #
119
- # @api private
120
- #
121
- def result
122
- value = node.children.first
123
- case value
124
- when Float::INFINITY
125
- s(:const, s(:const, nil, :Float), :INFINITY)
126
- when NEG_INFINITY
127
- s(:send, s(:const, s(:const, nil, :Float), :INFINITY), :-@)
128
- else
129
- node
130
- end
131
- end
132
- end
133
-
134
- # Preprocessor for begin nodes. Removes begin nodes with one child.
135
- #
136
- # This reduces the amount of complex logic needed inside unparser to emit "nice" syntax with minimal
137
- # tokens.
138
- #
139
- class Begin < self
140
-
141
- register :begin
142
-
143
- # Return preprocessor result
144
- #
145
- # @return [Parser::AST::Node]
146
- #
147
- # @api private
148
- #
149
- def result
150
- if children.one? && !parent_type.equal?(:regexp)
151
- visit(children.first)
152
- else
153
- Noop.call(node, parent_type)
154
- end
155
- end
156
-
157
- end # Begin
158
- end # Preprocessor
159
- end # Unparser