Class: RBS::Location
- Inherits:
-
Object
- Object
- RBS::Location
- Defined in:
- lib/rbs/location_aux.rb,
ext/rbs_extension/legacy_location.c
Constant Summary collapse
- WithChildren =
self
Class Method Summary collapse
- .new(buffer_ = nil, start_pos_ = nil, end_pos_ = nil, buffer: nil, start_pos: nil, end_pos: nil) ⇒ Object
- .to_string(location, default: "*:*:*...*:*") ⇒ Object
Instance Method Summary collapse
- #==(other) ⇒ Object
- #[](name) ⇒ Object (also: #aref)
- #_add_optional_child(name, start, end) ⇒ Object
- #_add_optional_no_child(name) ⇒ Object
- #_add_required_child(name, start, end) ⇒ Object
- #_end_pos ⇒ Object
- #_optional_keys ⇒ Object
- #_required_keys ⇒ Object
- #_start_pos ⇒ Object
- #add_optional_child(name, range) ⇒ Object
- #add_required_child(name, range) ⇒ Object
- #buffer ⇒ Object
- #each_optional_key(&block) ⇒ Object
- #each_required_key(&block) ⇒ Object
- #end_column ⇒ Object
- #end_line ⇒ Object
- #end_loc ⇒ Object
- #end_pos ⇒ Object
- #inspect ⇒ Object
- #key?(name) ⇒ Boolean
- #local_location ⇒ Object
- #local_source ⇒ Object
- #name ⇒ Object
- #optional_key?(name) ⇒ Boolean
- #range ⇒ Object
- #required_key?(name) ⇒ Boolean
- #source ⇒ Object
- #start_column ⇒ Object
- #start_line ⇒ Object
- #start_loc ⇒ Object
- #start_pos ⇒ Object
- #to_json(state = nil) ⇒ Object
- #to_s ⇒ Object
Class Method Details
.new(buffer_ = nil, start_pos_ = nil, end_pos_ = nil, buffer: nil, start_pos: nil, end_pos: nil) ⇒ Object
16 17 18 19 20 21 22 23 24 25 |
# File 'lib/rbs/location_aux.rb', line 16 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 |
.to_string(location, default: "*:*:*...*:*") ⇒ Object
102 103 104 |
# File 'lib/rbs/location_aux.rb', line 102 def self.to_string(location, default: "*:*:*...*:*") location&.to_s || default end |
Instance Method Details
#==(other) ⇒ Object
79 80 81 82 83 84 |
# File 'lib/rbs/location_aux.rb', line 79 def ==(other) other.is_a?(Location) && other.buffer == buffer && other.start_pos == start_pos && other.end_pos == end_pos end |
#[](name) ⇒ Object Also known as: aref
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
# File 'ext/rbs_extension/legacy_location.c', line 219 static VALUE location_aref(VALUE self, VALUE name) { rbs_loc *loc = rbs_check_location(self); ID id = rb_sym2id(name); if (loc->children != NULL) { for (unsigned short i = 0; i < loc->children->len; i++) { if (loc->children->entries[i].name == id) { rbs_loc_range result = loc->children->entries[i].rg; if (RBS_LOC_OPTIONAL_P(loc, i) && NULL_LOC_RANGE_P(result)) { return Qnil; } else { return rbs_new_location_from_loc_range(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) ⇒ Object
171 172 173 174 175 176 177 178 179 180 181 182 |
# File 'ext/rbs_extension/legacy_location.c', line 171 static VALUE location_add_optional_child(VALUE self, VALUE name, VALUE start, VALUE end) { rbs_loc *loc = rbs_check_location(self); rbs_loc_range rg = { .start = FIX2INT(start), .end = FIX2INT(end), }; rbs_loc_legacy_add_optional_child(loc, rb_sym2id(name), rg); return Qnil; } |
#_add_optional_no_child(name) ⇒ Object
184 185 186 187 188 189 190 |
# File 'ext/rbs_extension/legacy_location.c', line 184 static VALUE location_add_optional_no_child(VALUE self, VALUE name) { rbs_loc *loc = rbs_check_location(self); rbs_loc_legacy_add_optional_child(loc, rb_sym2id(name), RBS_LOC_NULL_RANGE); return Qnil; } |
#_add_required_child(name, start, end) ⇒ Object
158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'ext/rbs_extension/legacy_location.c', line 158 static VALUE location_add_required_child(VALUE self, VALUE name, VALUE start, VALUE end) { rbs_loc *loc = rbs_check_location(self); rbs_loc_range rg = { .start = FIX2INT(start), .end = FIX2INT(end), }; rbs_loc_legacy_add_required_child(loc, rb_sym2id(name), rg); return Qnil; } |
#_end_pos ⇒ Object
153 154 155 156 |
# File 'ext/rbs_extension/legacy_location.c', line 153 static VALUE location_end_pos(VALUE self) { rbs_loc *loc = rbs_check_location(self); return INT2FIX(loc->rg.end); } |
#_optional_keys ⇒ Object
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 |
# File 'ext/rbs_extension/legacy_location.c', line 242 static VALUE location_optional_keys(VALUE self) { VALUE keys = rb_ary_new(); rbs_loc *loc = rbs_check_location(self); rbs_loc_children *children = loc->children; if (children == NULL) { return keys; } for (unsigned short i = 0; i < children->len; i++) { if (RBS_LOC_OPTIONAL_P(loc, i)) { VALUE key_sym = rb_id2sym(children->entries[i].name); rb_ary_push(keys, key_sym); } } return keys; } |
#_required_keys ⇒ Object
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
# File 'ext/rbs_extension/legacy_location.c', line 261 static VALUE location_required_keys(VALUE self) { VALUE keys = rb_ary_new(); rbs_loc *loc = rbs_check_location(self); rbs_loc_children *children = loc->children; if (children == NULL) { return keys; } for (unsigned short i = 0; i < children->len; i++) { if (RBS_LOC_REQUIRED_P(loc, i)) { VALUE key_sym = rb_id2sym(children->entries[i].name); rb_ary_push(keys, key_sym); } } return keys; } |
#_start_pos ⇒ Object
148 149 150 151 |
# File 'ext/rbs_extension/legacy_location.c', line 148 static VALUE location_start_pos(VALUE self) { rbs_loc *loc = rbs_check_location(self); return INT2FIX(loc->rg.start); } |
#add_optional_child(name, range) ⇒ Object
110 111 112 113 114 115 116 |
# File 'lib/rbs/location_aux.rb', line 110 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) ⇒ Object
106 107 108 |
# File 'lib/rbs/location_aux.rb', line 106 def add_required_child(name, range) _add_required_child(name, range.begin, range.end) end |
#buffer ⇒ Object
143 144 145 146 |
# File 'ext/rbs_extension/legacy_location.c', line 143 static VALUE location_buffer(VALUE self) { rbs_loc *loc = rbs_check_location(self); return loc->buffer; } |
#each_optional_key(&block) ⇒ Object
118 119 120 121 122 123 124 |
# File 'lib/rbs/location_aux.rb', line 118 def each_optional_key(&block) if block _optional_keys.uniq.each(&block) else enum_for(:each_optional_key) end end |
#each_required_key(&block) ⇒ Object
126 127 128 129 130 131 132 |
# File 'lib/rbs/location_aux.rb', line 126 def each_required_key(&block) if block _required_keys.uniq.each(&block) else enum_for(:each_required_key) end end |
#end_column ⇒ Object
55 56 57 |
# File 'lib/rbs/location_aux.rb', line 55 def end_column end_loc[1] end |
#end_line ⇒ Object
51 52 53 |
# File 'lib/rbs/location_aux.rb', line 51 def end_line end_loc[0] end |
#end_loc ⇒ Object
63 64 65 |
# File 'lib/rbs/location_aux.rb', line 63 def end_loc @end_loc ||= buffer.top_buffer.pos_to_loc(end_pos) end |
#end_pos ⇒ Object
35 36 37 |
# File 'lib/rbs/location_aux.rb', line 35 def end_pos buffer.absolute_position(_end_pos) || raise end |
#inspect ⇒ Object
5 6 7 8 9 10 11 12 13 14 |
# 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}" } src = if source.length <= 1 source.inspect else source.each_line.first&.chomp&.inspect end "#<#{self.class}:#{self.__id__} buffer=#{buffer.name}, start=#{start_line}:#{start_column}, pos=#{start_pos}...#{end_pos}, children=#{(rks + ops).join(",")} source=#{src}>" end |
#key?(name) ⇒ Boolean
134 135 136 |
# File 'lib/rbs/location_aux.rb', line 134 def key?(name) optional_key?(name) || required_key?(name) end |
#local_location ⇒ Object
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/rbs/location_aux.rb', line 146 def local_location loc = Location.new(buffer.detach, _start_pos, _end_pos) each_optional_key do |key| value = self[key] if value loc.add_optional_child(key, value._start_pos...value._end_pos) else loc.add_optional_child(key, nil) end end each_required_key do |key| value = self[key] or raise loc.add_required_child(key, value._start_pos...value._end_pos) end loc #: self end |
#local_source ⇒ Object
166 167 168 |
# File 'lib/rbs/location_aux.rb', line 166 def local_source local_location.source end |
#name ⇒ Object
39 40 41 |
# File 'lib/rbs/location_aux.rb', line 39 def name buffer.name end |
#optional_key?(name) ⇒ Boolean
138 139 140 |
# File 'lib/rbs/location_aux.rb', line 138 def optional_key?(name) _optional_keys.include?(name) end |
#range ⇒ Object
67 68 69 |
# File 'lib/rbs/location_aux.rb', line 67 def range @range ||= start_pos...end_pos end |
#required_key?(name) ⇒ Boolean
142 143 144 |
# File 'lib/rbs/location_aux.rb', line 142 def required_key?(name) _required_keys.include?(name) end |
#source ⇒ Object
71 72 73 |
# File 'lib/rbs/location_aux.rb', line 71 def source @source ||= (buffer.top_buffer.content[range] || raise) end |
#start_column ⇒ Object
47 48 49 |
# File 'lib/rbs/location_aux.rb', line 47 def start_column start_loc[1] end |
#start_line ⇒ Object
43 44 45 |
# File 'lib/rbs/location_aux.rb', line 43 def start_line start_loc[0] end |
#start_loc ⇒ Object
59 60 61 |
# File 'lib/rbs/location_aux.rb', line 59 def start_loc @start_loc ||= buffer.top_buffer.pos_to_loc(start_pos) end |
#start_pos ⇒ Object
31 32 33 |
# File 'lib/rbs/location_aux.rb', line 31 def start_pos buffer.absolute_position(_start_pos) || raise end |
#to_json(state = nil) ⇒ Object
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/rbs/location_aux.rb', line 86 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 ⇒ Object
75 76 77 |
# File 'lib/rbs/location_aux.rb', line 75 def to_s "#{name || "-"}:#{start_line}:#{start_column}...#{end_line}:#{end_column}" end |