unparser 0.4.7 → 0.6.7
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.
- checksums.yaml +4 -4
- data/README.md +40 -9
- data/bin/unparser +2 -2
- data/lib/unparser/abstract_type.rb +121 -0
- data/lib/unparser/adamantium/method_builder.rb +111 -0
- data/lib/unparser/adamantium.rb +150 -0
- data/lib/unparser/anima/attribute.rb +59 -0
- data/lib/unparser/anima/error.rb +23 -0
- data/lib/unparser/anima.rb +184 -0
- data/lib/unparser/ast/local_variable_scope.rb +6 -76
- data/lib/unparser/ast.rb +1 -3
- data/lib/unparser/buffer.rb +14 -25
- data/lib/unparser/cli.rb +85 -77
- data/lib/unparser/{cli/color.rb → color.rb} +4 -14
- data/lib/unparser/comments.rb +0 -26
- data/lib/unparser/concord.rb +114 -0
- data/lib/unparser/constants.rb +4 -53
- data/lib/unparser/diff.rb +98 -0
- data/lib/unparser/dsl.rb +0 -32
- data/lib/unparser/either.rb +153 -0
- data/lib/unparser/emitter/alias.rb +2 -8
- data/lib/unparser/emitter/args.rb +45 -0
- data/lib/unparser/emitter/argument.rb +13 -169
- data/lib/unparser/emitter/array.rb +27 -0
- data/lib/unparser/emitter/array_pattern.rb +29 -0
- data/lib/unparser/emitter/assignment.rb +36 -127
- data/lib/unparser/emitter/begin.rb +9 -84
- data/lib/unparser/emitter/binary.rb +7 -20
- data/lib/unparser/emitter/block.rb +57 -41
- data/lib/unparser/emitter/case.rb +6 -48
- data/lib/unparser/emitter/case_guard.rb +27 -0
- data/lib/unparser/emitter/case_match.rb +40 -0
- data/lib/unparser/emitter/cbase.rb +1 -3
- data/lib/unparser/emitter/class.rb +6 -26
- data/lib/unparser/emitter/const_pattern.rb +24 -0
- data/lib/unparser/emitter/def.rb +7 -51
- data/lib/unparser/emitter/defined.rb +2 -12
- data/lib/unparser/emitter/dstr.rb +22 -0
- data/lib/unparser/emitter/dsym.rb +41 -0
- data/lib/unparser/emitter/find_pattern.rb +18 -0
- data/lib/unparser/emitter/flipflop.rb +11 -10
- data/lib/unparser/emitter/float.rb +29 -0
- data/lib/unparser/emitter/flow_modifier.rb +15 -53
- data/lib/unparser/emitter/for.rb +5 -19
- data/lib/unparser/emitter/hash.rb +36 -0
- data/lib/unparser/emitter/hash_pattern.rb +67 -0
- data/lib/unparser/emitter/hookexe.rb +5 -11
- data/lib/unparser/emitter/if.rb +15 -71
- data/lib/unparser/emitter/in_match.rb +21 -0
- data/lib/unparser/emitter/in_pattern.rb +36 -0
- data/lib/unparser/emitter/index.rb +22 -89
- data/lib/unparser/emitter/kwargs.rb +13 -0
- data/lib/unparser/emitter/kwbegin.rb +31 -0
- data/lib/unparser/emitter/lambda.rb +0 -8
- data/lib/unparser/emitter/masgn.rb +20 -0
- data/lib/unparser/emitter/match.rb +3 -17
- data/lib/unparser/emitter/match_alt.rb +23 -0
- data/lib/unparser/emitter/match_as.rb +21 -0
- data/lib/unparser/emitter/match_pattern.rb +30 -0
- data/lib/unparser/emitter/match_pattern_p.rb +20 -0
- data/lib/unparser/emitter/match_rest.rb +33 -0
- data/lib/unparser/emitter/match_var.rb +19 -0
- data/lib/unparser/emitter/mlhs.rb +40 -0
- data/lib/unparser/emitter/module.rb +3 -9
- data/lib/unparser/emitter/op_assign.rb +14 -29
- data/lib/unparser/emitter/pair.rb +33 -0
- data/lib/unparser/emitter/pin.rb +19 -0
- data/lib/unparser/emitter/primitive.rb +93 -0
- data/lib/unparser/emitter/range.rb +35 -0
- data/lib/unparser/emitter/regexp.rb +35 -0
- data/lib/unparser/emitter/repetition.rb +17 -57
- data/lib/unparser/emitter/rescue.rb +1 -97
- data/lib/unparser/emitter/root.rb +17 -1
- data/lib/unparser/emitter/send.rb +10 -219
- data/lib/unparser/emitter/simple.rb +33 -0
- data/lib/unparser/emitter/splat.rb +13 -19
- data/lib/unparser/emitter/super.rb +1 -29
- data/lib/unparser/emitter/undef.rb +1 -9
- data/lib/unparser/emitter/variable.rb +1 -31
- data/lib/unparser/emitter/xstr.rb +72 -0
- data/lib/unparser/emitter/yield.rb +1 -9
- data/lib/unparser/emitter.rb +24 -425
- data/lib/unparser/equalizer.rb +98 -0
- data/lib/unparser/generation.rb +252 -0
- data/lib/unparser/node_details/send.rb +65 -0
- data/lib/unparser/node_details.rb +21 -0
- data/lib/unparser/node_helpers.rb +48 -6
- data/lib/unparser/validation.rb +172 -0
- data/lib/unparser/writer/binary.rb +99 -0
- data/lib/unparser/writer/dynamic_string.rb +211 -0
- data/lib/unparser/writer/resbody.rb +40 -0
- data/lib/unparser/writer/rescue.rb +43 -0
- data/lib/unparser/{emitter → writer}/send/attribute_assignment.rb +11 -26
- data/lib/unparser/writer/send/binary.rb +27 -0
- data/lib/unparser/writer/send/conditional.rb +25 -0
- data/lib/unparser/writer/send/regular.rb +33 -0
- data/lib/unparser/{emitter → writer}/send/unary.rb +10 -17
- data/lib/unparser/writer/send.rb +115 -0
- data/lib/unparser/writer.rb +15 -0
- data/lib/unparser.rb +161 -77
- metadata +100 -157
- data/.circleci/config.yml +0 -49
- data/.gitignore +0 -37
- data/.rspec +0 -4
- data/.rubocop.yml +0 -9
- data/Changelog.md +0 -156
- data/Gemfile +0 -9
- data/Gemfile.lock +0 -181
- data/LICENSE +0 -20
- data/Rakefile +0 -22
- data/config/devtools.yml +0 -2
- data/config/flay.yml +0 -3
- data/config/flog.yml +0 -2
- data/config/mutant.yml +0 -6
- data/config/reek.yml +0 -98
- data/config/rubocop.yml +0 -122
- data/config/yardstick.yml +0 -2
- data/lib/unparser/cli/differ.rb +0 -152
- data/lib/unparser/cli/source.rb +0 -267
- data/lib/unparser/emitter/empty.rb +0 -23
- data/lib/unparser/emitter/ensure.rb +0 -37
- data/lib/unparser/emitter/literal/array.rb +0 -29
- data/lib/unparser/emitter/literal/dynamic.rb +0 -53
- data/lib/unparser/emitter/literal/dynamic_body.rb +0 -132
- data/lib/unparser/emitter/literal/execute_string.rb +0 -38
- data/lib/unparser/emitter/literal/hash.rb +0 -156
- data/lib/unparser/emitter/literal/primitive.rb +0 -145
- data/lib/unparser/emitter/literal/range.rb +0 -36
- data/lib/unparser/emitter/literal/regexp.rb +0 -114
- data/lib/unparser/emitter/literal/singleton.rb +0 -26
- data/lib/unparser/emitter/literal.rb +0 -10
- data/lib/unparser/emitter/meta.rb +0 -16
- data/lib/unparser/emitter/redo.rb +0 -25
- data/lib/unparser/emitter/resbody.rb +0 -76
- data/lib/unparser/emitter/retry.rb +0 -25
- data/lib/unparser/emitter/send/binary.rb +0 -57
- data/lib/unparser/emitter/send/conditional.rb +0 -40
- data/lib/unparser/emitter/send/regular.rb +0 -40
- data/lib/unparser/preprocessor.rb +0 -159
- data/spec/integration/unparser/corpus_spec.rb +0 -111
- data/spec/integrations.yml +0 -92
- data/spec/spec_helper.rb +0 -20
- data/spec/unit/unparser/buffer/append_spec.rb +0 -24
- data/spec/unit/unparser/buffer/append_without_prefix_spec.rb +0 -23
- data/spec/unit/unparser/buffer/capture_content_spec.rb +0 -17
- data/spec/unit/unparser/buffer/content_spec.rb +0 -38
- data/spec/unit/unparser/buffer/fresh_line_spec.rb +0 -20
- data/spec/unit/unparser/buffer/indent_spec.rb +0 -20
- data/spec/unit/unparser/buffer/nl_spec.rb +0 -16
- data/spec/unit/unparser/buffer/unindent_spec.rb +0 -20
- data/spec/unit/unparser/comments/consume_spec.rb +0 -22
- data/spec/unit/unparser/comments/take_all_spec.rb +0 -19
- data/spec/unit/unparser/comments/take_before_spec.rb +0 -46
- data/spec/unit/unparser/comments/take_eol_comments_spec.rb +0 -32
- data/spec/unit/unparser/emitter/class_methods/handle_spec.rb +0 -17
- data/spec/unit/unparser_spec.rb +0 -1849
- data/unparser.gemspec +0 -32
|
@@ -4,66 +4,82 @@ module Unparser
|
|
|
4
4
|
class Emitter
|
|
5
5
|
|
|
6
6
|
# Block emitter
|
|
7
|
-
#
|
|
8
|
-
# ignore :reek:RepeatedConditional
|
|
9
7
|
class Block < self
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
handle :block
|
|
8
|
+
handle :block, :numblock
|
|
13
9
|
|
|
14
10
|
children :target, :arguments, :body
|
|
15
11
|
|
|
16
12
|
private
|
|
17
13
|
|
|
18
|
-
# Perform dispatch
|
|
19
|
-
#
|
|
20
|
-
# @return [undefined]
|
|
21
|
-
#
|
|
22
|
-
# @api private
|
|
23
|
-
#
|
|
24
14
|
def dispatch
|
|
25
15
|
emit_target
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
16
|
+
ws
|
|
17
|
+
write_open
|
|
18
|
+
emit_block_arguments unless n_lambda?(target)
|
|
19
|
+
target_writer.emit_heredoc_reminders if n_send?(target)
|
|
20
|
+
emit_optional_body_ensure_rescue(body)
|
|
21
|
+
write_close
|
|
30
22
|
end
|
|
31
23
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
24
|
+
def need_do?
|
|
25
|
+
body && (n_rescue?(body) || n_ensure?(body))
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def write_open
|
|
29
|
+
if need_do?
|
|
30
|
+
write('do')
|
|
31
|
+
else
|
|
32
|
+
write('{')
|
|
33
|
+
end
|
|
34
|
+
end
|
|
40
35
|
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
def write_close
|
|
37
|
+
if need_do?
|
|
38
|
+
k_end
|
|
39
|
+
else
|
|
40
|
+
write('}')
|
|
43
41
|
end
|
|
44
42
|
end
|
|
45
43
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
44
|
+
def target_writer
|
|
45
|
+
writer_with(Writer::Send::Regular, target)
|
|
46
|
+
end
|
|
47
|
+
memoize :target_writer
|
|
48
|
+
|
|
49
|
+
def emit_target
|
|
50
|
+
case target.type
|
|
51
|
+
when :send
|
|
52
|
+
emit_send_target
|
|
53
|
+
when :lambda
|
|
54
|
+
visit(target)
|
|
55
|
+
emit_lambda_arguments unless node.type.equal?(:numblock)
|
|
56
|
+
else
|
|
57
|
+
visit(target)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def emit_send_target
|
|
62
|
+
target_writer.emit_receiver
|
|
63
|
+
target_writer.emit_selector
|
|
64
|
+
target_writer.emit_arguments_without_heredoc_body
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def emit_lambda_arguments
|
|
68
|
+
parentheses { writer_with(Args, arguments).emit_lambda_arguments }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def numblock?
|
|
72
|
+
node.type.equal?(:numblock)
|
|
54
73
|
end
|
|
55
74
|
|
|
56
|
-
# Emit arguments
|
|
57
|
-
#
|
|
58
|
-
# @return [undefined]
|
|
59
|
-
#
|
|
60
|
-
# @api private
|
|
61
|
-
#
|
|
62
75
|
def emit_block_arguments
|
|
63
|
-
return if arguments.children.empty?
|
|
76
|
+
return if numblock? || arguments.children.empty?
|
|
64
77
|
|
|
65
78
|
ws
|
|
66
|
-
|
|
79
|
+
|
|
80
|
+
parentheses('|', '|') do
|
|
81
|
+
writer_with(Args, arguments).emit_block_arguments
|
|
82
|
+
end
|
|
67
83
|
end
|
|
68
84
|
|
|
69
85
|
end # Block
|
|
@@ -4,8 +4,6 @@ module Unparser
|
|
|
4
4
|
class Emitter
|
|
5
5
|
# Emitter for case nodes
|
|
6
6
|
class Case < self
|
|
7
|
-
include Terminated
|
|
8
|
-
|
|
9
7
|
handle :case
|
|
10
8
|
|
|
11
9
|
children :condition
|
|
@@ -13,89 +11,49 @@ module Unparser
|
|
|
13
11
|
|
|
14
12
|
private
|
|
15
13
|
|
|
16
|
-
# Perform dispatch
|
|
17
|
-
#
|
|
18
|
-
# @return [undefined]
|
|
19
|
-
#
|
|
20
|
-
# @api private
|
|
21
|
-
#
|
|
22
14
|
def dispatch
|
|
23
|
-
write(
|
|
15
|
+
write('case')
|
|
24
16
|
emit_condition
|
|
25
17
|
emit_whens
|
|
26
18
|
emit_else
|
|
27
19
|
k_end
|
|
28
20
|
end
|
|
29
21
|
|
|
30
|
-
# Emit else
|
|
31
|
-
#
|
|
32
|
-
# @return [undefined]
|
|
33
|
-
#
|
|
34
|
-
# @api private
|
|
35
|
-
#
|
|
36
22
|
def emit_else
|
|
37
23
|
else_branch = children.last
|
|
38
24
|
return unless else_branch
|
|
39
25
|
|
|
40
|
-
write(
|
|
41
|
-
|
|
26
|
+
write('else')
|
|
27
|
+
emit_body(else_branch)
|
|
42
28
|
end
|
|
43
29
|
|
|
44
|
-
# Emit whens
|
|
45
|
-
#
|
|
46
|
-
# @return [undefined]
|
|
47
|
-
#
|
|
48
|
-
# @api private
|
|
49
|
-
#
|
|
50
30
|
def emit_whens
|
|
51
31
|
nl
|
|
52
32
|
whens.each(&method(:visit))
|
|
53
33
|
end
|
|
54
34
|
|
|
55
|
-
# Emit condition
|
|
56
|
-
#
|
|
57
|
-
# @return [undefined]
|
|
58
|
-
#
|
|
59
|
-
# @api private
|
|
60
|
-
#
|
|
61
35
|
def emit_condition
|
|
62
36
|
return unless condition
|
|
63
37
|
|
|
64
|
-
|
|
38
|
+
ws
|
|
65
39
|
visit(condition)
|
|
66
40
|
end
|
|
67
|
-
|
|
68
41
|
end # Case
|
|
69
42
|
|
|
70
43
|
# Emitter for when nodes
|
|
71
44
|
class When < self
|
|
72
|
-
include Terminated
|
|
73
|
-
|
|
74
45
|
handle :when
|
|
75
46
|
|
|
76
47
|
define_group :captures, 0..-2
|
|
77
48
|
|
|
78
49
|
private
|
|
79
50
|
|
|
80
|
-
# Perform dispatch
|
|
81
|
-
#
|
|
82
|
-
# @return [undefined]
|
|
83
|
-
#
|
|
84
|
-
# @api private
|
|
85
|
-
#
|
|
86
51
|
def dispatch
|
|
87
|
-
write(
|
|
52
|
+
write('when ')
|
|
88
53
|
emit_captures
|
|
89
|
-
|
|
90
|
-
emit_body(body)
|
|
54
|
+
emit_optional_body(children.last)
|
|
91
55
|
end
|
|
92
56
|
|
|
93
|
-
# Emit captures
|
|
94
|
-
#
|
|
95
|
-
# @return [undefined]
|
|
96
|
-
#
|
|
97
|
-
# @api private
|
|
98
|
-
#
|
|
99
57
|
def emit_captures
|
|
100
58
|
delimited(captures)
|
|
101
59
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Unparser
|
|
4
|
+
class Emitter
|
|
5
|
+
# Emitter for case guards
|
|
6
|
+
class CaseGuard < self
|
|
7
|
+
|
|
8
|
+
handle :if_guard, :unless_guard
|
|
9
|
+
|
|
10
|
+
MAP = {
|
|
11
|
+
if_guard: 'if',
|
|
12
|
+
unless_guard: 'unless'
|
|
13
|
+
}.freeze
|
|
14
|
+
|
|
15
|
+
children :condition
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def dispatch
|
|
20
|
+
write(MAP.fetch(node_type))
|
|
21
|
+
ws
|
|
22
|
+
visit(condition)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end # UnlessGuard
|
|
26
|
+
end # Emitter
|
|
27
|
+
end # Unparser
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Unparser
|
|
4
|
+
class Emitter
|
|
5
|
+
# Emitter for case matches
|
|
6
|
+
class CaseMatch < self
|
|
7
|
+
|
|
8
|
+
handle :case_match
|
|
9
|
+
|
|
10
|
+
children :target
|
|
11
|
+
|
|
12
|
+
define_group :patterns, 1..-2
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def else_branch
|
|
17
|
+
children.last
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def dispatch
|
|
21
|
+
write('case ')
|
|
22
|
+
visit(target)
|
|
23
|
+
nl
|
|
24
|
+
patterns.each(&method(:visit))
|
|
25
|
+
nl unless buffer.fresh_line?
|
|
26
|
+
emit_else_branch
|
|
27
|
+
k_end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def emit_else_branch
|
|
31
|
+
if else_branch
|
|
32
|
+
write('else')
|
|
33
|
+
emit_body(else_branch) unless n_empty_else?(else_branch)
|
|
34
|
+
nl unless buffer.fresh_line?
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end # CaseMatch
|
|
39
|
+
end # Emitter
|
|
40
|
+
end # Unparser
|
|
@@ -4,8 +4,6 @@ module Unparser
|
|
|
4
4
|
class Emitter
|
|
5
5
|
# Emitter for toplevel constant reference nodes
|
|
6
6
|
class CBase < self
|
|
7
|
-
include Terminated
|
|
8
|
-
|
|
9
7
|
handle :cbase
|
|
10
8
|
|
|
11
9
|
private
|
|
@@ -17,7 +15,7 @@ module Unparser
|
|
|
17
15
|
# @api private
|
|
18
16
|
#
|
|
19
17
|
def dispatch
|
|
20
|
-
write(
|
|
18
|
+
write('::')
|
|
21
19
|
end
|
|
22
20
|
|
|
23
21
|
end # CBase
|
|
@@ -4,7 +4,7 @@ module Unparser
|
|
|
4
4
|
class Emitter
|
|
5
5
|
# Emitter for class nodes
|
|
6
6
|
class Class < self
|
|
7
|
-
include LocalVariableRoot
|
|
7
|
+
include LocalVariableRoot
|
|
8
8
|
|
|
9
9
|
handle :class
|
|
10
10
|
|
|
@@ -12,30 +12,18 @@ module Unparser
|
|
|
12
12
|
|
|
13
13
|
private
|
|
14
14
|
|
|
15
|
-
# Perform dispatch
|
|
16
|
-
#
|
|
17
|
-
# @return [undefined]
|
|
18
|
-
#
|
|
19
|
-
# @api private
|
|
20
|
-
#
|
|
21
15
|
def dispatch
|
|
22
|
-
write(
|
|
16
|
+
write('class ')
|
|
23
17
|
visit(name)
|
|
24
18
|
emit_superclass
|
|
25
|
-
|
|
19
|
+
emit_optional_body(body)
|
|
26
20
|
k_end
|
|
27
21
|
end
|
|
28
22
|
|
|
29
|
-
# Emit superclass
|
|
30
|
-
#
|
|
31
|
-
# @return [undefined]
|
|
32
|
-
#
|
|
33
|
-
# @api private
|
|
34
|
-
#
|
|
35
23
|
def emit_superclass
|
|
36
24
|
return unless superclass
|
|
37
25
|
|
|
38
|
-
write(
|
|
26
|
+
write(' < ')
|
|
39
27
|
visit(superclass)
|
|
40
28
|
end
|
|
41
29
|
|
|
@@ -43,24 +31,16 @@ module Unparser
|
|
|
43
31
|
|
|
44
32
|
# Emitter for sclass nodes
|
|
45
33
|
class SClass < self
|
|
46
|
-
include Terminated
|
|
47
|
-
|
|
48
34
|
handle :sclass
|
|
49
35
|
|
|
50
36
|
children :object, :body
|
|
51
37
|
|
|
52
38
|
private
|
|
53
39
|
|
|
54
|
-
# Perform dispatch
|
|
55
|
-
#
|
|
56
|
-
# @return [undefined]
|
|
57
|
-
#
|
|
58
|
-
# @api private
|
|
59
|
-
#
|
|
60
40
|
def dispatch
|
|
61
|
-
write(
|
|
41
|
+
write('class << ')
|
|
62
42
|
visit(object)
|
|
63
|
-
|
|
43
|
+
emit_optional_body(body)
|
|
64
44
|
k_end
|
|
65
45
|
end
|
|
66
46
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Unparser
|
|
4
|
+
class Emitter
|
|
5
|
+
# Emitter for const pattern node
|
|
6
|
+
class ConstPattern < self
|
|
7
|
+
|
|
8
|
+
handle :const_pattern
|
|
9
|
+
|
|
10
|
+
children :const, :pattern
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def dispatch
|
|
15
|
+
visit(const)
|
|
16
|
+
if n_hash_pattern?(pattern)
|
|
17
|
+
emitter(pattern).emit_const_pattern
|
|
18
|
+
else
|
|
19
|
+
visit(pattern)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end # ConstPattern
|
|
23
|
+
end # Emitter
|
|
24
|
+
end # Unparser
|
data/lib/unparser/emitter/def.rb
CHANGED
|
@@ -4,70 +4,40 @@ module Unparser
|
|
|
4
4
|
class Emitter
|
|
5
5
|
# Emitter for def node
|
|
6
6
|
class Def < self
|
|
7
|
-
include LocalVariableRoot
|
|
7
|
+
include LocalVariableRoot
|
|
8
8
|
|
|
9
9
|
private
|
|
10
10
|
|
|
11
|
-
# Emit name
|
|
12
|
-
#
|
|
13
|
-
# @return [undefined]
|
|
14
|
-
#
|
|
15
|
-
# @api private
|
|
16
|
-
#
|
|
17
11
|
abstract_method :emit_name
|
|
18
12
|
private :emit_name
|
|
19
13
|
|
|
20
|
-
# Return body node
|
|
21
|
-
#
|
|
22
|
-
# @return [Parser::AST::Node]
|
|
23
|
-
#
|
|
24
|
-
# @api private
|
|
25
|
-
#
|
|
26
14
|
abstract_method :body
|
|
27
15
|
private :body
|
|
28
16
|
|
|
29
|
-
# Perform dispatch
|
|
30
|
-
#
|
|
31
|
-
# @return [undefined]
|
|
32
|
-
#
|
|
33
|
-
# @api private
|
|
34
|
-
#
|
|
35
17
|
def dispatch
|
|
36
|
-
write(
|
|
18
|
+
write('def ')
|
|
37
19
|
emit_name
|
|
38
|
-
comments.consume(node, :name)
|
|
39
20
|
emit_arguments
|
|
40
|
-
|
|
21
|
+
emit_optional_body_ensure_rescue(body)
|
|
41
22
|
k_end
|
|
42
23
|
end
|
|
43
24
|
|
|
44
|
-
# Emit arguments
|
|
45
|
-
#
|
|
46
|
-
# @return [undefined]
|
|
47
|
-
#
|
|
48
|
-
# @api private
|
|
49
|
-
#
|
|
50
25
|
def emit_arguments
|
|
51
26
|
return if arguments.children.empty?
|
|
52
27
|
|
|
53
|
-
|
|
28
|
+
parentheses do
|
|
29
|
+
writer_with(Args, arguments).emit_def_arguments
|
|
30
|
+
end
|
|
54
31
|
end
|
|
55
32
|
|
|
56
33
|
# Instance def emitter
|
|
57
34
|
class Instance < self
|
|
58
|
-
|
|
59
35
|
handle :def
|
|
60
36
|
|
|
61
37
|
children :name, :arguments, :body
|
|
62
38
|
|
|
63
39
|
private
|
|
64
40
|
|
|
65
|
-
# Emit name
|
|
66
|
-
#
|
|
67
|
-
# @return [undefined]
|
|
68
|
-
#
|
|
69
|
-
# @api private
|
|
70
|
-
#
|
|
71
41
|
def emit_name
|
|
72
42
|
write(name.to_s)
|
|
73
43
|
end
|
|
@@ -83,25 +53,13 @@ module Unparser
|
|
|
83
53
|
|
|
84
54
|
private
|
|
85
55
|
|
|
86
|
-
# Return mame
|
|
87
|
-
#
|
|
88
|
-
# @return [String]
|
|
89
|
-
#
|
|
90
|
-
# @api private
|
|
91
|
-
#
|
|
92
56
|
def emit_name
|
|
93
57
|
conditional_parentheses(!subject_without_parens?) do
|
|
94
58
|
visit(subject)
|
|
95
59
|
end
|
|
96
|
-
write(
|
|
60
|
+
write('.', name.to_s)
|
|
97
61
|
end
|
|
98
62
|
|
|
99
|
-
# Test if subject needs parentheses
|
|
100
|
-
#
|
|
101
|
-
# @return [Boolean]
|
|
102
|
-
#
|
|
103
|
-
# @api private
|
|
104
|
-
#
|
|
105
63
|
def subject_without_parens?
|
|
106
64
|
case subject.type
|
|
107
65
|
when :self
|
|
@@ -111,8 +69,6 @@ module Unparser
|
|
|
111
69
|
when :send
|
|
112
70
|
receiver, _selector, *arguments = *subject
|
|
113
71
|
!receiver && arguments.empty?
|
|
114
|
-
else
|
|
115
|
-
false
|
|
116
72
|
end
|
|
117
73
|
end
|
|
118
74
|
|
|
@@ -4,25 +4,15 @@ module Unparser
|
|
|
4
4
|
class Emitter
|
|
5
5
|
# Emitter for defined? nodes
|
|
6
6
|
class Defined < self
|
|
7
|
-
include Terminated
|
|
8
|
-
|
|
9
7
|
handle :defined?
|
|
10
8
|
|
|
11
9
|
children :subject
|
|
12
10
|
|
|
13
11
|
private
|
|
14
12
|
|
|
15
|
-
# Perform dispatch
|
|
16
|
-
#
|
|
17
|
-
# @return [undefined]
|
|
18
|
-
#
|
|
19
|
-
# @api private
|
|
20
|
-
#
|
|
21
13
|
def dispatch
|
|
22
|
-
write(
|
|
23
|
-
parentheses
|
|
24
|
-
visit(subject)
|
|
25
|
-
end
|
|
14
|
+
write('defined?')
|
|
15
|
+
parentheses { visit(subject) }
|
|
26
16
|
end
|
|
27
17
|
|
|
28
18
|
end # Defined
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Unparser
|
|
4
|
+
class Emitter
|
|
5
|
+
# Dynamic string emitter
|
|
6
|
+
class DStr < self
|
|
7
|
+
|
|
8
|
+
handle :dstr
|
|
9
|
+
|
|
10
|
+
def emit_heredoc_reminders
|
|
11
|
+
writer_with(Writer::DynamicString, node).emit_heredoc_reminder
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def dispatch
|
|
17
|
+
writer_with(Writer::DynamicString, node).dispatch
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end # DStr
|
|
21
|
+
end # Emitter
|
|
22
|
+
end # Unparser
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Unparser
|
|
4
|
+
class Emitter
|
|
5
|
+
# Dynamic symbol literal emitter
|
|
6
|
+
class DSym < self
|
|
7
|
+
handle :dsym
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def dispatch
|
|
12
|
+
write(':"')
|
|
13
|
+
children.each do |child|
|
|
14
|
+
case child.type
|
|
15
|
+
when :str
|
|
16
|
+
emit_str_child(child)
|
|
17
|
+
when :begin
|
|
18
|
+
emit_begin_child(child)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
write('"')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def emit_str_child(value)
|
|
25
|
+
string = value.children.first
|
|
26
|
+
if string.end_with?("\n")
|
|
27
|
+
write(string.inspect[1..-4])
|
|
28
|
+
nl
|
|
29
|
+
else
|
|
30
|
+
write(string.inspect[1..-2])
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def emit_begin_child(component)
|
|
35
|
+
write('#{')
|
|
36
|
+
visit(unwrap_single_begin(component))
|
|
37
|
+
write('}')
|
|
38
|
+
end
|
|
39
|
+
end # DSym
|
|
40
|
+
end # Emitter
|
|
41
|
+
end # Unparser
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Unparser
|
|
4
|
+
class Emitter
|
|
5
|
+
# Emitter for in pattern nodes
|
|
6
|
+
class FindPattern < self
|
|
7
|
+
handle :find_pattern
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def dispatch
|
|
12
|
+
write('[')
|
|
13
|
+
delimited(children)
|
|
14
|
+
write(']')
|
|
15
|
+
end
|
|
16
|
+
end # FindPattern
|
|
17
|
+
end # Emitter
|
|
18
|
+
end # Unparser
|
|
@@ -4,12 +4,19 @@ module Unparser
|
|
|
4
4
|
class Emitter
|
|
5
5
|
# Emitter for flip flops
|
|
6
6
|
class FlipFlop < self
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
MAP = IceNine.deep_freeze(
|
|
7
|
+
MAP = {
|
|
10
8
|
iflipflop: '..',
|
|
11
9
|
eflipflop: '...'
|
|
12
|
-
|
|
10
|
+
}.freeze
|
|
11
|
+
|
|
12
|
+
SYMBOLS = {
|
|
13
|
+
eflipflop: :tDOT3,
|
|
14
|
+
iflipflop: :tDOT2
|
|
15
|
+
}.freeze
|
|
16
|
+
|
|
17
|
+
def symbol_name
|
|
18
|
+
true
|
|
19
|
+
end
|
|
13
20
|
|
|
14
21
|
handle(*MAP.keys)
|
|
15
22
|
|
|
@@ -17,12 +24,6 @@ module Unparser
|
|
|
17
24
|
|
|
18
25
|
private
|
|
19
26
|
|
|
20
|
-
# Perform dispatch
|
|
21
|
-
#
|
|
22
|
-
# @return [undefined]
|
|
23
|
-
#
|
|
24
|
-
# @api private
|
|
25
|
-
#
|
|
26
27
|
def dispatch
|
|
27
28
|
visit(left)
|
|
28
29
|
write(MAP.fetch(node.type))
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Unparser
|
|
4
|
+
class Emitter
|
|
5
|
+
# Emiter for float literals
|
|
6
|
+
class Float < self
|
|
7
|
+
handle :float
|
|
8
|
+
|
|
9
|
+
children :value
|
|
10
|
+
|
|
11
|
+
INFINITY = ::Float::INFINITY
|
|
12
|
+
NEG_INFINITY = -::Float::INFINITY
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def dispatch
|
|
17
|
+
case value
|
|
18
|
+
when INFINITY
|
|
19
|
+
write('10e1000000000000000000')
|
|
20
|
+
when NEG_INFINITY
|
|
21
|
+
write('-10e1000000000000000000')
|
|
22
|
+
else
|
|
23
|
+
write(value.inspect)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end # Float
|
|
28
|
+
end # Emitter
|
|
29
|
+
end # Unparser
|