class Opal::Rewriters::JsReservedWords

def self.valid_ivar_name?(name)

def self.valid_ivar_name?(name)
  !(PROTO_SPECIAL_PROPS =~ name || PROTO_SPECIAL_METHODS =~ name)
end

def self.valid_name?(name)

def self.valid_name?(name)
  BASIC_IDENTIFIER_RULES =~ name && !(
    ES51_RESERVED_WORD =~ name ||
    ES3_RESERVED_WORD_EXCLUSIVE =~ name ||
    IMMUTABLE_PROPS =~ name
  )
end

def fix_ivar_name(name)

def fix_ivar_name(name)
  self.class.valid_ivar_name?(name.to_s[1..-1]) ? name : "#{name}$".to_sym
end

def fix_var_name(name)

def fix_var_name(name)
  self.class.valid_name?(name) ? name : "#{name}$".to_sym
end

def on_argument(node)

def on_argument(node)
  node = super(node)
  name, value = *node
  fixed_name = fix_var_name(name)
  new_children = value ? [fixed_name, value] : [fixed_name]
  node.updated(nil, new_children, meta: { arg_name: name })
end

def on_ivar(node)

def on_ivar(node)
  name, _ = *node
  node = node.updated(nil, [fix_ivar_name(name)])
  super(node)
end

def on_ivasgn(node)

def on_ivasgn(node)
  name, value = *node
  node =
    if value
      node.updated(nil, [fix_ivar_name(name), value])
    else
      node.updated(nil, [fix_ivar_name(name)])
    end
  super(node)
end

def on_lvar(node)

def on_lvar(node)
  name, _ = *node
  node = node.updated(nil, [fix_var_name(name)])
  super(node)
end

def on_lvasgn(node)

def on_lvasgn(node)
  name, value = *node
  node =
    if value
      node.updated(nil, [fix_var_name(name), value])
    else
      node.updated(nil, [fix_var_name(name)])
    end
  super(node)
end

def on_restarg(node)

def m(*, **); end
because they may have no name
Restarg and kwrestarg are special cases
def on_restarg(node)
  name, _ = *node
  if name
    node = node.updated(nil, [fix_var_name(name)], meta: { arg_name: name })
  end
  node
end