clangc 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/ext/clangc/_clangc_functions.c +303 -0
  3. data/ext/clangc/_clangc_functions.h +51 -0
  4. data/ext/clangc/clangc.c +376 -0
  5. data/ext/clangc/class_CodeCompleteResults.c +186 -0
  6. data/ext/clangc/class_CodeCompleteResults.h +51 -0
  7. data/ext/clangc/class_CompletionResult.c +98 -0
  8. data/ext/clangc/class_CompletionResult.h +36 -0
  9. data/ext/clangc/class_CompletionString.c +231 -0
  10. data/ext/clangc/class_CompletionString.h +57 -0
  11. data/ext/clangc/class_Cursor.c +1677 -0
  12. data/ext/clangc/class_Cursor.h +259 -0
  13. data/ext/clangc/class_CursorSet.c +109 -0
  14. data/ext/clangc/class_CursorSet.h +39 -0
  15. data/ext/clangc/class_Diagnostic.c +322 -0
  16. data/ext/clangc/class_Diagnostic.h +66 -0
  17. data/ext/clangc/class_File.c +145 -0
  18. data/ext/clangc/class_File.h +45 -0
  19. data/ext/clangc/class_Index.c +461 -0
  20. data/ext/clangc/class_Index.h +58 -0
  21. data/ext/clangc/class_Module.c +181 -0
  22. data/ext/clangc/class_Module.h +51 -0
  23. data/ext/clangc/class_OverriddenCursor.c +51 -0
  24. data/ext/clangc/class_OverriddenCursor.h +31 -0
  25. data/ext/clangc/class_SourceLocation.c +197 -0
  26. data/ext/clangc/class_SourceLocation.h +45 -0
  27. data/ext/clangc/class_SourceRange.c +123 -0
  28. data/ext/clangc/class_SourceRange.h +42 -0
  29. data/ext/clangc/class_TranslationUnit.c +457 -0
  30. data/ext/clangc/class_TranslationUnit.h +63 -0
  31. data/ext/clangc/class_Type.c +564 -0
  32. data/ext/clangc/class_Type.h +108 -0
  33. data/ext/clangc/constants.c +660 -0
  34. data/ext/clangc/constants.h +21 -0
  35. data/ext/clangc/extconf.rb +34 -0
  36. data/ext/clangc/macros.h +230 -0
  37. data/lib/clangc.rb +397 -0
  38. metadata +95 -0
@@ -0,0 +1,45 @@
1
+ /*
2
+ * ruby-clangc ruby bindings for the C interface of Clang
3
+ * Copyright (C) 2015-2016 Cedric Le Moigne cedlemo <cedlemo@gmx.com>
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ #ifndef SOURCELOCATION_H
19
+ #define SOURCELOCATION_H
20
+ #include <ruby/ruby.h>
21
+ #include "clang-c/Index.h"
22
+ typedef struct SourceLocation_t
23
+ {
24
+ CXSourceLocation data;
25
+ VALUE parent;
26
+ } SourceLocation_t;
27
+
28
+ VALUE
29
+ c_SourceLocation_struct_alloc(VALUE);
30
+
31
+ VALUE
32
+ c_SourceLocation_is_in_system_header(VALUE);
33
+
34
+ VALUE
35
+ c_SourceLocation_is_from_main_file(VALUE);
36
+
37
+ VALUE
38
+ c_SourceLocation_is_equal(VALUE, VALUE);
39
+
40
+ VALUE
41
+ c_SourceLocation_get_spelling(VALUE);
42
+
43
+ VALUE
44
+ c_SourceLocation_get_file_location(VALUE);
45
+ #endif // SOURCELOCATION_H
@@ -0,0 +1,123 @@
1
+ /*
2
+ * ruby-clangc ruby bindings for the C interface of Clang
3
+ * Copyright (C) 2015-2016 Cedric Le Moigne cedlemo <cedlemo@gmx.com>
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ /*SourceRange ruby class*/
19
+ #include "class_SourceRange.h"
20
+ #include "macros.h"
21
+ #include "class_SourceLocation.h"
22
+
23
+ static void c_SourceRange_struct_free(SourceRange_t *s)
24
+ {
25
+ if (s)
26
+ {
27
+ ruby_xfree(s);
28
+ }
29
+ }
30
+
31
+ static void c_SourceRange_mark(void *s)
32
+ {
33
+ if (s)
34
+ {
35
+ SourceRange_t *t = (SourceRange_t *) s;
36
+ rb_gc_mark(t->parent);
37
+ }
38
+ }
39
+ VALUE
40
+ c_SourceRange_struct_alloc(VALUE klass)
41
+ {
42
+
43
+ SourceRange_t *ptr;
44
+ ptr = (SourceRange_t *) ruby_xmalloc(sizeof(SourceRange_t));
45
+ ptr->parent = Qnil;
46
+
47
+ return Data_Wrap_Struct(
48
+ klass, NULL, c_SourceRange_struct_free, (void *) ptr);
49
+ }
50
+
51
+ /**
52
+ * call-seq:
53
+ * Clangc::SourceRange#is_null => true or false
54
+ *
55
+ * Returns true is the underlying CXSourceRange is NULL or false otherwise
56
+ */
57
+ VALUE
58
+ c_SourceRange_is_null(VALUE self)
59
+ {
60
+ SourceRange_t *s;
61
+ Data_Get_Struct(self, SourceRange_t, s);
62
+ return NOT_0_2_RVAL(clang_Range_isNull(s->data));
63
+ }
64
+
65
+ /**
66
+ * call-seq:
67
+ * clangc::SourceRange#is_equal
68
+ *
69
+ * Determine whether two ranges are equivalent.
70
+ * Returns true if the ranges are the same, false if they differ.
71
+ */
72
+ VALUE
73
+ c_SourceRange_is_equal(VALUE self, VALUE source_range)
74
+ {
75
+ SourceRange_t *sr1;
76
+ SourceRange_t *sr2;
77
+ Data_Get_Struct(self, SourceRange_t, sr1);
78
+ CHECK_ARG_TYPE(source_range, SourceRange);
79
+ Data_Get_Struct(source_range, SourceRange_t, sr2);
80
+ return NOT_0_2_RVAL(clang_equalRanges(sr1->data, sr2->data));
81
+ }
82
+
83
+ /**
84
+ * call-seq:
85
+ * Clangc::SourceRange#start => clangc::SourceLocation
86
+ *
87
+ * Retrieve a source location representing the first character within a
88
+ * source range.
89
+ */
90
+ VALUE
91
+ c_SourceRange_get_start(VALUE self)
92
+ {
93
+ SourceRange_t *sr;
94
+ SourceLocation_t *sl;
95
+ VALUE a_source_location;
96
+ Data_Get_Struct(self, SourceRange_t, sr);
97
+
98
+ R_GET_CLASS_DATA("Clangc", SourceLocation, a_source_location, sl);
99
+ sl->data = clang_getRangeStart(sr->data);
100
+ sl->parent = self;
101
+ return a_source_location;
102
+ }
103
+
104
+ /**
105
+ * call-seq:
106
+ * Clangc::SourceRange#end => clangc::SourceLocation
107
+ *
108
+ * Retrieve a source location representing the last character within a
109
+ * source range.
110
+ */
111
+ VALUE
112
+ c_SourceRange_get_end(VALUE self)
113
+ {
114
+ SourceRange_t *sr;
115
+ SourceLocation_t *sl;
116
+ VALUE a_source_location;
117
+ Data_Get_Struct(self, SourceRange_t, sr);
118
+
119
+ R_GET_CLASS_DATA("Clangc", SourceLocation, a_source_location, sl);
120
+ sl->data = clang_getRangeEnd(sr->data);
121
+ sl->parent = self;
122
+ return a_source_location;
123
+ }
@@ -0,0 +1,42 @@
1
+ /*
2
+ * ruby-clangc ruby bindings for the C interface of Clang
3
+ * Copyright (C) 2015-2016 Cedric Le Moigne cedlemo <cedlemo@gmx.com>
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ #ifndef SOURCERANGE_H
19
+ #define SOURCERANGE_H
20
+ #include <ruby/ruby.h>
21
+ #include "clang-c/Index.h"
22
+ typedef struct SourceRange_t
23
+ {
24
+ CXSourceRange data;
25
+ VALUE parent;
26
+ } SourceRange_t;
27
+
28
+ VALUE
29
+ c_SourceRange_struct_alloc(VALUE);
30
+
31
+ VALUE
32
+ c_SourceRange_is_null(VALUE);
33
+
34
+ VALUE
35
+ c_SourceRange_is_equal(VALUE, VALUE);
36
+
37
+ VALUE
38
+ c_SourceRange_get_start(VALUE);
39
+
40
+ VALUE
41
+ c_SourceRange_get_end(VALUE);
42
+ #endif // SOURCERANGE_H
@@ -0,0 +1,457 @@
1
+ /*
2
+ * ruby-clangc ruby bindings for the C interface of Clang
3
+ * Copyright (C) 2015-2016 Cedric Le Moigne cedlemo <cedlemo@gmx.com>
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ /*TranslationUnit ruby class*/
19
+ #include "class_TranslationUnit.h"
20
+ #include "class_Diagnostic.h"
21
+ #include "class_File.h"
22
+ #include "class_Cursor.h"
23
+ #include "class_Module.h"
24
+ #include "class_CodeCompleteResults.h"
25
+ #include "class_SourceRange.h"
26
+ #include "macros.h"
27
+
28
+ static void c_TranslationUnit_struct_free(TranslationUnit_t *s)
29
+ {
30
+ if (s)
31
+ {
32
+
33
+ if (s->data) clang_disposeTranslationUnit(s->data);
34
+
35
+ ruby_xfree(s);
36
+ }
37
+ }
38
+ static void c_TranslationUnit_mark(void *s)
39
+ {
40
+ if (s)
41
+ {
42
+ TranslationUnit_t *t = (TranslationUnit_t *) s;
43
+ rb_gc_mark(t->parent);
44
+ }
45
+ }
46
+
47
+ VALUE
48
+ c_TranslationUnit_struct_alloc(VALUE klass)
49
+ {
50
+
51
+ TranslationUnit_t *ptr;
52
+ ptr = (TranslationUnit_t *) ruby_xmalloc(sizeof(TranslationUnit_t));
53
+ ptr->data = NULL;
54
+ ptr->parent = Qnil;
55
+ return Data_Wrap_Struct(klass,
56
+ c_TranslationUnit_mark,
57
+ c_TranslationUnit_struct_free,
58
+ (void *) ptr);
59
+ }
60
+
61
+ /*
62
+ * call-seq:
63
+ * Clangc::TranslationUnit#diagnostics_num => num
64
+ *
65
+ * Determine the number of diagnostics produced for the given
66
+ * translation unit.
67
+ */
68
+ VALUE
69
+ c_TranslationUnit_get_diagnostics_num(VALUE self)
70
+ {
71
+ TranslationUnit_t *t;
72
+ unsigned int num;
73
+ Data_Get_Struct(self, TranslationUnit_t, t);
74
+
75
+ num = clang_getNumDiagnostics(t->data);
76
+ return CUINT_2_NUM(num);
77
+ }
78
+
79
+ /**
80
+ * call-seq:
81
+ * Clangc::TranslationUnit#default_save_options => num
82
+ *
83
+ * Returns the set of flags that is suitable for saving a translation
84
+ * unit. Those flags should be Clangc::SaveTranslationUnit_Flags constant
85
+ *
86
+ * The set of flags returned provide options for Clangc::TranslationUnit#save by
87
+ * default.
88
+ * The returned flags set contains an unspecified set of options that save
89
+ * translation units with
90
+ * the most commonly-requested data.
91
+ */
92
+ VALUE
93
+ c_TranslationUnit_get_default_save_options(VALUE self)
94
+ {
95
+ TranslationUnit_t *t;
96
+ unsigned int num;
97
+ Data_Get_Struct(self, TranslationUnit_t, t);
98
+
99
+ num = clang_defaultSaveOptions(t->data);
100
+ return CUINT_2_NUM(num);
101
+ }
102
+
103
+ /**
104
+ * call-seq:
105
+ * Clangc::TranslationUnit#spelling => string
106
+ *
107
+ * Get the original translation unit source file name.
108
+ */
109
+ VALUE
110
+ c_TranslationUnit_get_spelling(VALUE self)
111
+ {
112
+ TranslationUnit_t *t;
113
+ Data_Get_Struct(self, TranslationUnit_t, t);
114
+ return CXSTR_2_RVAL(clang_getTranslationUnitSpelling(t->data));
115
+ }
116
+
117
+ /**
118
+ * call-seq:
119
+ * Clangc::TranslationUnit#default_reparse_options => num
120
+ *
121
+ * Returns the set of flags that is suitable for reparsing a translation
122
+ * unit.
123
+ *
124
+ * The set of flags returned provide options for Clangc::TranslationUnit.reparse
125
+ * by default. The returned flag set contains an unspecified set of
126
+ * optimizations
127
+ * geared toward common uses of reparsing. The set of optimizations enabled may
128
+ * change from one version to the next. Clangc::ReparseF_Flags constants.
129
+ */
130
+
131
+ VALUE
132
+ c_TranslationUnit_get_default_reparse_options(VALUE self)
133
+ {
134
+ TranslationUnit_t *t;
135
+ unsigned int num;
136
+ Data_Get_Struct(self, TranslationUnit_t, t);
137
+
138
+ num = clang_defaultReparseOptions(t->data);
139
+ return CUINT_2_NUM(num);
140
+ }
141
+
142
+ /**
143
+ * call-seq:
144
+ * Clangc::TranslationUnit#diagnostic(index) => Clangc::Diagnostic
145
+ *
146
+ * Retrieve a diagnostic associated with the given translation unit.
147
+ *
148
+ * index the zero-based diagnostic number to retrieve.
149
+ *
150
+ * returns the requested diagnostic.
151
+ */
152
+ VALUE
153
+ c_TranslationUnit_get_diagnostic(VALUE self, VALUE num)
154
+ {
155
+ TranslationUnit_t *t;
156
+ Data_Get_Struct(self, TranslationUnit_t, t);
157
+ unsigned int max;
158
+ unsigned int c_num;
159
+ VALUE diagnostic;
160
+
161
+ max = clang_getNumDiagnostics(t->data);
162
+ c_num = NUM2UINT(num);
163
+ CHECK_IN_RANGE(c_num, 0, max);
164
+ Diagnostic_t *d;
165
+ R_GET_CLASS_DATA("Clangc", Diagnostic, diagnostic, d);
166
+ d->data = clang_getDiagnostic(t->data, c_num);
167
+ d->parent = self;
168
+ return diagnostic;
169
+ }
170
+
171
+ /**
172
+ * call-seq:
173
+ * Clangc::TranslationUnit#file(file_name) => clangc::File or nil
174
+ *
175
+ * Retrieve a file handle within the given translation unit.
176
+ * file_name a String for the name of the file.
177
+ *
178
+ * it returns the file handle for the named file in the translation unit ,
179
+ * a nil if the file was not a part of this translation unit.
180
+ */
181
+ VALUE
182
+ c_TranslationUnit_get_file(VALUE self, VALUE file_name)
183
+ {
184
+ TranslationUnit_t *t;
185
+ CXFile cxfile;
186
+ char *c_file_name;
187
+
188
+ Data_Get_Struct(self, TranslationUnit_t, t);
189
+ c_file_name = RSTRING_2_CHAR(file_name);
190
+ cxfile = clang_getFile(t->data, c_file_name);
191
+
192
+ if (cxfile)
193
+ {
194
+ VALUE file;
195
+ File_t *f;
196
+ R_GET_CLASS_DATA("Clangc", File, file, f);
197
+ f->data = cxfile;
198
+ f->parent = self;
199
+ return file;
200
+ }
201
+ else
202
+ return Qnil;
203
+ }
204
+
205
+ /**
206
+ * call-seq:
207
+ * Clangc::TranslationUnit#cursor => Clangc::Cursor
208
+ *
209
+ * Retrieve the cursor that represents the given translation unit.
210
+ *
211
+ * The translation unit cursor can be used to start traversing the
212
+ * various declarations within the given translation unit.
213
+ */
214
+ VALUE
215
+ c_TranslationUnit_get_cursor(VALUE self)
216
+ {
217
+ TranslationUnit_t *t;
218
+ Data_Get_Struct(self, TranslationUnit_t, t);
219
+ Cursor_t *c;
220
+ VALUE a_cursor;
221
+ R_GET_CLASS_DATA("Clangc", Cursor, a_cursor, c);
222
+ c->data = clang_getTranslationUnitCursor(t->data);
223
+ c->parent = self;
224
+ return a_cursor;
225
+ }
226
+
227
+ /**
228
+ * call-seq:
229
+ * Clangc::TranslationUnit#module(Clangc::File) => Clangc::Module
230
+ *
231
+ * Given a Clangc::File header file, return the module that contains it, if one
232
+ * exists.
233
+ */
234
+ VALUE
235
+ c_TranslationUnit_get_module(VALUE self, VALUE file)
236
+ {
237
+ TranslationUnit_t *t;
238
+ File_t *f;
239
+ Module_t *m;
240
+ VALUE module;
241
+
242
+ Data_Get_Struct(self, TranslationUnit_t, t);
243
+ CHECK_ARG_TYPE(file, File);
244
+ Data_Get_Struct(file, File_t, f);
245
+
246
+ R_GET_CLASS_DATA("Clangc", Module, module, m);
247
+ m->data = clang_getModuleForFile(t->data, f->data);
248
+ m->parent = self;
249
+
250
+ if (m->data)
251
+ return module;
252
+ else
253
+ return Qnil;
254
+ }
255
+
256
+ /**
257
+ * call-seq:
258
+ * Clangc::TranslationUnit#code_complete_at(filename, line, column, options) =>
259
+ * Clangc::CodeCompleteResults or nil
260
+ *
261
+ * Perform code completion at a given location in a translation unit.
262
+ *
263
+ * This function performs code completion at a particular file, line, and
264
+ * column within source code, providing results that suggest potential
265
+ * code snippets based on the context of the completion. The basic model
266
+ * for code completion is that Clang will parse a complete source file,
267
+ * performing syntax checking up to the location where code-completion has
268
+ * been requested. At that point, a special code-completion token is passed
269
+ * to the parser, which recognizes this token and determines, based on the
270
+ * current location in the C/Objective-C/C++ grammar and the state of
271
+ * semantic analysis, what completions to provide. These completions are
272
+ * returned via a new Clangc::CodeCompleteResults instantce.
273
+ *
274
+ * Code completion itself is meant to be triggered by the client when the
275
+ * user types punctuation characters or whitespace, at which point the
276
+ * code-completion location will coincide with the cursor. For example, if \c p
277
+ * is a pointer, code-completion might be triggered after the "-" and then
278
+ * after the ">" in \c p->. When the code-completion location is afer the ">",
279
+ * the completion results will provide, e.g., the members of the struct that
280
+ * "p" points to. The client is responsible for placing the cursor at the
281
+ * beginning of the token currently being typed, then filtering the results
282
+ * based on the contents of the token. For example, when code-completing for
283
+ * the expression \c p->get, the client should provide the location just after
284
+ * the ">" (e.g., pointing at the "g") to this code-completion hook. Then, the
285
+ * client can filter the results based on the current token text ("get"), only
286
+ * showing those results that start with "get". The intent of this interface
287
+ * is to separate the relatively high-latency acquisition of code-completion
288
+ * results from the filtering of results on a per-character basis, which must
289
+ * have a lower latency.
290
+ *
291
+ * Self is The translation unit in which code-completion should
292
+ * occur. The source files for this translation unit need not be
293
+ * completely up-to-date (and the contents of those source files may
294
+ * be overridden via \p unsaved_files). Cursors referring into the
295
+ * translation unit may be invalidated by this invocation.
296
+ *
297
+ * The name of the source file where code
298
+ * completion should be performed. This filename may be any file
299
+ * included in the translation unit.
300
+ *
301
+ * The line at which code-completion should occur.
302
+ *
303
+ * The column at which code-completion should occur.
304
+ * Note that the column should point just after the syntactic construct that
305
+ * initiated code completion, and not in the middle of a lexical token.
306
+ *
307
+ * # TODO unsaved_files (not managed yet) the Tiles that have not yet been saved
308
+ * to disk
309
+ * but may be required for parsing or code completion, including the
310
+ * contents of those files. The contents and name of these files (as
311
+ * specified by CXUnsavedFile) are copied when necessary, so the
312
+ * client only needs to guarantee their validity until the call to
313
+ * this function returns.
314
+ *
315
+ * # TODO num_unsaved_files The number of unsaved file entries in \p
316
+ * unsaved_files.
317
+ *
318
+ * Extra options that control the behavior of code
319
+ * completion, expressed as a bitwise OR of the constants of the
320
+ * Clangc::CodeComplete_Flags. The
321
+ * Clangc_default_code_complete_options function returns a default set
322
+ * of code-completion options.
323
+ *
324
+ * \returns If successful, a new \c CXCodeCompleteResults structure
325
+ * containing code-completion results, which should eventually be
326
+ * freed with \c clang_disposeCodeCompleteResults(). If code
327
+ * completion fails, returns NULL.
328
+ */
329
+ VALUE
330
+ c_TranslationUnit_code_complete_at(
331
+ VALUE self, VALUE filename, VALUE line, VALUE column, VALUE options)
332
+ {
333
+ TranslationUnit_t *t;
334
+ CodeCompleteResults_t *c;
335
+ VALUE code_complete_results;
336
+ char *c_filename;
337
+ unsigned int c_line;
338
+ unsigned int c_column;
339
+ unsigned int c_options;
340
+
341
+ c_filename = RSTRING_2_CHAR(filename);
342
+ c_line = NUM2UINT(line);
343
+ c_column = NUM2UINT(column);
344
+ c_options = CLANGC_CONSTANT_TO_UINT("CodeComplete_Flags", options);
345
+
346
+ Data_Get_Struct(self, TranslationUnit_t, t);
347
+ R_GET_CLASS_DATA("Clangc", CodeCompleteResults, code_complete_results, c);
348
+ c->data = clang_codeCompleteAt(t->data,
349
+ c_filename,
350
+ c_line,
351
+ c_column,
352
+ NULL, // TODO Manage unsaved files
353
+ 0,
354
+ c_options);
355
+ c->parent = self;
356
+
357
+ if (c->data)
358
+ return code_complete_results;
359
+ else
360
+ return Qnil;
361
+ }
362
+
363
+ /**
364
+ * call-seq:
365
+ * Clangc::TranslationUnit#reparse(options) => Clangc::ErrorCode
366
+ *
367
+ * Reparse the source files that produced this translation unit.
368
+ *
369
+ * This routine can be used to re-parse the source files that originally
370
+ * created the given translation unit, for example because those source files
371
+ * have changed (either on disk or as passed via \p unsaved_files). The
372
+ * source code will be reparsed with the same command-line options as it
373
+ * was originally parsed.
374
+ *
375
+ * Reparsing a translation unit invalidates all cursors and source locations
376
+ * that refer into that translation unit. This makes reparsing a translation
377
+ * unit semantically equivalent to destroying the translation unit and then
378
+ * creating a new translation unit with the same command-line arguments.
379
+ * However, it may be more efficient to reparse a translation
380
+ * unit using this routine.
381
+ *
382
+ * The translation unit whose contents will be re-parsed. The
383
+ * translation unit must originally have been built with
384
+ * \c clang_createTranslationUnitFromSourceFile().
385
+ *
386
+ * TODO num_unsaved_files The number of unsaved file entries in \p
387
+ * unsaved_files.
388
+ *
389
+ * TODO unsaved_files The files that have not yet been saved to disk
390
+ * but may be required for parsing, including the contents of
391
+ * those files. The contents and name of these files (as specified by
392
+ * CXUnsavedFile) are copied when necessary, so the client only needs to
393
+ * guarantee their validity until the call to this function returns.
394
+ *
395
+ * options A bitset of options composed of the flags in Clangc::Reparse_Flags.
396
+ * The function Clangc::TranslationUnit.defaultReparseOptions() produces a
397
+ * default set of
398
+ * options recommended for most uses, based on the translation unit.
399
+ *
400
+ * \returns 0 if the sources could be reparsed. A non-zero error code will be
401
+ * returned if reparsing was impossible, such that the translation unit is
402
+ * invalid. The error codes returned by this
403
+ * routine are described by the Clangc::ErrorCode.
404
+ */
405
+ VALUE
406
+ c_TranslationUnit_reparse(VALUE self, VALUE options)
407
+ {
408
+ TranslationUnit_t *t;
409
+ int error;
410
+ unsigned int c_options;
411
+
412
+ Data_Get_Struct(self, TranslationUnit_t, t);
413
+ c_options = CLANGC_CONSTANT_TO_UINT("Reparse_Flags", options);
414
+ error = clang_reparseTranslationUnit(t->data,
415
+ 0,
416
+ NULL, // TODO Manage unsaved files
417
+ c_options);
418
+ return CINT_2_NUM(error);
419
+ }
420
+
421
+ /**
422
+ * call-seq:
423
+ * Clangc::TranslationUnit#skipped_ranges(cxfile) => Array
424
+ *
425
+ * Retrieve all ranges that were skipped by the preprocessor for the Clangc::File
426
+ * instance.
427
+ *
428
+ * The preprocessor will skip lines when they are surrounded by an
429
+ * if/ifdef/ifndef directive whose condition does not evaluate to true.
430
+ * It returns an Array of SourceRange.
431
+ */
432
+ VALUE
433
+ c_TranslationUnit_get_skipped_ranges(VALUE self, VALUE file)
434
+ {
435
+ TranslationUnit_t *t;
436
+ File_t *f;
437
+ VALUE ret = rb_ary_new();
438
+ CXSourceRangeList * skipped_ranges_list;
439
+ int i = 0;
440
+
441
+ Data_Get_Struct(self, TranslationUnit_t, t);
442
+ CHECK_ARG_TYPE(file, File);
443
+ Data_Get_Struct(file, File_t, f);
444
+ skipped_ranges_list = clang_getSkippedRanges(t->data, f->data);
445
+
446
+ for(i = 0; i < skipped_ranges_list->count; i++)
447
+ {
448
+ SourceRange_t * s;
449
+ VALUE source_range;
450
+ R_GET_CLASS_DATA("Clangc", SourceRange, source_range, s);
451
+ s->data = skipped_ranges_list->ranges[i];
452
+ s->parent = t->data;
453
+ rb_ary_push(ret, source_range);
454
+ }
455
+ clang_disposeSourceRangeList(skipped_ranges_list);
456
+ return ret;
457
+ }