class AdLint::Cc1::Declaration

Attributes

declaration_specifiers[R]
init_declarators[R]
items[R]

Public Class Methods

new(dcl_specs, init_dcrs, sym_tbl) click to toggle source
Calls superclass method AdLint::Cc1::SyntaxNode::new
# File lib/adlint/cc1/syntax.rb, line 2303
def initialize(dcl_specs, init_dcrs, sym_tbl)
  super()
  @declaration_specifiers = dcl_specs
  @init_declarators = init_dcrs
  @items = build_items(dcl_specs, init_dcrs, sym_tbl)
end

Public Instance Methods

inspect(indent = 0) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 2318
def inspect(indent = 0)
  ([" " * indent + "#{short_class_name} (#{location.inspect})"] +
   @items.map { |item| item.inspect(indent + 1) }).join("\n")
end
location() click to toggle source
# File lib/adlint/cc1/syntax.rb, line 2314
def location
  head_location
end

Private Instance Methods

build_function_declaration(dcl_specs, init_dcrs, sym_tbl) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 2353
def build_function_declaration(dcl_specs, init_dcrs, sym_tbl)
  if dcl_specs && sc_spec = dcl_specs.storage_class_specifier and
      sc_spec.type == :TYPEDEF
    return []
  end

  init_dcrs.each_with_object([]) do |init_dcr, fun_dcls|
    if init_dcr.declarator.function?
      id = init_dcr.declarator.identifier
      sym = sym_tbl.create_new_symbol(ObjectName, id)
      fun_dcls.push(FunctionDeclaration.new(dcl_specs, init_dcr, sym))
    end
  end
end
build_items(dcl_specs, init_dcrs, sym_tbl) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 2324
def build_items(dcl_specs, init_dcrs, sym_tbl)
  build_type_declaration(dcl_specs, init_dcrs, sym_tbl) +
    build_function_declaration(dcl_specs, init_dcrs, sym_tbl) +
    build_variable_declaration(dcl_specs, init_dcrs, sym_tbl) +
    build_variable_definition(dcl_specs, init_dcrs, sym_tbl)
end
build_type_declaration(dcl_specs, init_dcrs, sym_tbl) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 2331
def build_type_declaration(dcl_specs, init_dcrs, sym_tbl)
  return [] unless dcl_specs

  type_dcls = []

  dcl_specs.type_specifiers.each do |type_spec|
    builder = TypeDeclarationBuilder.new(sym_tbl)
    type_spec.accept(builder)
    type_dcls.concat(builder.type_declarations)
  end

  if sc = dcl_specs.storage_class_specifier and sc.type == :TYPEDEF
    init_dcrs.each do |init_dcr|
      id = init_dcr.declarator.identifier
      sym = sym_tbl.create_new_symbol(TypedefName, id)
      type_dcls.push(TypedefDeclaration.new(dcl_specs, init_dcr, sym))
    end
  end

  type_dcls
end
build_variable_declaration(dcl_specs, init_dcrs, sym_tbl) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 2368
def build_variable_declaration(dcl_specs, init_dcrs, sym_tbl)
  return [] unless dcl_specs

  unless sc = dcl_specs.storage_class_specifier and sc.type == :EXTERN
    return []
  end

  init_dcrs.each_with_object([]) do |init_dcr, var_dcls|
    if init_dcr.declarator.variable?
      dcr = init_dcr.declarator
      sym = sym_tbl.create_new_symbol(ObjectName, dcr.identifier)
      var_dcls.push(VariableDeclaration.new(dcl_specs, dcr, sym))
    end
  end
end
build_variable_definition(dcl_specs, init_dcrs, sym_tbl) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 2384
def build_variable_definition(dcl_specs, init_dcrs, sym_tbl)
  if dcl_specs && sc = dcl_specs.storage_class_specifier and
      sc.type == :EXTERN || sc.type == :TYPEDEF
    return []
  end

  init_dcrs.each_with_object([]) do |init_dcr, var_defs|
    if init_dcr.declarator.variable?
      id = init_dcr.declarator.identifier
      sym = sym_tbl.create_new_symbol(ObjectName, id)
      var_defs.push(VariableDefinition.new(dcl_specs, init_dcr, sym))
    end
  end
end