class AdLint::Exam::CBuiltin::W0549

Public Class Methods

new(phase_ctxt) click to toggle source
Calls superclass method AdLint::Examination::new
# File lib/adlint/exam/c_builtin/cpp_check.rb, line 888
def initialize(phase_ctxt)
  super
  interp = phase_ctxt[:cpp_interpreter]
  interp.on_function_like_macro_defined    += T(:check)
  interp.on_va_function_like_macro_defined += T(:check)
end

Private Instance Methods

check(*, macro) click to toggle source
# File lib/adlint/exam/c_builtin/cpp_check.rb, line 896
def check(*, macro)
  return unless macro.replacement_list

  macro.parameter_names.each do |name|
    macro.replacement_list.tokens.each_with_index do |pp_tok, idx|
      next unless pp_tok.value == name

      prv_tok = macro.replacement_list.tokens[[idx - 1, 0].max]
      nxt_tok = macro.replacement_list.tokens[idx + 1]

      next if prv_tok && prv_tok.value =~ /\A##?\z/
      next if nxt_tok && nxt_tok.value == "##"

      unless prv_tok && prv_tok.value == "("
        W(pp_tok.location)
        next
      end

      unless nxt_tok && nxt_tok.value == ")"
        W(pp_tok.location)
        next
      end
    end
  end
end