Class: Divine::BabelHelperMethods

Inherits:
Object
  • Object
show all
Defined in:
lib/divine/code_generators/code_generator.rb

Overview

Support methods needed when generating source code files

Instance Method Summary collapse

Instance Method Details

#camelize(*str) ⇒ Object

Camelize comming args

  • Args :

  • *str -> list of arguments needed to be camelized



76
77
78
79
# File 'lib/divine/code_generators/code_generator.rb', line 76

def camelize(*str)
  ss = str.map(&:to_s).join("_").split(/_/).flatten
  "#{ss.first.downcase}#{ss[1..-1].map(&:downcase).map(&:capitalize).join}"
end

#format_src(first_indent, following_indent, is, spc = " ") ⇒ Object

Handle indentation



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/divine/code_generators/code_generator.rb', line 48

def format_src(first_indent, following_indent, is, spc = " ")
  indent = "#{spc * first_indent}"
  is.flatten.compact.map do |i|
    case i
    when :indent
      indent << spc * following_indent
      nil
    when :deindent
      indent = indent[0..-(following_indent+1)]
      nil
    else
      "#{indent}#{i}"
    end
  end.compact.join("\n")
end

#get_fresh_variable_nameObject

Return new variable name



67
68
69
70
# File 'lib/divine/code_generators/code_generator.rb', line 67

def get_fresh_variable_name
  @vindex = (@vindex || 0xFF) + 1
  return "var_#{@vindex.to_s(16)}"
end

#get_header_comment_textObject

Return Header comments for generated files



84
85
86
87
88
89
90
91
# File 'lib/divine/code_generators/code_generator.rb', line 84

def get_header_comment_text
  return [
    "",
    "-- DO NOT EDIT THIS FILE --", "",
    "This file was generated by Divine #{Divine::VERSION} (#{Time.now.to_s})", "",
    "-- DO NOT EDIT THIS FILE --", ""
  ]
end

#sanity_check(ss) ⇒ Object

Sanity check the different revisions of the struct



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/divine/code_generators/code_generator.rb', line 96

def sanity_check(ss)
  vos = ss.sort do |x,y|
    v1,v2 = [x,y].map(&:version)
    v1 <=> v2
  end

  # Check version numbers
  unless vos.map(&:version).uniq.size == ss.size
    raise "Inconsistent version numbering for '#{ss.first.name}': #{vos.map(&:version).join(', ')}"
  end
  
  # Check that we don't have multiple variables with same name
  vos.each do |s|
    names = s.fields.group_by(&:name)
    names.each_pair do |k, v|
      raise "Multiple fields with same name '#{k}' is defined in '#{s.name}', version #{s.version}" unless v.size == 1
    end
  end
  
  # Check types between versions
  check_field_types(vos)
  
  # Check for changed definitions
  check_freezed_structs(vos)
  
  # Return them ordered by version
  vos
end