Class: Bash::Merge::Emitter
- Inherits:
-
Ast::Merge::EmitterBase
- Object
- Ast::Merge::EmitterBase
- Bash::Merge::Emitter
- Includes:
- Ast::Merge::EmitterLineMetadataSupport
- Defined in:
- lib/bash/merge/emitter.rb
Overview
Custom Bash emitter that preserves comments and formatting. This class provides utilities for emitting Bash while maintaining the original structure, comments, and style choices.
Inherits common emitter functionality from Ast::Merge::EmitterBase.
Instance Method Summary collapse
-
#clear_subclass_state ⇒ Object
Clear subclass-specific state.
- #emit_blank_line ⇒ Object
-
#emit_case_pattern(pattern, metadata: nil) ⇒ Object
Emit a case pattern.
-
#emit_case_pattern_end ⇒ Object
Emit a case pattern terminator.
-
#emit_case_start(expression, metadata: nil) ⇒ Object
Emit a case statement start.
-
#emit_comment(text, inline: false) ⇒ Object
Emit a comment line.
-
#emit_done ⇒ Object
Emit a for/while loop end.
-
#emit_elif(condition, metadata: nil) ⇒ Object
Emit an elif clause.
-
#emit_else ⇒ Object
Emit an else clause.
-
#emit_esac ⇒ Object
Emit a case statement end.
-
#emit_fi ⇒ Object
Emit an if statement end.
-
#emit_for_start(var, items, metadata: nil) ⇒ Object
Emit a for loop start.
-
#emit_function_end ⇒ Object
Emit a function definition end.
-
#emit_function_start(name, metadata: nil) ⇒ Object
Emit a function definition start.
-
#emit_if_start(condition, metadata: nil) ⇒ Object
Emit an if statement start.
-
#emit_line(line, metadata: nil) ⇒ Object
Emit a raw line of code.
- #emit_raw_lines(raw_lines, metadata: nil) ⇒ Object
-
#emit_shebang(interpreter = '/bin/bash', metadata: nil) ⇒ Object
Emit a shebang line.
-
#emit_tracked_comment(comment) ⇒ Object
Emit a tracked comment from CommentTracker.
-
#emit_variable_assignment(name, value, export: false, inline_comment: nil, metadata: nil) ⇒ Object
Emit a variable assignment.
-
#emit_while_start(condition, metadata: nil) ⇒ Object
Emit a while loop start.
-
#initialize_subclass_state(**_options) ⇒ Object
Initialize subclass-specific state.
-
#to_bash ⇒ String
Get the output as a Bash string.
Instance Method Details
#clear_subclass_state ⇒ Object
Clear subclass-specific state
24 25 26 |
# File 'lib/bash/merge/emitter.rb', line 24 def clear_subclass_state end |
#emit_blank_line ⇒ Object
28 29 30 |
# File 'lib/bash/merge/emitter.rb', line 28 def emit_blank_line append_line('') end |
#emit_case_pattern(pattern, metadata: nil) ⇒ Object
Emit a case pattern
152 153 154 155 |
# File 'lib/bash/merge/emitter.rb', line 152 def emit_case_pattern(pattern, metadata: nil) append_line("#{current_indent}#{pattern})", ) indent end |
#emit_case_pattern_end ⇒ Object
Emit a case pattern terminator
158 159 160 161 |
# File 'lib/bash/merge/emitter.rb', line 158 def emit_case_pattern_end dedent append_line("#{current_indent};;") end |
#emit_case_start(expression, metadata: nil) ⇒ Object
Emit a case statement start
144 145 146 147 |
# File 'lib/bash/merge/emitter.rb', line 144 def emit_case_start(expression, metadata: nil) append_line("#{current_indent}case #{expression} in", ) indent end |
#emit_comment(text, inline: false) ⇒ Object
Emit a comment line
43 44 45 46 47 48 49 50 51 52 |
# File 'lib/bash/merge/emitter.rb', line 43 def emit_comment(text, inline: false) if inline # Inline comments are appended to the last line return if @lines.empty? @lines[-1] = "#{@lines[-1]} # #{text}" else append_line("#{current_indent}# #{text}") end end |
#emit_done ⇒ Object
Emit a for/while loop end
128 129 130 131 |
# File 'lib/bash/merge/emitter.rb', line 128 def emit_done dedent append_line("#{current_indent}done") end |
#emit_elif(condition, metadata: nil) ⇒ Object
Emit an elif clause
99 100 101 102 103 |
# File 'lib/bash/merge/emitter.rb', line 99 def emit_elif(condition, metadata: nil) dedent append_line("#{current_indent}elif #{condition}; then", ) indent end |
#emit_else ⇒ Object
Emit an else clause
106 107 108 109 110 |
# File 'lib/bash/merge/emitter.rb', line 106 def emit_else dedent append_line("#{current_indent}else") indent end |
#emit_esac ⇒ Object
Emit a case statement end
164 165 166 167 |
# File 'lib/bash/merge/emitter.rb', line 164 def emit_esac dedent append_line("#{current_indent}esac") end |
#emit_fi ⇒ Object
Emit an if statement end
113 114 115 116 |
# File 'lib/bash/merge/emitter.rb', line 113 def emit_fi dedent append_line("#{current_indent}fi") end |
#emit_for_start(var, items, metadata: nil) ⇒ Object
Emit a for loop start
122 123 124 125 |
# File 'lib/bash/merge/emitter.rb', line 122 def emit_for_start(var, items, metadata: nil) append_line("#{current_indent}for #{var} in #{items}; do", ) indent end |
#emit_function_end ⇒ Object
Emit a function definition end
83 84 85 86 |
# File 'lib/bash/merge/emitter.rb', line 83 def emit_function_end dedent append_line("#{current_indent}}") end |
#emit_function_start(name, metadata: nil) ⇒ Object
Emit a function definition start
77 78 79 80 |
# File 'lib/bash/merge/emitter.rb', line 77 def emit_function_start(name, metadata: nil) append_line("#{current_indent}#{name}() {", ) indent end |
#emit_if_start(condition, metadata: nil) ⇒ Object
Emit an if statement start
91 92 93 94 |
# File 'lib/bash/merge/emitter.rb', line 91 def emit_if_start(condition, metadata: nil) append_line("#{current_indent}if #{condition}; then", ) indent end |
#emit_line(line, metadata: nil) ⇒ Object
Emit a raw line of code
172 173 174 |
# File 'lib/bash/merge/emitter.rb', line 172 def emit_line(line, metadata: nil) append_line("#{current_indent}#{line}", ) end |
#emit_raw_lines(raw_lines, metadata: nil) ⇒ Object
176 177 178 179 180 |
# File 'lib/bash/merge/emitter.rb', line 176 def emit_raw_lines(raw_lines, metadata: nil) raw_lines.each_with_index do |line, idx| append_line(line.chomp, (, idx)) end end |
#emit_shebang(interpreter = '/bin/bash', metadata: nil) ⇒ Object
Emit a shebang line
57 58 59 |
# File 'lib/bash/merge/emitter.rb', line 57 def emit_shebang(interpreter = '/bin/bash', metadata: nil) append_line("#!#{interpreter}", ) end |
#emit_tracked_comment(comment) ⇒ Object
Emit a tracked comment from CommentTracker
34 35 36 37 |
# File 'lib/bash/merge/emitter.rb', line 34 def emit_tracked_comment(comment) indent = ' ' * (comment[:indent] || 0) append_line("#{indent}# #{comment[:text]}") end |
#emit_variable_assignment(name, value, export: false, inline_comment: nil, metadata: nil) ⇒ Object
Emit a variable assignment
67 68 69 70 71 72 |
# File 'lib/bash/merge/emitter.rb', line 67 def emit_variable_assignment(name, value, export: false, inline_comment: nil, metadata: nil) prefix = export ? 'export ' : '' line = "#{current_indent}#{prefix}#{name}=#{value}" line += " # #{inline_comment}" if inline_comment append_line(line, ) end |
#emit_while_start(condition, metadata: nil) ⇒ Object
Emit a while loop start
136 137 138 139 |
# File 'lib/bash/merge/emitter.rb', line 136 def emit_while_start(condition, metadata: nil) append_line("#{current_indent}while #{condition}; do", ) indent end |
#initialize_subclass_state(**_options) ⇒ Object
Initialize subclass-specific state
19 20 21 |
# File 'lib/bash/merge/emitter.rb', line 19 def initialize_subclass_state(**) end |
#to_bash ⇒ String
Get the output as a Bash string
185 186 187 |
# File 'lib/bash/merge/emitter.rb', line 185 def to_bash to_s end |