class AdLint::Exam::CBuiltin::FN_NEST

Public Class Methods

new(phase_ctxt) click to toggle source
Calls superclass method AdLint::Examination::new
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 562
def initialize(phase_ctxt)
  super
  @fpath = phase_ctxt[:sources].first.fpath
  trav = phase_ctxt[:cc1_ast_traversal]
  trav.enter_ansi_function_definition  += T(:enter_function)
  trav.leave_ansi_function_definition  += T(:leave_function)
  trav.enter_kandr_function_definition += T(:enter_function)
  trav.leave_kandr_function_definition += T(:leave_function)
  trav.enter_compound_statement        += T(:enter_block)
  trav.leave_compound_statement        += T(:leave_block)
  trav.enter_if_statement              += T(:check_statement)
  trav.enter_if_else_statement         += T(:check_statement)
  trav.enter_while_statement           += T(:check_statement)
  trav.enter_do_statement              += T(:check_statement)
  trav.enter_for_statement             += T(:check_statement)
  trav.enter_c99_for_statement         += T(:check_statement)
  @cur_fun = nil
end

Private Instance Methods

check_statement(stmt) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 615
def check_statement(stmt)
  if @cur_fun
    case stmt
    when Cc1::IfStatement
      sub_statement = stmt.statement
    when Cc1::IfElseStatement
      if stmt.then_statement.kind_of?(Cc1::CompoundStatement)
        sub_statement = stmt.else_statement
      else
        sub_statement = stmt.then_statement
      end
    when Cc1::WhileStatement, Cc1::DoStatement
      sub_statement = stmt.statement
    when Cc1::ForStatement, Cc1::C99ForStatement
      sub_statement = stmt.body_statement
    end

    case sub_statement
    when Cc1::CompoundStatement, Cc1::IfStatement, Cc1::IfElseStatement
    else
      @cur_nest_level += 1
      @max_nest_level = [@max_nest_level, @cur_nest_level].max
    end
  end
end
do_execute(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 583
def do_execute(*) end
do_prepare(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 582
def do_prepare(*) end
enter_block(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 602
def enter_block(*)
  if @cur_fun
    @cur_nest_level += 1
    @max_nest_level = [@max_nest_level, @cur_nest_level].max
  end
end
enter_function(fun_def) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 585
def enter_function(fun_def)
  @cur_fun = fun_def
  # NOTE: Nest level of the top of the function is 0.
  #       Function definition must have a compound-statement as the
  #       function body.
  @max_nest_level = @cur_nest_level = -1
end
leave_block(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 609
def leave_block(*)
  if @cur_fun
    @cur_nest_level -= 1
  end
end
leave_function(fun_def) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 593
def leave_function(fun_def)
  if @cur_fun
    FN_NEST(FunctionId.new(@cur_fun.identifier.value,
                           @cur_fun.signature.to_s),
            @cur_fun.location, @max_nest_level)
    @cur_fun = nil
  end
end