ext/rbs_extension/location.c in rbs-3.6.0.dev.1 vs ext/rbs_extension/location.c in rbs-3.6.0.pre.1
- old
+ new
@@ -1,11 +1,13 @@
#include "rbs_extension.h"
#define RBS_LOC_REQUIRED_P(loc, i) ((loc)->children->required_p & (1 << (i)))
#define RBS_LOC_OPTIONAL_P(loc, i) (!RBS_LOC_REQUIRED_P((loc), (i)))
#define RBS_LOC_CHILDREN_SIZE(cap) (sizeof(rbs_loc_children) + sizeof(rbs_loc_entry) * ((cap) - 1))
+#define NULL_LOC_RANGE_P(rg) ((rg).start == -1)
+rbs_loc_range RBS_LOC_NULL_RANGE = { -1, -1 };
VALUE RBS_Location;
position rbs_loc_position(int char_pos) {
position pos = { 0, char_pos, -1, -1 };
return pos;
@@ -14,10 +16,15 @@
position rbs_loc_position3(int char_pos, int line, int column) {
position pos = { 0, char_pos, line, column };
return pos;
}
+rbs_loc_range rbs_new_loc_range(range rg) {
+ rbs_loc_range r = { rg.start.char_pos, rg.end.char_pos };
+ return r;
+}
+
static void check_children_max(unsigned short n) {
size_t max = sizeof(rbs_loc_entry_bitmap) * 8;
if (n > max) {
rb_raise(rb_eRuntimeError, "Too many children added to location: %d", n);
}
@@ -49,24 +56,24 @@
void rbs_loc_add_required_child(rbs_loc *loc, ID name, range r) {
check_children_cap(loc);
unsigned short i = loc->children->len++;
loc->children->entries[i].name = name;
- loc->children->entries[i].rg = r;
+ loc->children->entries[i].rg = rbs_new_loc_range(r);
loc->children->required_p |= 1 << i;
}
void rbs_loc_add_optional_child(rbs_loc *loc, ID name, range r) {
check_children_cap(loc);
unsigned short i = loc->children->len++;
loc->children->entries[i].name = name;
- loc->children->entries[i].rg = r;
+ loc->children->entries[i].rg = rbs_new_loc_range(r);
}
-void rbs_loc_init(rbs_loc *loc, VALUE buffer, range rg) {
+void rbs_loc_init(rbs_loc *loc, VALUE buffer, rbs_loc_range rg) {
loc->buffer = buffer;
loc->rg = rg;
loc->children = NULL;
}
@@ -98,11 +105,11 @@
static VALUE location_s_allocate(VALUE klass) {
rbs_loc *loc;
VALUE obj = TypedData_Make_Struct(klass, rbs_loc, &location_type, loc);
- rbs_loc_init(loc, Qnil, NULL_RANGE);
+ rbs_loc_init(loc, Qnil, RBS_LOC_NULL_RANGE);
return obj;
}
rbs_loc *rbs_check_location(VALUE obj) {
@@ -110,12 +117,12 @@
}
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));
+ int start = FIX2INT(start_pos);
+ int end = FIX2INT(end_pos);
loc->buffer = buffer;
loc->rg.start = start;
loc->rg.end = end;
@@ -141,44 +148,18 @@
return loc->buffer;
}
static VALUE location_start_pos(VALUE self) {
rbs_loc *loc = rbs_check_location(self);
- return INT2FIX(loc->rg.start.char_pos);
+ return INT2FIX(loc->rg.start);
}
static VALUE location_end_pos(VALUE self) {
rbs_loc *loc = rbs_check_location(self);
- return INT2FIX(loc->rg.end.char_pos);
+ return INT2FIX(loc->rg.end);
}
-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;
- }
-}
-
-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;
- }
-}
-
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));
@@ -211,10 +192,19 @@
VALUE rbs_new_location(VALUE buffer, range rg) {
rbs_loc *loc;
VALUE obj = TypedData_Make_Struct(RBS_Location, rbs_loc, &location_type, loc);
+ rbs_loc_init(loc, buffer, rbs_new_loc_range(rg));
+
+ return obj;
+}
+
+static VALUE rbs_new_location_from_loc_range(VALUE buffer, rbs_loc_range rg) {
+ rbs_loc *loc;
+ VALUE obj = TypedData_Make_Struct(RBS_Location, rbs_loc, &location_type, loc);
+
rbs_loc_init(loc, buffer, rg);
return obj;
}
@@ -224,16 +214,16 @@
ID id = SYM2ID(name);
if (loc->children != NULL) {
for (unsigned short i = 0; i < loc->children->len; i++) {
if (loc->children->entries[i].name == id) {
- range result = loc->children->entries[i].rg;
+ rbs_loc_range result = loc->children->entries[i].rg;
- if (RBS_LOC_OPTIONAL_P(loc, i) && null_range_p(result)) {
+ if (RBS_LOC_OPTIONAL_P(loc, i) && NULL_LOC_RANGE_P(result)) {
return Qnil;
} else {
- return rbs_new_location(loc->buffer, result);
+ return rbs_new_location_from_loc_range(loc->buffer, result);
}
}
}
}
@@ -292,11 +282,9 @@
rb_define_private_method(RBS_Location, "initialize", location_initialize, 3);
rb_define_private_method(RBS_Location, "initialize_copy", location_initialize_copy, 1);
rb_define_method(RBS_Location, "buffer", location_buffer, 0);
rb_define_method(RBS_Location, "start_pos", location_start_pos, 0);
rb_define_method(RBS_Location, "end_pos", location_end_pos, 0);
- rb_define_private_method(RBS_Location, "_start_loc", location_start_loc, 0);
- rb_define_private_method(RBS_Location, "_end_loc", location_end_loc, 0);
rb_define_method(RBS_Location, "_add_required_child", location_add_required_child, 3);
rb_define_method(RBS_Location, "_add_optional_child", location_add_optional_child, 3);
rb_define_method(RBS_Location, "_add_optional_no_child", location_add_optional_no_child, 1);
rb_define_method(RBS_Location, "_optional_keys", location_optional_keys, 0);
rb_define_method(RBS_Location, "_required_keys", location_required_keys, 0);