Class: Kumi::Core::Analyzer::Passes::Codegen::Js::OutputBuffer
- Inherits:
-
Object
- Object
- Kumi::Core::Analyzer::Passes::Codegen::Js::OutputBuffer
- Defined in:
- lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb
Instance Method Summary collapse
- #dedent! ⇒ Object
- #emit_class_methods(decl_names) ⇒ Object
- #emit_footer ⇒ Object
- #emit_header(schema_digest) ⇒ Object
- #indent! ⇒ Object
- #indented ⇒ Object
-
#initialize ⇒ OutputBuffer
constructor
A new instance of OutputBuffer.
- #last_line ⇒ Object
- #reset! ⇒ Object
- #rewrite_line(new_line_content) ⇒ Object
- #section(name) ⇒ Object
- #to_s ⇒ Object
- #write(s, indent = @indent) ⇒ Object
Constructor Details
#initialize ⇒ OutputBuffer
Returns a new instance of OutputBuffer.
12 13 14 15 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 12 def initialize @out = [] @indent = 0 end |
Instance Method Details
#dedent! ⇒ Object
24 25 26 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 24 def dedent! @indent -= 1 if @indent.positive? end |
#emit_class_methods(decl_names) ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 39 def emit_class_methods(decl_names) write "constructor(inputData = {}) {" indented { write "this.input = inputData;" } write "}\n" write "static from(inputData = {}) {" indented { write "return new KumiCompiledModule(inputData);" } write "}\n" write "update(inputData) {" indented do write "this.input = { ...this.input, ...inputData };" write "return this;" end write "}\n" return if decl_names.empty? write "get(name) {" indented do write "switch (name) {" decl_names.each { |name| write " case '#{name}': return _$#{name}(this.input);" } write " default: throw new Error(`Unknown declaration: ${name}`);" write "}" end write "}\n" end |
#emit_footer ⇒ Object
34 35 36 37 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 34 def dedent! write "}" end |
#emit_header(schema_digest) ⇒ Object
28 29 30 31 32 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 28 def emit_header(schema_digest) write "// Autogenerated by Kumi Codegen for schema #{schema_digest}" write "export class KumiCompiledModule {" indent! end |
#indent! ⇒ Object
20 21 22 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 20 def indent! @indent += 1 end |
#indented ⇒ Object
75 76 77 78 79 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 75 def indented indent! yield dedent! end |
#last_line ⇒ Object
85 86 87 88 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 85 def last_line # In our array, the last item is the full line with newline @out.last end |
#reset! ⇒ Object
18 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 18 def reset! = @out.clear |
#rewrite_line(new_line_content) ⇒ Object
90 91 92 93 94 95 96 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 90 def rewrite_line(new_line_content) return if @out.empty? # Preserve the indentation of the line being replaced. current_indent_str = @out.last.match(/^\s*/)[0] @out[-1] = "#{current_indent_str}#{new_line_content}\n" end |
#section(name) ⇒ Object
67 68 69 70 71 72 73 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 67 def section(name) write "" write "// --- #{name} ---" yield write "// --- END #{name} ---" write "" end |
#to_s ⇒ Object
17 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 17 def to_s = @out.join |
#write(s, indent = @indent) ⇒ Object
81 82 83 |
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 81 def write(s, indent = @indent) @out << (" " * indent) << s << "\n" end |