123456789_123456789_123456789_123456789_123456789_

Class: RBS::Location

Relationships & Source Files
Inherits: Object
Defined in: lib/rbs/location_aux.rb,
ext/rbs_extension/location.c

Constant Summary

Class Method Summary

Instance Method Summary

Constructor Details

.new(buffer_ = nil, start_pos_ = nil, end_pos_ = nil, buffer: nil, start_pos: nil, end_pos: nil) ⇒ Location

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 11

def self.new(buffer_ = nil, start_pos_ = nil, end_pos_ = nil, buffer: nil, start_pos: nil, end_pos: nil)
  __skip__ =
    begin
      if buffer && start_pos && end_pos
        super(buffer, start_pos, end_pos)
      else
        super(buffer_, start_pos_, end_pos_)
      end
    end
end

Class Method Details

.to_string(location, default: "*:*:*...*:*")

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 93

def self.to_string(location, default: "*:*:*...*:*")
  location&.to_s || default
end

Instance Method Details

#==(other)

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 70

def ==(other)
  other.is_a?(Location) &&
    other.buffer == buffer &&
    other.start_pos == start_pos &&
    other.end_pos == end_pos
end

#[](name)

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 221

static VALUE location_aref(VALUE self, VALUE name) {
  rbs_loc *loc = rbs_check_location(self);

  range result;
  ID id = SYM2ID(name);

  if (rbs_loc_list_find(loc->requireds, id, &result)) {
    return rbs_new_location(loc->buffer, result);
  }

  if (rbs_loc_list_find(loc->optionals, id, &result)) {
    if (null_range_p(result)) {
      return Qnil;
    } else {
      return rbs_new_location(loc->buffer, result);
    }
  }

  VALUE string = rb_funcall(name, rb_intern("to_s"), 0);
  rb_raise(rb_eRuntimeError, "Unknown child name given: %s", RSTRING_PTR(string));
}

#_add_optional_child(name, start, end)

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 192

static VALUE location_add_optional_child(VALUE self, VALUE name, VALUE start, VALUE end) {
  rbs_loc *loc = rbs_check_location(self);

  range rg;
  rg.start = rbs_loc_position(FIX2INT(start));
  rg.end = rbs_loc_position(FIX2INT(end));

  rbs_loc_add_optional_child(loc, SYM2ID(name), rg);

  return Qnil;
}

#_add_optional_no_child(name)

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 204

static VALUE location_add_optional_no_child(VALUE self, VALUE name) {
  rbs_loc *loc = rbs_check_location(self);

  rbs_loc_add_optional_child(loc, SYM2ID(name), NULL_RANGE);

  return Qnil;
}

#_add_required_child(name, start, end)

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 180

static VALUE location_add_required_child(VALUE self, VALUE name, VALUE start, VALUE end) {
  rbs_loc *loc = rbs_check_location(self);

  range rg;
  rg.start = rbs_loc_position(FIX2INT(start));
  rg.end = rbs_loc_position(FIX2INT(end));

  rbs_loc_add_required_child(loc, SYM2ID(name), rg);

  return Qnil;
}

#_end_loc (private)

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 167

static VALUE location_end_loc(VALUE self) {
  rbs_loc *loc = rbs_check_location(self);

  if (loc->rg.end.line >= 0) {
    VALUE pair = rb_ary_new_capa(2);
    rb_ary_push(pair, INT2FIX(loc->rg.end.line));
    rb_ary_push(pair, INT2FIX(loc->rg.end.column));
    return pair;
  } else {
    return Qnil;
  }
}

#_optional_keys

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 243

static VALUE location_optional_keys(VALUE self) {
  VALUE keys = rb_ary_new();

  rbs_loc *loc = rbs_check_location(self);
  rbs_loc_list *list = loc->optionals;

  while (list) {
    rb_ary_push(keys, ID2SYM(list->name));
    list = list->next;
  }

  return keys;
}

#_required_keys

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 257

static VALUE location_required_keys(VALUE self) {
  VALUE keys = rb_ary_new();

  rbs_loc *loc = rbs_check_location(self);
  rbs_loc_list *list = loc->requireds;

  while (list) {
    rb_ary_push(keys, ID2SYM(list->name));
    list = list->next;
  }

  return keys;
}

#_start_loc (private)

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 154

static VALUE location_start_loc(VALUE self) {
  rbs_loc *loc = rbs_check_location(self);

  if (loc->rg.start.line >= 0) {
    VALUE pair = rb_ary_new_capa(2);
    rb_ary_push(pair, INT2FIX(loc->rg.start.line));
    rb_ary_push(pair, INT2FIX(loc->rg.start.column));
    return pair;
  } else {
    return Qnil;
  }
}

#add_optional_child(name, range)

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 101

def add_optional_child(name, range)
  if range
    _add_optional_child(name, range.begin, range.end)
  else
    _add_optional_no_child(name);
  end
end

#add_required_child(name, range)

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 97

def add_required_child(name, range)
  _add_required_child(name, range.begin, range.end)
end

#aref

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 22

alias aref []

#buffer

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 139

static VALUE location_buffer(VALUE self) {
  rbs_loc *loc = rbs_check_location(self);
  return loc->buffer;
}

#each_optional_key(&block)

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 109

def each_optional_key(&block)
  if block
    _optional_keys.uniq.each(&block)
  else
    enum_for(:each_optional_key)
  end
end

#each_required_key(&block)

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 117

def each_required_key(&block)
  if block
    _required_keys.uniq.each(&block)
  else
    enum_for(:each_required_key)
  end
end

#end_column

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 42

def end_column
  end_loc[1]
end

#end_line

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 38

def end_line
  end_loc[0]
end

#end_loc

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 52

def end_loc
  @end_loc ||= begin
    _end_loc || buffer.pos_to_loc(end_pos)
  end
end

#end_pos

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 149

static VALUE location_end_pos(VALUE self) {
  rbs_loc *loc = rbs_check_location(self);
  return INT2FIX(loc->rg.end.char_pos);
}

#initialize(buffer, start_pos, end_pos) (private)

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 114

static VALUE location_initialize(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos) {
  rbs_loc *loc = rbs_check_location(self);

  position start = rbs_loc_position(FIX2INT(start_pos));
  position end = rbs_loc_position(FIX2INT(end_pos));

  loc->buffer = buffer;
  loc->rg.start = start;
  loc->rg.end = end;

  return Qnil;
}

#initialize_copy(other) (private)

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 127

static VALUE location_initialize_copy(VALUE self, VALUE other) {
  rbs_loc *self_loc = rbs_check_location(self);
  rbs_loc *other_loc = rbs_check_location(other);

  self_loc->buffer = other_loc->buffer;
  self_loc->rg = other_loc->rg;
  self_loc->requireds = rbs_loc_list_dup(other_loc->requireds);
  self_loc->optionals = rbs_loc_list_dup(other_loc->optionals);

  return Qnil;
}

#inspect

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 5

def inspect
  rks = each_required_key.to_a
  ops = each_optional_key.to_a.map {|x| "?#{x}" }
  "#<#{self.class}:#{self.__id__} buffer=#{buffer.name}, start=#{start_line}:#{start_column}, pos=#{start_pos}...#{end_pos}, children=#{(rks + ops).join(",")} source='#{source.lines.first&.chomp}'>"
end

#key?(name) ⇒ Boolean

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 125

def key?(name)
  optional_key?(name) || required_key?(name)
end

#name

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 26

def name
  buffer.name
end

#optional_key?(name) ⇒ Boolean

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 129

def optional_key?(name)
  _optional_keys.include?(name)
end

#range

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 58

def range
  @range ||= start_pos...end_pos
end

#required_key?(name) ⇒ Boolean

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 133

def required_key?(name)
  _required_keys.include?(name)
end

#source

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 62

def source
  @source ||= (buffer.content[range] || raise)
end

#start_column

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 34

def start_column
  start_loc[1]
end

#start_line

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 30

def start_line
  start_loc[0]
end

#start_loc

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 46

def start_loc
  @start_loc ||= begin
    _start_loc || buffer.pos_to_loc(start_pos)
  end
end

#start_pos

[ GitHub ]

  
# File 'ext/rbs_extension/location.c', line 144

static VALUE location_start_pos(VALUE self) {
  rbs_loc *loc = rbs_check_location(self);
  return INT2FIX(loc->rg.start.char_pos);
}

#to_json(state = _ = nil)

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 77

def to_json(state = _ = nil)
  {
    start: {
      line: start_line,
      column: start_column
    },
    end: {
      line: end_line,
      column: end_column
    },
    buffer: {
      name: name&.to_s
    }
  }.to_json(state)
end

#to_s

[ GitHub ]

  
# File 'lib/rbs/location_aux.rb', line 66

def to_s
  "#{name || "-"}:#{start_line}:#{start_column}...#{end_line}:#{end_column}"
end