Class: Kumi::Core::Analyzer::Passes::Codegen::Js::OutputBuffer

Inherits:
Object
  • Object
show all
Defined in:
lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb

Instance Method Summary collapse

Constructor Details

#initializeOutputBuffer

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


34
35
36
37
# File 'lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb', line 34

def emit_footer
  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

#indentedObject



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_lineObject



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_sObject



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