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);