unparser 0.0.1

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 (77) hide show
  1. checksums.yaml +7 -0
  2. data/.circle.yml +4 -0
  3. data/.gitignore +2 -0
  4. data/.rspec +3 -0
  5. data/.travis.yml +16 -0
  6. data/Changelog.md +3 -0
  7. data/Gemfile +6 -0
  8. data/Gemfile.devtools +60 -0
  9. data/Guardfile +18 -0
  10. data/README.md +41 -0
  11. data/Rakefile +24 -0
  12. data/TODO +1 -0
  13. data/config/devtools.yml +2 -0
  14. data/config/flay.yml +3 -0
  15. data/config/flog.yml +2 -0
  16. data/config/mutant.yml +3 -0
  17. data/config/reek.yml +107 -0
  18. data/config/yardstick.yml +2 -0
  19. data/lib/unparser/buffer.rb +93 -0
  20. data/lib/unparser/constants.rb +87 -0
  21. data/lib/unparser/emitter/alias.rb +27 -0
  22. data/lib/unparser/emitter/argument.rb +154 -0
  23. data/lib/unparser/emitter/assignment.rb +140 -0
  24. data/lib/unparser/emitter/begin.rb +179 -0
  25. data/lib/unparser/emitter/binary.rb +52 -0
  26. data/lib/unparser/emitter/block.rb +53 -0
  27. data/lib/unparser/emitter/break.rb +28 -0
  28. data/lib/unparser/emitter/case.rb +97 -0
  29. data/lib/unparser/emitter/cbase.rb +22 -0
  30. data/lib/unparser/emitter/class.rb +72 -0
  31. data/lib/unparser/emitter/def.rb +107 -0
  32. data/lib/unparser/emitter/defined.rb +27 -0
  33. data/lib/unparser/emitter/for.rb +50 -0
  34. data/lib/unparser/emitter/hookexe.rb +42 -0
  35. data/lib/unparser/emitter/if.rb +85 -0
  36. data/lib/unparser/emitter/literal/composed.rb +64 -0
  37. data/lib/unparser/emitter/literal/dynamic.rb +54 -0
  38. data/lib/unparser/emitter/literal/dynamic_body.rb +109 -0
  39. data/lib/unparser/emitter/literal/execute_string.rb +38 -0
  40. data/lib/unparser/emitter/literal/primitive.rb +49 -0
  41. data/lib/unparser/emitter/literal/range.rb +33 -0
  42. data/lib/unparser/emitter/literal/regexp.rb +96 -0
  43. data/lib/unparser/emitter/literal/singleton.rb +24 -0
  44. data/lib/unparser/emitter/literal.rb +7 -0
  45. data/lib/unparser/emitter/module.rb +37 -0
  46. data/lib/unparser/emitter/next.rb +22 -0
  47. data/lib/unparser/emitter/not.rb +25 -0
  48. data/lib/unparser/emitter/op_assign.rb +63 -0
  49. data/lib/unparser/emitter/redo.rb +22 -0
  50. data/lib/unparser/emitter/repetition.rb +33 -0
  51. data/lib/unparser/emitter/retry.rb +22 -0
  52. data/lib/unparser/emitter/return.rb +38 -0
  53. data/lib/unparser/emitter/root.rb +7 -0
  54. data/lib/unparser/emitter/send/binary.rb +100 -0
  55. data/lib/unparser/emitter/send/index.rb +82 -0
  56. data/lib/unparser/emitter/send/unary.rb +29 -0
  57. data/lib/unparser/emitter/send.rb +273 -0
  58. data/lib/unparser/emitter/splat.rb +24 -0
  59. data/lib/unparser/emitter/super.rb +46 -0
  60. data/lib/unparser/emitter/undef.rb +25 -0
  61. data/lib/unparser/emitter/variable.rb +83 -0
  62. data/lib/unparser/emitter/yield.rb +28 -0
  63. data/lib/unparser/emitter.rb +308 -0
  64. data/lib/unparser.rb +87 -0
  65. data/spec/integration/unparser/spike_spec.rb +914 -0
  66. data/spec/spec_helper.rb +13 -0
  67. data/spec/unit/unparser/buffer/append_spec.rb +23 -0
  68. data/spec/unit/unparser/buffer/content_spec.rb +38 -0
  69. data/spec/unit/unparser/buffer/indent_spec.rb +18 -0
  70. data/spec/unit/unparser/buffer/nl_spec.rb +16 -0
  71. data/spec/unit/unparser/buffer/unindent_spec.rb +18 -0
  72. data/spec/unit/unparser/class_methods/unparse_spec.rb +16 -0
  73. data/spec/unit/unparser/emitter/class_methods/handle_spec.rb +17 -0
  74. data/spec/unit/unparser/emitter/class_methods/visit_spec.rb +37 -0
  75. data/spec/unit/unparser/emitter/source_map/class_methods/emit_spec.rb +20 -0
  76. data/unparser.gemspec +24 -0
  77. metadata +201 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c12f5981aa14eb3e5339a937e5d68d21a3336381
4
+ data.tar.gz: 7050a2bb94a084b42ba4504b2151e5af033d492f
5
+ SHA512:
6
+ metadata.gz: d935d497ba084726fb355995640849c846c7074f4a7e85fed48d4843da646b5520c7046a48b139b187ab71dd35405d728bf199ba072db463ee13044dec2b0c02
7
+ data.tar.gz: 9fcf5e19768a9b56ff5baa637f45e69a3868e98957768d6a01f560bee0f62f339c05c001c94e928af3c0c67e3f7b920d3f2d3e66bd08e0906cace82d3d334d0a
data/.circle.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ test:
3
+ override:
4
+ - bundle exec rake ci
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ /tmp
2
+ /Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format progress
3
+ --order random
data/.travis.yml ADDED
@@ -0,0 +1,16 @@
1
+ language: ruby
2
+ script: 'bundle exec rake spec'
3
+ rvm:
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - ruby-head
8
+ - jruby-19mode
9
+ - jruby-head
10
+ - rbx-19mode
11
+ notifications:
12
+ irc:
13
+ channels:
14
+ - irc.freenode.org#rom-rb
15
+ on_success: never
16
+ on_failure: change
data/Changelog.md ADDED
@@ -0,0 +1,3 @@
1
+ # v0.0.1 2013-06-15
2
+
3
+ Initial release
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'devtools', :git => 'https://github.com/rom-rb/devtools.git'
6
+ eval File.read('Gemfile.devtools')
data/Gemfile.devtools ADDED
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+
3
+ group :development do
4
+ gem 'rake', '~> 10.0.4'
5
+ gem 'rspec', '~> 2.13.0'
6
+ gem 'yard', '~> 0.8.6.1'
7
+ end
8
+
9
+ group :yard do
10
+ gem 'kramdown', '~> 1.0.1'
11
+ end
12
+
13
+ group :guard do
14
+ gem 'guard', '~> 1.8.0'
15
+ gem 'guard-bundler', '~> 1.0.0'
16
+ gem 'guard-rspec', '~> 2.5.4'
17
+
18
+ # file system change event handling
19
+ gem 'listen', '~> 1.0.2'
20
+ gem 'rb-fchange', '~> 0.0.6', :require => false
21
+ gem 'rb-fsevent', '~> 0.9.3', :require => false
22
+ gem 'rb-inotify', '~> 0.9.0', :require => false
23
+
24
+ # notification handling
25
+ gem 'libnotify', '~> 0.8.0', :require => false
26
+ gem 'rb-notifu', '~> 0.0.4', :require => false
27
+ gem 'terminal-notifier-guard', '~> 1.5.3', :require => false
28
+ end
29
+
30
+ group :metrics do
31
+ gem 'backports', '~> 3.3', '>= 3.3.0'
32
+ gem 'coveralls', '~> 0.6.6'
33
+ gem 'flay', '~> 2.2.0'
34
+ gem 'flog', '~> 4.0.0'
35
+ gem 'reek', '~> 1.3.1', :git => 'https://github.com/troessner/reek.git'
36
+ gem 'simplecov', '~> 0.7.1'
37
+ gem 'yardstick', '~> 0.9.6'
38
+
39
+ platforms :ruby_19 do
40
+ gem 'yard-spellcheck', '~> 0.1.5'
41
+ end
42
+
43
+ platforms :mri_19, :rbx do
44
+ gem 'mutant', '~> 0.2.20'
45
+ end
46
+
47
+ platforms :rbx do
48
+ gem 'pelusa', '~> 0.2.2'
49
+ end
50
+ end
51
+
52
+ group :benchmarks do
53
+ gem 'rbench', '~> 0.2.3'
54
+ end
55
+
56
+ platform :jruby do
57
+ group :jruby do
58
+ gem 'jruby-openssl', '~> 0.8.5'
59
+ end
60
+ end
data/Guardfile ADDED
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ guard :bundler do
4
+ watch('Gemfile')
5
+ end
6
+
7
+ guard :rspec, :all_on_start => false, :all_after_pass => false, :cli => '--fail-fast' do
8
+ # run all specs if the spec_helper or supporting files files are modified
9
+ watch('spec/spec_helper.rb') { 'spec/unit' }
10
+ watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec/unit' }
11
+
12
+ # run unit specs if associated lib code is modified
13
+ watch(%r{\Alib/(.+)\.rb\z}) { 'spec' }
14
+ watch("lib/#{File.basename(File.expand_path('../', __FILE__))}.rb") { 'spec' }
15
+
16
+ # run a spec if it is modified
17
+ watch(%r{\Aspec/(?:unit|integration)/.+_spec\.rb\z})
18
+ end
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ unparser
2
+ ========
3
+
4
+ [![Build Status](https://secure.travis-ci.org/mbj/unparser.png?branch=master)](http://travis-ci.org/mbj/unparser)
5
+ [![Dependency Status](https://gemnasium.com/mbj/unparser.png)](https://gemnasium.com/mbj/unparser)
6
+ [![Code Climate](https://codeclimate.com/github/mbj/unparser.png)](https://codeclimate.com/github/mbj/unparser)
7
+
8
+ Generate equivalent inputs for ASTs from whitequarks awesome [parser](https://github.com/whitequark/parser).
9
+
10
+ Usage
11
+ -----
12
+
13
+ In spike mode, no public API currently.
14
+
15
+ Installation
16
+ ------------
17
+
18
+ There is currently no gem release. Use git source in your Gemfile:
19
+
20
+ ```gem 'unparser', :git => 'https://github.com/mbj/unparser'```
21
+
22
+ Credits
23
+ -------
24
+
25
+ * [Markus Schirp (mbj)](https://github.com/mbj) Author
26
+
27
+ Contributing
28
+ -------------
29
+
30
+ * Fork the project.
31
+ * Make your feature addition or bug fix.
32
+ * Add tests for it. This is important so I don't break it in a
33
+ future version unintentionally.
34
+ * Commit, do not mess with Rakefile or version
35
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
36
+ * Send me a pull request. Bonus points for topic branches.
37
+
38
+ License
39
+ -------
40
+
41
+ See LICENSE file.
data/Rakefile ADDED
@@ -0,0 +1,24 @@
1
+ require 'devtools'
2
+ Devtools.init_rake_tasks
3
+
4
+ class Rake::Task
5
+ def overwrite(&block)
6
+ @actions.clear
7
+ enhance(&block)
8
+ end
9
+ end
10
+
11
+ Rake.application.load_imports
12
+
13
+ Rake::Task['metrics:mutant'].overwrite do
14
+ begin
15
+ require 'mutant'
16
+ rescue LoadError
17
+ end
18
+ if defined?(Mutant)
19
+ status = Mutant::CLI.run(%W(--rspec-full -r ./spec/spec_helper.rb ::Unparser))
20
+ unless status.zero?
21
+ fail "Not mutation covered :("
22
+ end
23
+ end
24
+ end
data/TODO ADDED
@@ -0,0 +1 @@
1
+ Refactor Emitter::Send, it is ugly.
@@ -0,0 +1,2 @@
1
+ ---
2
+ unit_test_timeout: 1.0
data/config/flay.yml ADDED
@@ -0,0 +1,3 @@
1
+ ---
2
+ threshold: 14
3
+ total_score: 342
data/config/flog.yml ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ threshold: 14.8
data/config/mutant.yml ADDED
@@ -0,0 +1,3 @@
1
+ ---
2
+ name: unparser
3
+ namespace: Unparser
data/config/reek.yml ADDED
@@ -0,0 +1,107 @@
1
+ ---
2
+ UnusedParameters:
3
+ exclude: []
4
+ UncommunicativeParameterName:
5
+ accept: []
6
+ exclude: []
7
+ enabled: true
8
+ reject:
9
+ - !ruby/regexp /^.$/
10
+ - !ruby/regexp /[0-9]$/
11
+ - !ruby/regexp /[A-Z]/
12
+ TooManyInstanceVariables:
13
+ exclude: []
14
+ enabled: true
15
+ max_instance_variables: 3
16
+ TooManyMethods:
17
+ exclude:
18
+ - Unparser::Emitter # TODO: 13 methods, mostly helpers for deduplicate sublcasses
19
+ enabled: true
20
+ max_methods: 10
21
+ UncommunicativeMethodName:
22
+ accept: []
23
+ exclude: []
24
+ enabled: true
25
+ reject:
26
+ - !ruby/regexp /^[a-z]$/
27
+ - !ruby/regexp /[0-9]$/
28
+ - !ruby/regexp /[A-Z]/
29
+ LongParameterList:
30
+ max_params: 3
31
+ exclude:
32
+ - Unparser#self.transquote
33
+ enabled: true
34
+ overrides: {}
35
+ FeatureEnvy:
36
+ exclude:
37
+ - Unparser::Emitter::Literal::Regexp#escape # TODO Fixme!
38
+ - Unparser::Emitter::Send#binary_receiver?
39
+ - Unparser::Emitter::Send#effective_receiver
40
+ enabled: true
41
+ ClassVariable:
42
+ exclude: []
43
+ enabled: true
44
+ BooleanParameter:
45
+ exclude: []
46
+ enabled: true
47
+ IrresponsibleModule:
48
+ exclude: []
49
+ enabled: true
50
+ UncommunicativeModuleName:
51
+ accept: []
52
+ exclude: []
53
+ enabled: true
54
+ reject:
55
+ - !ruby/regexp /^.$/
56
+ - !ruby/regexp /[0-9]$/
57
+ NestedIterators:
58
+ ignore_iterators: []
59
+ exclude:
60
+ - Unparser::Emitter#self.children
61
+ enabled: true
62
+ max_allowed_nesting: 1
63
+ TooManyStatements:
64
+ max_statements: 5
65
+ exclude:
66
+ - Unparser::Emitter::Block#dispatch # 6 statements
67
+ - Unparser::Emitter::Def#dispatch # 6 statements
68
+ - Unparser::Emitter::Class#dispatch # 6 statements
69
+ enabled: true
70
+ DuplicateMethodCall:
71
+ allow_calls: []
72
+ exclude: []
73
+ enabled: false
74
+ max_calls: 1
75
+ UtilityFunction:
76
+ max_helper_calls: 1
77
+ exclude: []
78
+ enabled: true
79
+ Attribute:
80
+ exclude: []
81
+ enabled: false
82
+ UncommunicativeVariableName:
83
+ accept: []
84
+ exclude: []
85
+ enabled: true
86
+ reject:
87
+ - !ruby/regexp /^.$/
88
+ - !ruby/regexp /[0-9]$/
89
+ - !ruby/regexp /[A-Z]/
90
+ RepeatedConditional:
91
+ exclude:
92
+ - Unparser::Emitter::Send # TODO Fixme
93
+ - Unparser::Emitter::If
94
+ enabled: true
95
+ max_ifs: 1
96
+ DataClump:
97
+ exclude: []
98
+ enabled: true
99
+ max_copies: 1
100
+ min_clump_size: 3
101
+ ControlParameter:
102
+ exclude: []
103
+ enabled: true
104
+ LongYieldList:
105
+ max_params: 1
106
+ exclude: []
107
+ enabled: true
@@ -0,0 +1,2 @@
1
+ ---
2
+ threshold: 100
@@ -0,0 +1,93 @@
1
+ module Unparser
2
+
3
+ # Buffer used to emit into
4
+ class Buffer
5
+
6
+ NL = "\n".freeze
7
+
8
+ # Initialize object
9
+ #
10
+ # @return [undefined]
11
+ #
12
+ # @api private
13
+ #
14
+ def initialize
15
+ @content = ''
16
+ @indent = 0
17
+ end
18
+
19
+ # Append string
20
+ #
21
+ # @param [String] string
22
+ #
23
+ # @return [self]
24
+ #
25
+ # @api private
26
+ #
27
+ def append(string)
28
+ if @content[-1] == NL
29
+ prefix
30
+ end
31
+ @content << string
32
+ self
33
+ end
34
+
35
+ # Increase indent
36
+ #
37
+ # @return [self]
38
+ #
39
+ # @api private
40
+ #
41
+ def indent
42
+ nl
43
+ @indent+=1
44
+ self
45
+ end
46
+
47
+ # Decrease indent
48
+ #
49
+ # @return [self]
50
+ #
51
+ # @api private
52
+ #
53
+ def unindent
54
+ nl
55
+ @indent-=1
56
+ self
57
+ end
58
+
59
+ # Write newline
60
+ #
61
+ # @return [self]
62
+ #
63
+ # @api private
64
+ #
65
+ def nl
66
+ @content << NL
67
+ self
68
+ end
69
+
70
+ # Return content of buffer
71
+ #
72
+ # @return [String]
73
+ #
74
+ # @api private
75
+ #
76
+ def content
77
+ @content.dup.freeze
78
+ end
79
+
80
+ private
81
+
82
+ # Write prefix
83
+ #
84
+ # @return [String]
85
+ #
86
+ # @api private
87
+ #
88
+ def prefix
89
+ @content << ' '*@indent
90
+ end
91
+
92
+ end # Buffer
93
+ end # Unparser
@@ -0,0 +1,87 @@
1
+ module Unparser
2
+ module Constants
3
+
4
+ UNARY_OPERATORS = %w(
5
+ !
6
+ ~
7
+ -@
8
+ +@
9
+ ).map(&:to_sym).to_set.freeze
10
+
11
+
12
+ BINARY_OPERATORS = %w(
13
+ + - * / & | && || << >> ==
14
+ === != <= < <=> > >= =~ !~ ^
15
+ **
16
+ ).map(&:to_sym).to_set.freeze
17
+
18
+ WS = ' '.freeze
19
+ NL = "\n".freeze
20
+ O_DOT = '.'.freeze
21
+ O_LT = '<'.freeze
22
+ O_DLT = '<<'.freeze
23
+ O_AMP = '&'.freeze
24
+ O_ASN = '='.freeze
25
+ O_SPLAT = '*'.freeze
26
+ O_ASR = '=>'.freeze
27
+ O_PIPE = '|'.freeze
28
+ O_DCL = '::'.freeze
29
+ O_NEG = '!'.freeze
30
+ O_OR = '||'.freeze
31
+ O_AND = '&&'.freeze
32
+
33
+ M_PO = '('.freeze
34
+ M_PC = ')'.freeze
35
+
36
+ K_DO = 'do'
37
+ K_DEF = 'def'
38
+ K_END = 'end'
39
+ K_BEGIN = 'begin'
40
+ K_CASE = 'case'
41
+ K_CLASS = 'class'
42
+ K_SELF = 'self'
43
+ K_ENSURE = 'ensure'
44
+ K_DEFINE = 'define'
45
+ K_MODULE = 'module'
46
+ K_RESCUE = 'rescue'
47
+ K_RETURN = 'return'
48
+ K_UNDEF = 'undef'
49
+ K_DEFINED = 'defined?'
50
+ K_PREEXE = 'BEGIN'
51
+ K_POSTEXE = 'END'
52
+ K_SUPER = 'super'
53
+ K_BREAK = 'break'
54
+ K_RETRY = 'retry'
55
+ K_REDO = 'redo'
56
+ K_NEXT = 'next'
57
+ K_FALSE = 'false'
58
+ K_TRUE = 'true'
59
+ K_IF = 'if'
60
+ K_AND = 'and'
61
+ K_ALIAS = 'alias'
62
+ K_ELSE = 'else'
63
+ K_ELSIF = 'elsif'
64
+ K_FOR = 'for'
65
+ K_NIL = 'nil'
66
+ K_NOT = 'not'
67
+ K_IN = 'in'
68
+ K_OR = 'or'
69
+ K_UNLESS = 'unless'
70
+ K_WHEN = 'when'
71
+ K_WHILE = 'while'
72
+ K_UNTIL = 'until'
73
+ K_YIELD = 'yield'
74
+ K_ENCODING = '__ENCODING__'
75
+ K_EEND = '__END__'
76
+ K_FILE = '__FILE__'
77
+ K_THEN = 'then'
78
+
79
+
80
+ KEYWORDS = constants.map do |name|
81
+ if name.to_s.start_with?('K_')
82
+ const_get(name).freeze.to_sym
83
+ end
84
+ end.compact.freeze
85
+
86
+ end # Constants
87
+ end # Unparser
@@ -0,0 +1,27 @@
1
+ module Unparser
2
+ class Emitter
3
+ # Emitter for alias nodes
4
+ class Alias < self
5
+
6
+ handle :alias
7
+
8
+ children :target, :source
9
+
10
+ private
11
+
12
+ # Perform dispatch
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ write(K_ALIAS, WS)
20
+ visit(target)
21
+ write(WS)
22
+ visit(source)
23
+ end
24
+
25
+ end # Alias
26
+ end # Emitter
27
+ end # Unparser
@@ -0,0 +1,154 @@
1
+ module Unparser
2
+ class Emitter
3
+
4
+ # Arg expr (pattern args) emitter
5
+ class ArgExpr < self
6
+
7
+ handle :arg_expr
8
+
9
+ children :body
10
+
11
+ private
12
+
13
+ # Perform dispatch
14
+ #
15
+ # @return [undefined]
16
+ #
17
+ # @api private
18
+ #
19
+ def dispatch
20
+ parentheses do
21
+ visit(body)
22
+ end
23
+ end
24
+ end # ArgExpr
25
+
26
+ # Arguments emitter
27
+ class Arguments < self
28
+
29
+ handle :args
30
+
31
+ private
32
+
33
+ # Perform dispatch
34
+ #
35
+ # @return [undefined]
36
+ #
37
+ # @api private
38
+ #
39
+ def dispatch
40
+ mapped = children.map do |child|
41
+ if child.type == :mlhs
42
+ Parser::AST::Node.new(:arg_expr, [child])
43
+ else
44
+ child
45
+ end
46
+ end
47
+ delimited(mapped)
48
+ end
49
+
50
+ end # Arguments
51
+
52
+ # Emitter for block arguments
53
+ class Blockarg < self
54
+
55
+ handle :blockarg
56
+
57
+ children :name
58
+
59
+ private
60
+
61
+ # Perform dispatch
62
+ #
63
+ # @return [undefined]
64
+ #
65
+ # @api private
66
+ #
67
+ def dispatch
68
+ write(O_AMP, name.to_s)
69
+ end
70
+
71
+ end # Blockarg
72
+
73
+ # Optional argument emitter
74
+ class Optarg < self
75
+
76
+ handle :optarg
77
+
78
+ children :name, :value
79
+
80
+ private
81
+
82
+ # Perform dispatch
83
+ #
84
+ # @return [undefined]
85
+ #
86
+ # @api private
87
+ #
88
+ def dispatch
89
+ write(name.to_s, WS, O_ASN, WS)
90
+ visit(value)
91
+ end
92
+ end
93
+
94
+ # Rest argument emitter
95
+ class Restarg < self
96
+ handle :restarg
97
+
98
+ private
99
+
100
+ # Perform dispatch
101
+ #
102
+ # @return [undefined]
103
+ #
104
+ # @api private
105
+ #
106
+ def dispatch
107
+ write(O_SPLAT, first_child.to_s)
108
+ end
109
+
110
+ end # Restarg
111
+
112
+ # Argument emitter
113
+ class Argument < self
114
+
115
+ handle :arg
116
+
117
+ private
118
+
119
+ # Perform dispatch
120
+ #
121
+ # @return [undefined]
122
+ #
123
+ # @api private
124
+ #
125
+ def dispatch
126
+ write(first_child.to_s)
127
+ end
128
+
129
+ end # Argument
130
+
131
+ # Block pass node emitter
132
+ class BlockPass < self
133
+
134
+ handle :block_pass
135
+
136
+ children :name
137
+
138
+ private
139
+
140
+ # Perform dispatch
141
+ #
142
+ # @return [undefined]
143
+ #
144
+ # @api private
145
+ #
146
+ def dispatch
147
+ write(O_AMP)
148
+ visit(name)
149
+ end
150
+
151
+ end # BlockPass
152
+
153
+ end # Emitter
154
+ end # Unparser