class AdLint::Cc1::IterationStatement

Public Instance Methods

deduct_controlling_expression() click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3643
def deduct_controlling_expression
  subclass_responsibility
end
varying_expressions() click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3651
def varying_expressions
  collect_varying_binary_expressions(self) +
    collect_varying_unary_expressions(self)
end
varying_variable_names() click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3647
def varying_variable_names
  collect_varying_variable_names(self).uniq
end

Private Instance Methods

collect_loop_breaking_if_else_statements(node) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3684
def collect_loop_breaking_if_else_statements(node)
  collect_if_else_statements(node).select do |stmt|
    contain_loop_breaking?(stmt.then_statement) ||
      contain_loop_breaking?(stmt.else_statement)
  end
end
collect_loop_breaking_if_statements(node) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3678
def collect_loop_breaking_if_statements(node)
  collect_if_statements(node).select do |stmt|
    contain_loop_breaking?(stmt.statement)
  end
end
collect_loop_breaking_selection_statements(node) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3673
def collect_loop_breaking_selection_statements(node)
  collect_loop_breaking_if_statements(node) +
    collect_loop_breaking_if_else_statements(node)
end
collect_varying_binary_expressions(node) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3723
def collect_varying_binary_expressions(node)
  all_varying_binary_exprs =
    collect_simple_assignment_expressions(node) +
    collect_compound_assignment_expressions(node)

  all_varying_binary_exprs.select do |expr|
    expr.lhs_operand.kind_of?(ObjectSpecifier)
  end
end
collect_varying_unary_expressions(node) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3740
def collect_varying_unary_expressions(node)
  all_varying_unary_exprs =
    collect_prefix_increment_expressions(node) +
    collect_prefix_decrement_expressions(node) +
    collect_postfix_increment_expressions(node) +
    collect_postfix_decrement_expressions(node)

  all_varying_unary_exprs.select do |expr|
    expr.operand.kind_of?(ObjectSpecifier)
  end
end
collect_varying_variable_names(node) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3712
def collect_varying_variable_names(node)
  collect_varying_variable_names_in_binary_expression(node) +
    collect_varying_variable_names_in_unary_expression(node)
end
collect_varying_variable_names_in_binary_expression(node) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3717
def collect_varying_variable_names_in_binary_expression(node)
  collect_varying_binary_expressions(node).map do |expr|
    expr.lhs_operand.identifier.value
  end
end
collect_varying_variable_names_in_unary_expression(node) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3734
def collect_varying_variable_names_in_unary_expression(node)
  collect_varying_unary_expressions(node).map do |expr|
    expr.operand.identifier.value
  end
end
contain_loop_breaking?(node) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3691
def contain_loop_breaking?(node)
  items = node.kind_of?(CompoundStatement) ? node.block_items : [node]
  items.any? do |item|
    case item
    when GenericLabeledStatement
      item = item.statement
      redo
    when GotoStatement
      # FIXME: Must check whether the goto-statement goes outside of the
      #        loop or not.
      true
    when BreakStatement
      true
    when ReturnStatement
      true
    else
      false
    end
  end
end
deduct_controlling_expression_candidates(rough_cands) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3657
def deduct_controlling_expression_candidates(rough_cands)
  case
  when rough_cands.empty?
    [[nil, nil]]
  when rough_cands.size == 1
    rough_cands
  else
    varying_var_names = varying_variable_names
    rough_cands.select do |expr_pair|
      collect_object_specifiers(expr_pair.first).any? do |os|
        varying_var_names.include?(os.identifier.value)
      end
    end
  end
end