Class: Rubydex::Namespace

Inherits:
Declaration show all
Defined in:
ext/rubydex/declaration.c

Direct Known Subclasses

Class, Module, SingletonClass, Todo

Instance Method Summary collapse

Methods inherited from Declaration

#definitions, #initialize, #name, #owner, #unqualified_name

Constructor Details

This class inherits a constructor from Rubydex::Declaration

Instance Method Details

#ancestorsObject

Declaration#ancestors: () -> Enumerator



251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
# File 'ext/rubydex/declaration.c', line 251

static VALUE rdxr_declaration_ancestors(VALUE self) {
    if (!rb_block_given_p()) {
        return rb_enumeratorize(self, rb_str_new2("ancestors"), 0, NULL);
    }

    HandleData *data;
    TypedData_Get_Struct(self, HandleData, &handle_type, data);

    void *graph;
    TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);

    void *iter = rdx_declaration_ancestors(graph, data->id);
    if (iter == NULL) {
        rb_raise(rb_eRuntimeError, "failed to create iterator");
    }

    VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
    rb_ensure(rdxi_declarations_yield, args, rdxi_declarations_ensure, args);

    return self;
}

#descendantsObject

Declaration#descendants: () -> Enumerator



274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
# File 'ext/rubydex/declaration.c', line 274

static VALUE rdxr_declaration_descendants(VALUE self) {
    if (!rb_block_given_p()) {
        return rb_enumeratorize(self, rb_str_new2("descendants"), 0, NULL);
    }

    HandleData *data;
    TypedData_Get_Struct(self, HandleData, &handle_type, data);

    void *graph;
    TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);

    void *iter = rdx_declaration_descendants(graph, data->id);
    if (iter == NULL) {
        rb_raise(rb_eRuntimeError, "failed to create iterator");
    }

    VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
    rb_ensure(rdxi_declarations_yield, args, rdxi_declarations_ensure, args);

    return self;
}

#find_member(*args) ⇒ Object

Searches for a member in the ancestor chain of the declaration



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'ext/rubydex/declaration.c', line 176

static VALUE rdxr_declaration_find_member(int argc, VALUE *argv, VALUE self) {
    VALUE member, opts;
    rb_scan_args(argc, argv, "1:", &member, &opts);
    Check_Type(member, T_STRING);

    bool only_inherited = false;
    if (!NIL_P(opts)) {
        ID kwarg_id = rb_intern("only_inherited");
        VALUE kwarg_val;
        rb_get_kwargs(opts, &kwarg_id, 0, 1, &kwarg_val);

        if (kwarg_val != Qundef) {
            only_inherited = RTEST(kwarg_val);
        }
    }

    HandleData *data;
    TypedData_Get_Struct(self, HandleData, &handle_type, data);

    void *graph;
    TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);

    const CDeclaration *decl = rdx_declaration_find_member(graph, data->id, StringValueCStr(member), only_inherited);
    if (decl == NULL) {
        return Qnil;
    }

    VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
    VALUE result_argv[] = {data->graph_obj, ULL2NUM(decl->id)};
    free_c_declaration(decl);

    return rb_class_new_instance(2, result_argv, decl_class);
}

#member(name) ⇒ Object

Returns a declaration handle for the given member



151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'ext/rubydex/declaration.c', line 151

static VALUE rdxr_declaration_member(VALUE self, VALUE name) {
    HandleData *data;
    TypedData_Get_Struct(self, HandleData, &handle_type, data);

    void *graph;
    TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);

    if (TYPE(name) != T_STRING) {
        rb_raise(rb_eTypeError, "expected String");
    }

    const CDeclaration *decl = rdx_declaration_member(graph, data->id, StringValueCStr(name));
    if (decl == NULL) {
        return Qnil;
    }

    VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
    VALUE argv[] = {data->graph_obj, ULL2NUM(decl->id)};
    free_c_declaration(decl);

    return rb_class_new_instance(2, argv, decl_class);
}

#membersObject

Namespace#members: () -> Enumerator



297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
# File 'ext/rubydex/declaration.c', line 297

static VALUE rdxr_declaration_members(VALUE self) {
    if (!rb_block_given_p()) {
        return rb_enumeratorize(self, rb_str_new2("members"), 0, NULL);
    }

    HandleData *data;
    TypedData_Get_Struct(self, HandleData, &handle_type, data);

    void *graph;
    TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);

    void *iter = rdx_declaration_members(graph, data->id);
    if (iter == NULL) {
        rb_raise(rb_eRuntimeError, "failed to create iterator");
    }

    VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
    rb_ensure(rdxi_declarations_yield, args, rdxi_declarations_ensure, args);

    return self;
}

#referencesObject

Returns an enumerator that yields constant references to this declaration



339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
# File 'ext/rubydex/declaration.c', line 339

static VALUE rdxr_constant_declaration_references(VALUE self) {
    if (!rb_block_given_p()) {
        return rb_enumeratorize_with_size(self, rb_str_new2("references"), 0, NULL,
                                          constant_declaration_references_size);
    }

    HandleData *data;
    TypedData_Get_Struct(self, HandleData, &handle_type, data);

    void *graph;
    TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);

    void *iter = rdx_declaration_constant_references_iter_new(graph, data->id);
    if (iter == NULL) {
        rb_raise(rb_eRuntimeError, "Declaration not found");
    }

    VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
    rb_ensure(rdxi_constant_references_yield, args, rdxi_constant_references_ensure, args);

    return self;
}

#singleton_classObject

Declaration#singleton_class -> SingletonClass



211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'ext/rubydex/declaration.c', line 211

static VALUE rdxr_declaration_singleton_class(VALUE self) {
    HandleData *data;
    TypedData_Get_Struct(self, HandleData, &handle_type, data);

    void *graph;
    TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
    const CDeclaration *decl = rdx_declaration_singleton_class(graph, data->id);

    if (decl == NULL) {
        return Qnil;
    }

    VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
    VALUE argv[] = {data->graph_obj, ULL2NUM(decl->id)};
    free_c_declaration(decl);

    return rb_class_new_instance(2, argv, decl_class);
}