rubydex 0.1.0.beta11 → 0.1.0.beta13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +23 -23
  3. data/README.md +125 -125
  4. data/THIRD_PARTY_LICENSES.html +2018 -945
  5. data/exe/rdx +47 -47
  6. data/ext/rubydex/declaration.c +453 -388
  7. data/ext/rubydex/declaration.h +23 -23
  8. data/ext/rubydex/definition.c +284 -197
  9. data/ext/rubydex/definition.h +28 -28
  10. data/ext/rubydex/diagnostic.c +6 -6
  11. data/ext/rubydex/diagnostic.h +11 -11
  12. data/ext/rubydex/document.c +97 -98
  13. data/ext/rubydex/document.h +10 -10
  14. data/ext/rubydex/extconf.rb +146 -127
  15. data/ext/rubydex/graph.c +701 -512
  16. data/ext/rubydex/graph.h +10 -10
  17. data/ext/rubydex/handle.h +44 -44
  18. data/ext/rubydex/location.c +22 -22
  19. data/ext/rubydex/location.h +15 -15
  20. data/ext/rubydex/reference.c +123 -104
  21. data/ext/rubydex/reference.h +15 -16
  22. data/ext/rubydex/rubydex.c +22 -22
  23. data/ext/rubydex/utils.c +108 -86
  24. data/ext/rubydex/utils.h +34 -28
  25. data/lib/rubydex/comment.rb +17 -17
  26. data/lib/rubydex/declaration.rb +11 -0
  27. data/lib/rubydex/diagnostic.rb +21 -21
  28. data/lib/rubydex/failures.rb +15 -15
  29. data/lib/rubydex/graph.rb +98 -92
  30. data/lib/rubydex/keyword.rb +17 -0
  31. data/lib/rubydex/keyword_parameter.rb +13 -0
  32. data/lib/rubydex/location.rb +90 -90
  33. data/lib/rubydex/mixin.rb +22 -0
  34. data/lib/rubydex/version.rb +5 -5
  35. data/lib/rubydex.rb +24 -20
  36. data/rbi/rubydex.rbi +425 -310
  37. data/rust/Cargo.lock +1851 -1851
  38. data/rust/Cargo.toml +29 -29
  39. data/rust/about.toml +10 -10
  40. data/rust/{about.hbs → about_templates/about.hbs} +81 -78
  41. data/rust/about_templates/mingw_licenses.hbs +1071 -0
  42. data/rust/rubydex/Cargo.toml +42 -42
  43. data/rust/rubydex/src/compile_assertions.rs +13 -13
  44. data/rust/rubydex/src/diagnostic.rs +110 -109
  45. data/rust/rubydex/src/errors.rs +28 -28
  46. data/rust/rubydex/src/indexing/local_graph.rs +224 -224
  47. data/rust/rubydex/src/indexing/rbs_indexer.rs +1551 -1554
  48. data/rust/rubydex/src/indexing/ruby_indexer.rs +2329 -6753
  49. data/rust/rubydex/src/indexing/ruby_indexer_tests.rs +4962 -0
  50. data/rust/rubydex/src/indexing.rs +210 -210
  51. data/rust/rubydex/src/integrity.rs +279 -278
  52. data/rust/rubydex/src/job_queue.rs +199 -205
  53. data/rust/rubydex/src/lib.rs +17 -17
  54. data/rust/rubydex/src/listing.rs +371 -272
  55. data/rust/rubydex/src/main.rs +160 -160
  56. data/rust/rubydex/src/model/built_in.rs +83 -0
  57. data/rust/rubydex/src/model/comment.rs +24 -24
  58. data/rust/rubydex/src/model/declaration.rs +679 -588
  59. data/rust/rubydex/src/model/definitions.rs +1682 -1602
  60. data/rust/rubydex/src/model/document.rs +222 -252
  61. data/rust/rubydex/src/model/encoding.rs +22 -22
  62. data/rust/rubydex/src/model/graph.rs +3782 -3556
  63. data/rust/rubydex/src/model/id.rs +110 -110
  64. data/rust/rubydex/src/model/identity_maps.rs +58 -58
  65. data/rust/rubydex/src/model/ids.rs +60 -38
  66. data/rust/rubydex/src/model/keywords.rs +256 -256
  67. data/rust/rubydex/src/model/name.rs +298 -298
  68. data/rust/rubydex/src/model/references.rs +111 -111
  69. data/rust/rubydex/src/model/string_ref.rs +50 -50
  70. data/rust/rubydex/src/model/visibility.rs +41 -41
  71. data/rust/rubydex/src/model.rs +15 -14
  72. data/rust/rubydex/src/offset.rs +147 -147
  73. data/rust/rubydex/src/position.rs +6 -6
  74. data/rust/rubydex/src/query.rs +1841 -1700
  75. data/rust/rubydex/src/resolution.rs +1852 -5895
  76. data/rust/rubydex/src/resolution_tests.rs +4701 -0
  77. data/rust/rubydex/src/stats/memory.rs +71 -71
  78. data/rust/rubydex/src/stats/orphan_report.rs +264 -263
  79. data/rust/rubydex/src/stats/timer.rs +127 -127
  80. data/rust/rubydex/src/stats.rs +11 -11
  81. data/rust/rubydex/src/test_utils/context.rs +226 -226
  82. data/rust/rubydex/src/test_utils/graph_test.rs +730 -679
  83. data/rust/rubydex/src/test_utils/local_graph_test.rs +602 -602
  84. data/rust/rubydex/src/test_utils.rs +52 -52
  85. data/rust/rubydex/src/visualization/dot.rs +192 -176
  86. data/rust/rubydex/src/visualization.rs +6 -6
  87. data/rust/rubydex/tests/cli.rs +185 -167
  88. data/rust/rubydex-mcp/Cargo.toml +28 -28
  89. data/rust/rubydex-mcp/src/main.rs +48 -48
  90. data/rust/rubydex-mcp/src/server.rs +1145 -1145
  91. data/rust/rubydex-mcp/src/tools.rs +49 -49
  92. data/rust/rubydex-mcp/tests/mcp.rs +302 -302
  93. data/rust/rubydex-sys/Cargo.toml +20 -20
  94. data/rust/rubydex-sys/build.rs +14 -14
  95. data/rust/rubydex-sys/cbindgen.toml +12 -12
  96. data/rust/rubydex-sys/src/declaration_api.rs +485 -469
  97. data/rust/rubydex-sys/src/definition_api.rs +443 -352
  98. data/rust/rubydex-sys/src/diagnostic_api.rs +99 -99
  99. data/rust/rubydex-sys/src/document_api.rs +85 -54
  100. data/rust/rubydex-sys/src/graph_api.rs +1017 -700
  101. data/rust/rubydex-sys/src/lib.rs +79 -9
  102. data/rust/rubydex-sys/src/location_api.rs +79 -79
  103. data/rust/rubydex-sys/src/name_api.rs +187 -135
  104. data/rust/rubydex-sys/src/reference_api.rs +267 -195
  105. data/rust/rubydex-sys/src/utils.rs +70 -70
  106. data/rust/rustfmt.toml +2 -2
  107. metadata +16 -9
  108. data/lib/rubydex/librubydex_sys.so +0 -0
@@ -1,388 +1,453 @@
1
- #include "declaration.h"
2
- #include "definition.h"
3
- #include "graph.h"
4
- #include "handle.h"
5
- #include "reference.h"
6
- #include "rustbindings.h"
7
- #include "utils.h"
8
-
9
- VALUE cDeclaration;
10
- VALUE cNamespace;
11
- VALUE cClass;
12
- VALUE cModule;
13
- VALUE cSingletonClass;
14
- VALUE cTodo;
15
- VALUE cConstant;
16
- VALUE cConstantAlias;
17
- VALUE cMethod;
18
- VALUE cGlobalVariable;
19
- VALUE cInstanceVariable;
20
- VALUE cClassVariable;
21
-
22
- // Keep this in sync with declaration_api.rs
23
- VALUE rdxi_declaration_class_for_kind(CDeclarationKind kind) {
24
- switch (kind) {
25
- case CDeclarationKind_Class:
26
- return cClass;
27
- case CDeclarationKind_Module:
28
- return cModule;
29
- case CDeclarationKind_SingletonClass:
30
- return cSingletonClass;
31
- case CDeclarationKind_Todo:
32
- return cTodo;
33
- case CDeclarationKind_Constant:
34
- return cConstant;
35
- case CDeclarationKind_ConstantAlias:
36
- return cConstantAlias;
37
- case CDeclarationKind_Method:
38
- return cMethod;
39
- case CDeclarationKind_GlobalVariable:
40
- return cGlobalVariable;
41
- case CDeclarationKind_InstanceVariable:
42
- return cInstanceVariable;
43
- case CDeclarationKind_ClassVariable:
44
- return cClassVariable;
45
- default:
46
- rb_raise(rb_eRuntimeError, "Unknown CDeclarationKind: %d", kind);
47
- }
48
- }
49
-
50
- // Declaration#name -> String
51
- static VALUE rdxr_declaration_name(VALUE self) {
52
- HandleData *data;
53
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
54
-
55
- void *graph;
56
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
57
- const char *name = rdx_declaration_name(graph, data->id);
58
-
59
- if (name == NULL) {
60
- return Qnil;
61
- }
62
-
63
- VALUE str = rb_utf8_str_new_cstr(name);
64
- free_c_string(name);
65
-
66
- return str;
67
- }
68
-
69
- // Declaration#unqualified_name -> String
70
- static VALUE rdxr_declaration_unqualified_name(VALUE self) {
71
- HandleData *data;
72
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
73
-
74
- void *graph;
75
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
76
- const char *name = rdx_declaration_unqualified_name(graph, data->id);
77
-
78
- if (name == NULL) {
79
- return Qnil;
80
- }
81
-
82
- VALUE str = rb_utf8_str_new_cstr(name);
83
- free_c_string(name);
84
-
85
- return str;
86
- }
87
-
88
- // Body function for rb_ensure in Declaration#definitions
89
- static VALUE declaration_definitions_yield(VALUE args) {
90
- VALUE self = rb_ary_entry(args, 0);
91
- void *iter = (void *)(uintptr_t)NUM2ULL(rb_ary_entry(args, 1));
92
-
93
- HandleData *data;
94
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
95
-
96
- uint64_t id = 0;
97
- DefinitionKind kind;
98
- while (rdx_definitions_iter_next(iter, &id, &kind)) {
99
- VALUE argv[] = {data->graph_obj, ULL2NUM(id)};
100
- VALUE defn_class = rdxi_definition_class_for_kind(kind);
101
- VALUE handle = rb_class_new_instance(2, argv, defn_class);
102
- rb_yield(handle);
103
- }
104
-
105
- return Qnil;
106
- }
107
-
108
- // Ensure function for rb_ensure in Declaration#definitions to always free the
109
- // iterator
110
- static VALUE declaration_definitions_ensure(VALUE args) {
111
- void *iter = (void *)(uintptr_t)NUM2ULL(rb_ary_entry(args, 1));
112
- rdx_definitions_iter_free(iter);
113
-
114
- return Qnil;
115
- }
116
-
117
- // Size function for the Declaration#definitions enumerator
118
- static VALUE declaration_definitions_size(VALUE self, VALUE _args, VALUE _eobj) {
119
- HandleData *data;
120
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
121
-
122
- void *graph;
123
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
124
- struct DefinitionsIter *iter = rdx_declaration_definitions_iter_new(graph, data->id);
125
- size_t len = rdx_definitions_iter_len(iter);
126
- rdx_definitions_iter_free(iter);
127
-
128
- return SIZET2NUM(len);
129
- }
130
-
131
- // Declaration#definitions: () -> Enumerator[Definition]
132
- // Returns an enumerator that yields all definitions for this declaration lazily
133
- static VALUE rdxr_declaration_definitions(VALUE self) {
134
- if (!rb_block_given_p()) {
135
- return rb_enumeratorize_with_size(self, rb_str_new2("definitions"), 0, NULL, declaration_definitions_size);
136
- }
137
-
138
- HandleData *data;
139
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
140
-
141
- void *graph;
142
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
143
-
144
- void *iter = rdx_declaration_definitions_iter_new(graph, data->id);
145
- VALUE args = rb_ary_new_from_args(2, self, ULL2NUM((uintptr_t)iter));
146
- rb_ensure(declaration_definitions_yield, args, declaration_definitions_ensure, args);
147
-
148
- return self;
149
- }
150
-
151
- // Declaration#member: (String member) -> Declaration
152
- // Returns a declaration handle for the given member
153
- static VALUE rdxr_declaration_member(VALUE self, VALUE name) {
154
- HandleData *data;
155
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
156
-
157
- void *graph;
158
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
159
-
160
- if (TYPE(name) != T_STRING) {
161
- rb_raise(rb_eTypeError, "expected String");
162
- }
163
-
164
- const CDeclaration *decl = rdx_declaration_member(graph, data->id, StringValueCStr(name));
165
- if (decl == NULL) {
166
- return Qnil;
167
- }
168
-
169
- VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
170
- VALUE argv[] = {data->graph_obj, ULL2NUM(decl->id)};
171
- free_c_declaration(decl);
172
-
173
- return rb_class_new_instance(2, argv, decl_class);
174
- }
175
-
176
- // Namespace#find_member: (String member, only_inherited: false) -> Declaration?
177
- // Searches for a member in the ancestor chain of the declaration
178
- static VALUE rdxr_declaration_find_member(int argc, VALUE *argv, VALUE self) {
179
- VALUE member, opts;
180
- rb_scan_args(argc, argv, "1:", &member, &opts);
181
- Check_Type(member, T_STRING);
182
-
183
- bool only_inherited = false;
184
- if (!NIL_P(opts)) {
185
- ID kwarg_id = rb_intern("only_inherited");
186
- VALUE kwarg_val;
187
- rb_get_kwargs(opts, &kwarg_id, 0, 1, &kwarg_val);
188
-
189
- if (kwarg_val != Qundef) {
190
- only_inherited = RTEST(kwarg_val);
191
- }
192
- }
193
-
194
- HandleData *data;
195
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
196
-
197
- void *graph;
198
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
199
-
200
- const CDeclaration *decl = rdx_declaration_find_member(graph, data->id, StringValueCStr(member), only_inherited);
201
- if (decl == NULL) {
202
- return Qnil;
203
- }
204
-
205
- VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
206
- VALUE result_argv[] = {data->graph_obj, ULL2NUM(decl->id)};
207
- free_c_declaration(decl);
208
-
209
- return rb_class_new_instance(2, result_argv, decl_class);
210
- }
211
-
212
- // Declaration#singleton_class -> SingletonClass
213
- static VALUE rdxr_declaration_singleton_class(VALUE self) {
214
- HandleData *data;
215
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
216
-
217
- void *graph;
218
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
219
- const CDeclaration *decl = rdx_declaration_singleton_class(graph, data->id);
220
-
221
- if (decl == NULL) {
222
- return Qnil;
223
- }
224
-
225
- VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
226
- VALUE argv[] = {data->graph_obj, ULL2NUM(decl->id)};
227
- free_c_declaration(decl);
228
-
229
- return rb_class_new_instance(2, argv, decl_class);
230
- }
231
-
232
- // Declaration#owner -> Declaration
233
- static VALUE rdxr_declaration_owner(VALUE self) {
234
- HandleData *data;
235
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
236
-
237
- void *graph;
238
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
239
- const CDeclaration *decl = rdx_declaration_owner(graph, data->id);
240
-
241
- if (decl == NULL) {
242
- rb_raise(rb_eRuntimeError, "owner can never be nil for any declarations");
243
- }
244
-
245
- VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
246
- VALUE argv[] = {data->graph_obj, ULL2NUM(decl->id)};
247
- free_c_declaration(decl);
248
-
249
- return rb_class_new_instance(2, argv, decl_class);
250
- }
251
-
252
- // Declaration#ancestors: () -> Enumerator[Declaration]
253
- static VALUE rdxr_declaration_ancestors(VALUE self) {
254
- if (!rb_block_given_p()) {
255
- return rb_enumeratorize(self, rb_str_new2("ancestors"), 0, NULL);
256
- }
257
-
258
- HandleData *data;
259
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
260
-
261
- void *graph;
262
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
263
-
264
- void *iter = rdx_declaration_ancestors(graph, data->id);
265
- if (iter == NULL) {
266
- rb_raise(rb_eRuntimeError, "failed to create iterator");
267
- }
268
-
269
- VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
270
- rb_ensure(rdxi_declarations_yield, args, rdxi_declarations_ensure, args);
271
-
272
- return self;
273
- }
274
-
275
- // Declaration#descendants: () -> Enumerator[Declaration]
276
- static VALUE rdxr_declaration_descendants(VALUE self) {
277
- if (!rb_block_given_p()) {
278
- return rb_enumeratorize(self, rb_str_new2("descendants"), 0, NULL);
279
- }
280
-
281
- HandleData *data;
282
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
283
-
284
- void *graph;
285
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
286
-
287
- void *iter = rdx_declaration_descendants(graph, data->id);
288
- if (iter == NULL) {
289
- rb_raise(rb_eRuntimeError, "failed to create iterator");
290
- }
291
-
292
- VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
293
- rb_ensure(rdxi_declarations_yield, args, rdxi_declarations_ensure, args);
294
-
295
- return self;
296
- }
297
-
298
- // Namespace#members: () -> Enumerator[Declaration]
299
- static VALUE rdxr_declaration_members(VALUE self) {
300
- if (!rb_block_given_p()) {
301
- return rb_enumeratorize(self, rb_str_new2("members"), 0, NULL);
302
- }
303
-
304
- HandleData *data;
305
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
306
-
307
- void *graph;
308
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
309
-
310
- void *iter = rdx_declaration_members(graph, data->id);
311
- if (iter == NULL) {
312
- rb_raise(rb_eRuntimeError, "failed to create iterator");
313
- }
314
-
315
- VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
316
- rb_ensure(rdxi_declarations_yield, args, rdxi_declarations_ensure, args);
317
-
318
- return self;
319
- }
320
-
321
- // Size function for the Declaration#references enumerator
322
- static VALUE declaration_references_size(VALUE self, VALUE _args, VALUE _eobj) {
323
- HandleData *data;
324
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
325
-
326
- void *graph;
327
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
328
-
329
- struct ReferencesIter *iter = rdx_declaration_references_iter_new(graph, data->id);
330
- size_t len = rdx_references_iter_len(iter);
331
- rdx_references_iter_free(iter);
332
-
333
- return SIZET2NUM(len);
334
- }
335
-
336
- // Returns an enumerator for all references to this declaration
337
- //
338
- // Declaration#references: () -> Enumerator[Reference]
339
- static VALUE rdxr_declaration_references(VALUE self) {
340
- if (!rb_block_given_p()) {
341
- return rb_enumeratorize_with_size(self, rb_str_new2("references"), 0, NULL, declaration_references_size);
342
- }
343
-
344
- HandleData *data;
345
- TypedData_Get_Struct(self, HandleData, &handle_type, data);
346
-
347
- void *graph;
348
- TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
349
-
350
- void *iter = rdx_declaration_references_iter_new(graph, data->id);
351
- VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
352
- rb_ensure(rdxi_references_yield, args, rdxi_references_ensure, args);
353
-
354
- return self;
355
- }
356
-
357
- void rdxi_initialize_declaration(VALUE mRubydex) {
358
- cDeclaration = rb_define_class_under(mRubydex, "Declaration", rb_cObject);
359
- cNamespace = rb_define_class_under(mRubydex, "Namespace", cDeclaration);
360
- cClass = rb_define_class_under(mRubydex, "Class", cNamespace);
361
- cModule = rb_define_class_under(mRubydex, "Module", cNamespace);
362
- cSingletonClass = rb_define_class_under(mRubydex, "SingletonClass", cNamespace);
363
- cTodo = rb_define_class_under(mRubydex, "Todo", cNamespace);
364
- cConstant = rb_define_class_under(mRubydex, "Constant", cDeclaration);
365
- cConstantAlias = rb_define_class_under(mRubydex, "ConstantAlias", cDeclaration);
366
- cMethod = rb_define_class_under(mRubydex, "Method", cDeclaration);
367
- cGlobalVariable = rb_define_class_under(mRubydex, "GlobalVariable", cDeclaration);
368
- cInstanceVariable = rb_define_class_under(mRubydex, "InstanceVariable", cDeclaration);
369
- cClassVariable = rb_define_class_under(mRubydex, "ClassVariable", cDeclaration);
370
-
371
- rb_define_alloc_func(cDeclaration, rdxr_handle_alloc);
372
- rb_define_method(cDeclaration, "initialize", rdxr_handle_initialize, 2);
373
- rb_define_method(cDeclaration, "name", rdxr_declaration_name, 0);
374
- rb_define_method(cDeclaration, "unqualified_name", rdxr_declaration_unqualified_name, 0);
375
- rb_define_method(cDeclaration, "definitions", rdxr_declaration_definitions, 0);
376
- rb_define_method(cDeclaration, "references", rdxr_declaration_references, 0);
377
- rb_define_method(cDeclaration, "owner", rdxr_declaration_owner, 0);
378
-
379
- // Namespace only methods
380
- rb_define_method(cNamespace, "member", rdxr_declaration_member, 1);
381
- rb_define_method(cNamespace, "find_member", rdxr_declaration_find_member, -1);
382
- rb_define_method(cNamespace, "singleton_class", rdxr_declaration_singleton_class, 0);
383
- rb_define_method(cNamespace, "ancestors", rdxr_declaration_ancestors, 0);
384
- rb_define_method(cNamespace, "descendants", rdxr_declaration_descendants, 0);
385
- rb_define_method(cNamespace, "members", rdxr_declaration_members, 0);
386
-
387
- rb_funcall(rb_singleton_class(cDeclaration), rb_intern("private"), 1, ID2SYM(rb_intern("new")));
388
- }
1
+ #include "declaration.h"
2
+ #include "definition.h"
3
+ #include "graph.h"
4
+ #include "handle.h"
5
+ #include "rustbindings.h"
6
+ #include "utils.h"
7
+
8
+ VALUE cDeclaration;
9
+ VALUE cNamespace;
10
+ VALUE cClass;
11
+ VALUE cModule;
12
+ VALUE cSingletonClass;
13
+ VALUE cTodo;
14
+ VALUE cConstant;
15
+ VALUE cConstantAlias;
16
+ VALUE cMethod;
17
+ VALUE cGlobalVariable;
18
+ VALUE cInstanceVariable;
19
+ VALUE cClassVariable;
20
+
21
+ // Keep this in sync with declaration_api.rs
22
+ VALUE rdxi_declaration_class_for_kind(CDeclarationKind kind) {
23
+ switch (kind) {
24
+ case CDeclarationKind_Class:
25
+ return cClass;
26
+ case CDeclarationKind_Module:
27
+ return cModule;
28
+ case CDeclarationKind_SingletonClass:
29
+ return cSingletonClass;
30
+ case CDeclarationKind_Todo:
31
+ return cTodo;
32
+ case CDeclarationKind_Constant:
33
+ return cConstant;
34
+ case CDeclarationKind_ConstantAlias:
35
+ return cConstantAlias;
36
+ case CDeclarationKind_Method:
37
+ return cMethod;
38
+ case CDeclarationKind_GlobalVariable:
39
+ return cGlobalVariable;
40
+ case CDeclarationKind_InstanceVariable:
41
+ return cInstanceVariable;
42
+ case CDeclarationKind_ClassVariable:
43
+ return cClassVariable;
44
+ default:
45
+ rb_raise(rb_eRuntimeError, "Unknown CDeclarationKind: %d", kind);
46
+ }
47
+ }
48
+
49
+ // Declaration#name -> String
50
+ static VALUE rdxr_declaration_name(VALUE self) {
51
+ HandleData *data;
52
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
53
+
54
+ void *graph;
55
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
56
+ const char *name = rdx_declaration_name(graph, data->id);
57
+
58
+ if (name == NULL) {
59
+ return Qnil;
60
+ }
61
+
62
+ VALUE str = rb_utf8_str_new_cstr(name);
63
+ free_c_string(name);
64
+
65
+ return str;
66
+ }
67
+
68
+ // Declaration#unqualified_name -> String
69
+ static VALUE rdxr_declaration_unqualified_name(VALUE self) {
70
+ HandleData *data;
71
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
72
+
73
+ void *graph;
74
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
75
+ const char *name = rdx_declaration_unqualified_name(graph, data->id);
76
+
77
+ if (name == NULL) {
78
+ return Qnil;
79
+ }
80
+
81
+ VALUE str = rb_utf8_str_new_cstr(name);
82
+ free_c_string(name);
83
+
84
+ return str;
85
+ }
86
+
87
+ // Body function for rb_ensure in Declaration#definitions
88
+ static VALUE declaration_definitions_yield(VALUE args) {
89
+ VALUE self = rb_ary_entry(args, 0);
90
+ void *iter = (void *)(uintptr_t)NUM2ULL(rb_ary_entry(args, 1));
91
+
92
+ HandleData *data;
93
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
94
+
95
+ CDefinition defn;
96
+ while (rdx_definitions_iter_next(iter, &defn)) {
97
+ VALUE argv[] = {data->graph_obj, ULL2NUM(defn.id)};
98
+ VALUE defn_class = rdxi_definition_class_for_kind(defn.kind);
99
+ VALUE handle = rb_class_new_instance(2, argv, defn_class);
100
+ rb_yield(handle);
101
+ }
102
+
103
+ return Qnil;
104
+ }
105
+
106
+ // Ensure function for rb_ensure in Declaration#definitions to always free the
107
+ // iterator
108
+ static VALUE declaration_definitions_ensure(VALUE args) {
109
+ void *iter = (void *)(uintptr_t)NUM2ULL(rb_ary_entry(args, 1));
110
+ rdx_definitions_iter_free(iter);
111
+
112
+ return Qnil;
113
+ }
114
+
115
+ // Size function for the Declaration#definitions enumerator
116
+ static VALUE declaration_definitions_size(VALUE self, VALUE _args, VALUE _eobj) {
117
+ HandleData *data;
118
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
119
+
120
+ void *graph;
121
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
122
+ struct DefinitionsIter *iter = rdx_declaration_definitions_iter_new(graph, data->id);
123
+ size_t len = rdx_definitions_iter_len(iter);
124
+ rdx_definitions_iter_free(iter);
125
+
126
+ return SIZET2NUM(len);
127
+ }
128
+
129
+ // Declaration#definitions: () -> Enumerator[Definition]
130
+ // Returns an enumerator that yields all definitions for this declaration lazily
131
+ static VALUE rdxr_declaration_definitions(VALUE self) {
132
+ if (!rb_block_given_p()) {
133
+ return rb_enumeratorize_with_size(self, rb_str_new2("definitions"), 0, NULL, declaration_definitions_size);
134
+ }
135
+
136
+ HandleData *data;
137
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
138
+
139
+ void *graph;
140
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
141
+
142
+ void *iter = rdx_declaration_definitions_iter_new(graph, data->id);
143
+ VALUE args = rb_ary_new_from_args(2, self, ULL2NUM((uintptr_t)iter));
144
+ rb_ensure(declaration_definitions_yield, args, declaration_definitions_ensure, args);
145
+
146
+ return self;
147
+ }
148
+
149
+ // Declaration#member: (String member) -> Declaration
150
+ // Returns a declaration handle for the given member
151
+ static VALUE rdxr_declaration_member(VALUE self, VALUE name) {
152
+ HandleData *data;
153
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
154
+
155
+ void *graph;
156
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
157
+
158
+ if (TYPE(name) != T_STRING) {
159
+ rb_raise(rb_eTypeError, "expected String");
160
+ }
161
+
162
+ const CDeclaration *decl = rdx_declaration_member(graph, data->id, StringValueCStr(name));
163
+ if (decl == NULL) {
164
+ return Qnil;
165
+ }
166
+
167
+ VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
168
+ VALUE argv[] = {data->graph_obj, ULL2NUM(decl->id)};
169
+ free_c_declaration(decl);
170
+
171
+ return rb_class_new_instance(2, argv, decl_class);
172
+ }
173
+
174
+ // Namespace#find_member: (String member, only_inherited: false) -> Declaration?
175
+ // Searches for a member in the ancestor chain of the declaration
176
+ static VALUE rdxr_declaration_find_member(int argc, VALUE *argv, VALUE self) {
177
+ VALUE member, opts;
178
+ rb_scan_args(argc, argv, "1:", &member, &opts);
179
+ Check_Type(member, T_STRING);
180
+
181
+ bool only_inherited = false;
182
+ if (!NIL_P(opts)) {
183
+ ID kwarg_id = rb_intern("only_inherited");
184
+ VALUE kwarg_val;
185
+ rb_get_kwargs(opts, &kwarg_id, 0, 1, &kwarg_val);
186
+
187
+ if (kwarg_val != Qundef) {
188
+ only_inherited = RTEST(kwarg_val);
189
+ }
190
+ }
191
+
192
+ HandleData *data;
193
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
194
+
195
+ void *graph;
196
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
197
+
198
+ const CDeclaration *decl = rdx_declaration_find_member(graph, data->id, StringValueCStr(member), only_inherited);
199
+ if (decl == NULL) {
200
+ return Qnil;
201
+ }
202
+
203
+ VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
204
+ VALUE result_argv[] = {data->graph_obj, ULL2NUM(decl->id)};
205
+ free_c_declaration(decl);
206
+
207
+ return rb_class_new_instance(2, result_argv, decl_class);
208
+ }
209
+
210
+ // Declaration#singleton_class -> SingletonClass
211
+ static VALUE rdxr_declaration_singleton_class(VALUE self) {
212
+ HandleData *data;
213
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
214
+
215
+ void *graph;
216
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
217
+ const CDeclaration *decl = rdx_declaration_singleton_class(graph, data->id);
218
+
219
+ if (decl == NULL) {
220
+ return Qnil;
221
+ }
222
+
223
+ VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
224
+ VALUE argv[] = {data->graph_obj, ULL2NUM(decl->id)};
225
+ free_c_declaration(decl);
226
+
227
+ return rb_class_new_instance(2, argv, decl_class);
228
+ }
229
+
230
+ // Declaration#owner -> Declaration
231
+ static VALUE rdxr_declaration_owner(VALUE self) {
232
+ HandleData *data;
233
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
234
+
235
+ void *graph;
236
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
237
+ const CDeclaration *decl = rdx_declaration_owner(graph, data->id);
238
+
239
+ if (decl == NULL) {
240
+ rb_raise(rb_eRuntimeError, "owner can never be nil for any declarations");
241
+ }
242
+
243
+ VALUE decl_class = rdxi_declaration_class_for_kind(decl->kind);
244
+ VALUE argv[] = {data->graph_obj, ULL2NUM(decl->id)};
245
+ free_c_declaration(decl);
246
+
247
+ return rb_class_new_instance(2, argv, decl_class);
248
+ }
249
+
250
+ // Declaration#ancestors: () -> Enumerator[Declaration]
251
+ static VALUE rdxr_declaration_ancestors(VALUE self) {
252
+ if (!rb_block_given_p()) {
253
+ return rb_enumeratorize(self, rb_str_new2("ancestors"), 0, NULL);
254
+ }
255
+
256
+ HandleData *data;
257
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
258
+
259
+ void *graph;
260
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
261
+
262
+ void *iter = rdx_declaration_ancestors(graph, data->id);
263
+ if (iter == NULL) {
264
+ rb_raise(rb_eRuntimeError, "failed to create iterator");
265
+ }
266
+
267
+ VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
268
+ rb_ensure(rdxi_declarations_yield, args, rdxi_declarations_ensure, args);
269
+
270
+ return self;
271
+ }
272
+
273
+ // Declaration#descendants: () -> Enumerator[Declaration]
274
+ static VALUE rdxr_declaration_descendants(VALUE self) {
275
+ if (!rb_block_given_p()) {
276
+ return rb_enumeratorize(self, rb_str_new2("descendants"), 0, NULL);
277
+ }
278
+
279
+ HandleData *data;
280
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
281
+
282
+ void *graph;
283
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
284
+
285
+ void *iter = rdx_declaration_descendants(graph, data->id);
286
+ if (iter == NULL) {
287
+ rb_raise(rb_eRuntimeError, "failed to create iterator");
288
+ }
289
+
290
+ VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
291
+ rb_ensure(rdxi_declarations_yield, args, rdxi_declarations_ensure, args);
292
+
293
+ return self;
294
+ }
295
+
296
+ // Namespace#members: () -> Enumerator[Declaration]
297
+ static VALUE rdxr_declaration_members(VALUE self) {
298
+ if (!rb_block_given_p()) {
299
+ return rb_enumeratorize(self, rb_str_new2("members"), 0, NULL);
300
+ }
301
+
302
+ HandleData *data;
303
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
304
+
305
+ void *graph;
306
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
307
+
308
+ void *iter = rdx_declaration_members(graph, data->id);
309
+ if (iter == NULL) {
310
+ rb_raise(rb_eRuntimeError, "failed to create iterator");
311
+ }
312
+
313
+ VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
314
+ rb_ensure(rdxi_declarations_yield, args, rdxi_declarations_ensure, args);
315
+
316
+ return self;
317
+ }
318
+
319
+ // Size function for constant declaration references enumerator
320
+ static VALUE constant_declaration_references_size(VALUE self, VALUE _args, VALUE _eobj) {
321
+ HandleData *data;
322
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
323
+
324
+ void *graph;
325
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
326
+
327
+ struct ConstantReferencesIter *iter = rdx_declaration_constant_references_iter_new(graph, data->id);
328
+ if (iter == NULL) {
329
+ rb_raise(rb_eRuntimeError, "Declaration not found");
330
+ }
331
+
332
+ size_t len = rdx_constant_references_iter_len(iter);
333
+ rdx_constant_references_iter_free(iter);
334
+ return SIZET2NUM(len);
335
+ }
336
+
337
+ // Namespace#references, Constant#references, ConstantAlias#references
338
+ // Returns an enumerator that yields constant references to this declaration
339
+ static VALUE rdxr_constant_declaration_references(VALUE self) {
340
+ if (!rb_block_given_p()) {
341
+ return rb_enumeratorize_with_size(self, rb_str_new2("references"), 0, NULL,
342
+ constant_declaration_references_size);
343
+ }
344
+
345
+ HandleData *data;
346
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
347
+
348
+ void *graph;
349
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
350
+
351
+ void *iter = rdx_declaration_constant_references_iter_new(graph, data->id);
352
+ if (iter == NULL) {
353
+ rb_raise(rb_eRuntimeError, "Declaration not found");
354
+ }
355
+
356
+ VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
357
+ rb_ensure(rdxi_constant_references_yield, args, rdxi_constant_references_ensure, args);
358
+
359
+ return self;
360
+ }
361
+
362
+ // Size function for method declaration references enumerator
363
+ static VALUE method_declaration_references_size(VALUE self, VALUE _args, VALUE _eobj) {
364
+ HandleData *data;
365
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
366
+
367
+ void *graph;
368
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
369
+
370
+ struct MethodReferencesIter *iter = rdx_declaration_method_references_iter_new(graph, data->id);
371
+ if (iter == NULL) {
372
+ rb_raise(rb_eRuntimeError, "Declaration not found");
373
+ }
374
+
375
+ size_t len = rdx_method_references_iter_len(iter);
376
+ rdx_method_references_iter_free(iter);
377
+ return SIZET2NUM(len);
378
+ }
379
+
380
+ // Method#references
381
+ // Returns an enumerator that yields method references to this declaration
382
+ static VALUE rdxr_method_declaration_references(VALUE self) {
383
+ if (!rb_block_given_p()) {
384
+ return rb_enumeratorize_with_size(self, rb_str_new2("references"), 0, NULL,
385
+ method_declaration_references_size);
386
+ }
387
+
388
+ HandleData *data;
389
+ TypedData_Get_Struct(self, HandleData, &handle_type, data);
390
+
391
+ void *graph;
392
+ TypedData_Get_Struct(data->graph_obj, void *, &graph_type, graph);
393
+
394
+ void *iter = rdx_declaration_method_references_iter_new(graph, data->id);
395
+ if (iter == NULL) {
396
+ rb_raise(rb_eRuntimeError, "Declaration not found");
397
+ }
398
+
399
+ VALUE args = rb_ary_new_from_args(2, data->graph_obj, ULL2NUM((uintptr_t)iter));
400
+ rb_ensure(rdxi_method_references_yield, args, rdxi_method_references_ensure, args);
401
+
402
+ return self;
403
+ }
404
+
405
+ // Placeholder for variable declarations that don't yet support references
406
+ static VALUE rdxr_variable_declaration_references(VALUE self) {
407
+ return rb_ary_new();
408
+ }
409
+
410
+ void rdxi_initialize_declaration(VALUE mRubydex) {
411
+ cDeclaration = rb_define_class_under(mRubydex, "Declaration", rb_cObject);
412
+ cNamespace = rb_define_class_under(mRubydex, "Namespace", cDeclaration);
413
+ cClass = rb_define_class_under(mRubydex, "Class", cNamespace);
414
+ cModule = rb_define_class_under(mRubydex, "Module", cNamespace);
415
+ cSingletonClass = rb_define_class_under(mRubydex, "SingletonClass", cNamespace);
416
+ cTodo = rb_define_class_under(mRubydex, "Todo", cNamespace);
417
+ cConstant = rb_define_class_under(mRubydex, "Constant", cDeclaration);
418
+ cConstantAlias = rb_define_class_under(mRubydex, "ConstantAlias", cDeclaration);
419
+ cMethod = rb_define_class_under(mRubydex, "Method", cDeclaration);
420
+ cGlobalVariable = rb_define_class_under(mRubydex, "GlobalVariable", cDeclaration);
421
+ cInstanceVariable = rb_define_class_under(mRubydex, "InstanceVariable", cDeclaration);
422
+ cClassVariable = rb_define_class_under(mRubydex, "ClassVariable", cDeclaration);
423
+
424
+ rb_define_alloc_func(cDeclaration, rdxr_handle_alloc);
425
+ rb_define_method(cDeclaration, "initialize", rdxr_handle_initialize, 2);
426
+ rb_define_method(cDeclaration, "name", rdxr_declaration_name, 0);
427
+ rb_define_method(cDeclaration, "unqualified_name", rdxr_declaration_unqualified_name, 0);
428
+ rb_define_method(cDeclaration, "definitions", rdxr_declaration_definitions, 0);
429
+ rb_define_method(cDeclaration, "owner", rdxr_declaration_owner, 0);
430
+
431
+ // Namespace only methods
432
+ rb_define_method(cNamespace, "references", rdxr_constant_declaration_references, 0);
433
+ rb_define_method(cNamespace, "member", rdxr_declaration_member, 1);
434
+ rb_define_method(cNamespace, "find_member", rdxr_declaration_find_member, -1);
435
+ rb_define_method(cNamespace, "singleton_class", rdxr_declaration_singleton_class, 0);
436
+ rb_define_method(cNamespace, "ancestors", rdxr_declaration_ancestors, 0);
437
+ rb_define_method(cNamespace, "descendants", rdxr_declaration_descendants, 0);
438
+ rb_define_method(cNamespace, "members", rdxr_declaration_members, 0);
439
+
440
+ // Constant and ConstantAlias have constant references
441
+ rb_define_method(cConstant, "references", rdxr_constant_declaration_references, 0);
442
+ rb_define_method(cConstantAlias, "references", rdxr_constant_declaration_references, 0);
443
+
444
+ // Method has method references
445
+ rb_define_method(cMethod, "references", rdxr_method_declaration_references, 0);
446
+
447
+ // Variable declarations don't yet support references
448
+ rb_define_method(cGlobalVariable, "references", rdxr_variable_declaration_references, 0);
449
+ rb_define_method(cInstanceVariable, "references", rdxr_variable_declaration_references, 0);
450
+ rb_define_method(cClassVariable, "references", rdxr_variable_declaration_references, 0);
451
+
452
+ rb_funcall(rb_singleton_class(cDeclaration), rb_intern("private"), 1, ID2SYM(rb_intern("new")));
453
+ }