Class: RBS::Location

Inherits:
Object
  • Object
show all
Defined in:
lib/rbs/location_aux.rb,
ext/rbs_extension/legacy_location.c

Constant Summary collapse

WithChildren =
self

Class Method Summary collapse

Instance Method Summary collapse

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_posObject



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_keysObject



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_keysObject



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_posObject



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

#bufferObject



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_columnObject



55
56
57
# File 'lib/rbs/location_aux.rb', line 55

def end_column
  end_loc[1]
end

#end_lineObject



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

def end_line
  end_loc[0]
end

#end_locObject



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_posObject



35
36
37
# File 'lib/rbs/location_aux.rb', line 35

def end_pos
  buffer.absolute_position(_end_pos) || raise
end

#inspectObject



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

Returns:

  • (Boolean)


134
135
136
# File 'lib/rbs/location_aux.rb', line 134

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

#local_locationObject



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_sourceObject



166
167
168
# File 'lib/rbs/location_aux.rb', line 166

def local_source
  local_location.source
end

#nameObject



39
40
41
# File 'lib/rbs/location_aux.rb', line 39

def name
  buffer.name
end

#optional_key?(name) ⇒ Boolean

Returns:

  • (Boolean)


138
139
140
# File 'lib/rbs/location_aux.rb', line 138

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

#rangeObject



67
68
69
# File 'lib/rbs/location_aux.rb', line 67

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

#required_key?(name) ⇒ Boolean

Returns:

  • (Boolean)


142
143
144
# File 'lib/rbs/location_aux.rb', line 142

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

#sourceObject



71
72
73
# File 'lib/rbs/location_aux.rb', line 71

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

#start_columnObject



47
48
49
# File 'lib/rbs/location_aux.rb', line 47

def start_column
  start_loc[1]
end

#start_lineObject



43
44
45
# File 'lib/rbs/location_aux.rb', line 43

def start_line
  start_loc[0]
end

#start_locObject



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_posObject



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_sObject



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

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