generate_outmethods!

in scripts/generate_json_outfuncs.rb [19:72]


  def generate_outmethods!
    @outmethods = {}

    ['nodes/parsenodes', 'nodes/primnodes'].each do |group|
      @struct_defs[group].each do |node_type, struct_def|
        @outmethods[node_type] = format("  WRITE_NODE_TYPE(\"%s\");\n\n", node_type)

        struct_def['fields'].each do |field_def|
          name = field_def['name']
          orig_type = field_def['c_type']

          next unless name && orig_type

          type = TYPE_OVERRIDES[[node_type, name]] || orig_type

          if type == :skip || type == 'Expr'
            
          elsif type == 'NodeTag'
            
          elsif ['bool', 'long', 'char'].include?(type)
            @outmethods[node_type] += format("  WRITE_%s_FIELD(%s);\n", type.upcase, name)
          elsif ['int', 'int16', 'int32', 'AttrNumber'].include?(type)
            @outmethods[node_type] += format("  WRITE_INT_FIELD(%s);\n", name)
          elsif ['uint', 'uint16', 'uint32', 'Index', 'bits32', 'Oid'].include?(type)
            @outmethods[node_type] += format("  WRITE_UINT_FIELD(%s);\n", name)
          elsif type == 'char*'
            @outmethods[node_type] += format("  WRITE_STRING_FIELD(%s);\n", name)
          elsif ['float', 'double', 'Cost', 'Selectivity'].include?(type)
            @outmethods[node_type] += format("  WRITE_FLOAT_FIELD(%s);\n", name)
          elsif ['Bitmapset*', 'Relids'].include?(type)
            @outmethods[node_type] += format("  WRITE_BITMAPSET_FIELD(%s);\n", name)
          elsif ['Value'].include?(type)
            @outmethods[node_type] += format("  WRITE_NODE_FIELD(%s);\n", name)
          elsif ['CreateStmt'].include?(type)
            
            @outmethods[node_type] += format("  WRITE_NODE_FIELD_WITH_TYPE(%s, %s);\n", name, type)
          elsif type == 'Node*' || @nodetypes.include?(type[0..-2])
            @outmethods[node_type] += format("  WRITE_NODE_PTR_FIELD(%s);\n", name)
          elsif type.end_with?('*')
            puts format('ERR: %s %s', name, type)
          else 
            @outmethods[node_type] += format("  WRITE_ENUM_FIELD(%s);\n", name)
          end
        end
      end
    end

    @typedefs.each do |typedef|
      next unless @outmethods[typedef['source_type']]

      @outmethods[typedef['new_type_name']] = @outmethods[typedef['source_type']]
    end
  end