class AdLint::Cc1::SwitchStatement

Attributes

expression[R]
statement[R]

Public Class Methods

new(expr, stmt) click to toggle source
Calls superclass method AdLint::Cc1::Statement::new
# File lib/adlint/cc1/syntax.rb, line 3557
def initialize(expr, stmt)
  super()
  @expression = expr
  @statement = stmt
  derive_clause_conditions
end

Public Instance Methods

inspect(indent = 0) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3571
def inspect(indent = 0)
  " " * indent + "#{short_class_name}\n" +
    @expression.inspect(indent + 1) + "\n" + @statement.inspect(indent + 1)
end
location() click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3567
def location
  head_location
end

Private Instance Methods

derive_clause_conditions() click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3577
def derive_clause_conditions
  case_exprs = []
  default_stmt = nil

  @statement.block_items.each do |item|
    case item
    when GenericLabeledStatement
      item = item.statement
      redo
    when CaseLabeledStatement
      item.normalized_expression =
        equal_to_expression(@expression, item.expression, item.location)
      case_exprs.push(item.normalized_expression)
      item = item.statement
      redo
    when DefaultLabeledStatement
      default_stmt = item
      item = item.statement
      redo
    end
  end

  if default_stmt
    default_stmt.normalized_expression =
      derive_default_clause_condition(case_exprs, default_stmt.location)
  end
end
derive_default_clause_condition(case_exprs, loc) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3605
def derive_default_clause_condition(case_exprs, loc)
  if case_exprs.empty?
    equal_to_expression(@expression, @expression, loc)
  else
    case_exprs.map { |expr|
      not_equal_to_expression(expr.lhs_operand, expr.rhs_operand, loc)
    }.reduce { |cond, expr| logical_and_expression(cond, expr, loc) }
  end
end
equal_to_expression(lhs, rhs, loc) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3615
def equal_to_expression(lhs, rhs, loc)
  EqualityExpression.new(equal_to_operator(loc), lhs, rhs)
end
equal_to_operator(loc) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3627
def equal_to_operator(loc)
  Token.new("==", "==", loc)
end
logical_and_expression(lhs, rhs, loc) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3623
def logical_and_expression(lhs, rhs, loc)
  LogicalAndExpression.new(logical_and_operator(loc), lhs, rhs)
end
logical_and_operator(loc) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3635
def logical_and_operator(loc)
  Token.new("&&", "&&", loc)
end
not_equal_to_expression(lhs, rhs, loc) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3619
def not_equal_to_expression(lhs, rhs, loc)
  EqualityExpression.new(not_equal_to_operator(loc), lhs, rhs)
end
not_equal_to_operator(loc) click to toggle source
# File lib/adlint/cc1/syntax.rb, line 3631
def not_equal_to_operator(loc)
  Token.new("!=", "!=", loc)
end