class JRuby::Lint::Checkers::NonAtomic

Constants

CVAR
IVAR
OPERATORS

Public Instance Methods

add_finding(collector, node, name) click to toggle source
# File lib/jruby/lint/checkers/nonatomic.rb, line 64
def add_finding(collector, node, name)
  collector.add_finding("Non-local operator assignment (#{name}) is not guaranteed to be atomic.", [:nonatomic, :warning], node.line+1)
end
check_nonatomic(orig_node, risk_node, name=nil) click to toggle source
# File lib/jruby/lint/checkers/nonatomic.rb, line 52
def check_nonatomic(orig_node, risk_node, name=nil)
  case risk_node
  when org::jruby::ast::LocalVarNode,
       org::jruby::ast::DVarNode
    # ok...mostly-safe cases
    false
  else
    add_finding(collector, orig_node, name || risk_node.name)
    true
  end
end
operator_op_assignment?(node, type) click to toggle source
# File lib/jruby/lint/checkers/nonatomic.rb, line 29
def operator_op_assignment?(node, type)
  rhs = node.value_node
  rhs.kind_of?(org::jruby::ast::CallNode) &&
    OPERATORS.include?(rhs.name) &&
    rhs.receiver_node.kind_of?(type)
end
visitClassVarAsgnNode(node) click to toggle source
# File lib/jruby/lint/checkers/nonatomic.rb, line 44
def visitClassVarAsgnNode(node)
  if !@last && operator_op_assignment?(node, CVAR) ||
     @last && parent != @last
    check_nonatomic(node, node)
  end
  @last = nil
end
visitInstAsgnNode(node) click to toggle source
# File lib/jruby/lint/checkers/nonatomic.rb, line 36
def visitInstAsgnNode(node)
  if !@last && operator_op_assignment?(node, IVAR) ||
     @last && parent != @last
    check_nonatomic(node, node)
  end
  @last = nil
end
visitOpAsgnAndNode(node) click to toggle source
# File lib/jruby/lint/checkers/nonatomic.rb, line 15
def visitOpAsgnAndNode(node)
  @last = node
  check_nonatomic(node, node.first_node)
end
visitOpAsgnNode(node) click to toggle source
# File lib/jruby/lint/checkers/nonatomic.rb, line 25
def visitOpAsgnNode(node)
  check_nonatomic(node, node.receiver_node, node.variable_name)
end
visitOpAsgnOrNode(node) click to toggle source
# File lib/jruby/lint/checkers/nonatomic.rb, line 10
def visitOpAsgnOrNode(node)
  @last = node
  check_nonatomic(node, node.first_node)
end
visitOpElementAsgnNode(node) click to toggle source
# File lib/jruby/lint/checkers/nonatomic.rb, line 20
def visitOpElementAsgnNode(node)
  name = src_line(node.line).split(node.operator_name + '=', 2)[0].strip
  add_finding(collector, node, name)
end