Class: Bash::Merge::Emitter

Inherits:
Ast::Merge::EmitterBase
  • Object
show all
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.

Examples:

Basic usage

emitter = Emitter.new
emitter.emit_comment("This is a comment")
emitter.emit_line("echo 'hello'")

Instance Method Summary collapse

Instance Method Details

#clear_subclass_stateObject

Clear subclass-specific state



24
25
26
# File 'lib/bash/merge/emitter.rb', line 24

def clear_subclass_state
  
end

#emit_blank_lineObject



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

Parameters:

  • pattern (String)

    Pattern to match



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_endObject

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

Parameters:

  • expression (String)

    Expression to match



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

Parameters:

  • text (String)

    Comment text (without #)

  • inline (Boolean) (defaults to: false)

    Whether this is an inline comment



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_doneObject

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

Parameters:

  • condition (String)

    Condition expression



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_elseObject

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_esacObject

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_fiObject

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

Parameters:

  • var (String)

    Loop variable name

  • items (String)

    Items to iterate over



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_endObject

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

Parameters:

  • name (String)

    Function name



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

Parameters:

  • condition (String)

    Condition expression



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

Parameters:

  • line (String)

    Line to emit



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

Parameters:

  • interpreter (String) (defaults to: '/bin/bash')

    Interpreter path (e.g., "/bin/bash")



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

Parameters:

  • comment (Hash)

    Comment with :text, :indent



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

Parameters:

  • name (String)

    Variable name

  • value (String)

    Variable value

  • export (Boolean) (defaults to: false)

    Whether to export the variable

  • inline_comment (String, nil) (defaults to: nil)

    Optional inline comment



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

Parameters:

  • condition (String)

    Condition expression



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(**_options)
  
end

#to_bashString

Get the output as a Bash string

Returns:

  • (String)


185
186
187
# File 'lib/bash/merge/emitter.rb', line 185

def to_bash
  to_s
end