geany  1.38
About: Geany is a text editor (using GTK2) with basic features of an integrated development environment (syntax highlighting, code folding, symbol name auto-completion, ...). F: office T: editor programming GTK+ IDE
  Fossies Dox: geany-1.38.tar.bz2  ("unofficial" and yet experimental doxygen-generated source code documentation)  

tm_parser.c
Go to the documentation of this file.
1/*
2 * tm_parser.c - this file is part of Geany, a fast and lightweight IDE
3 *
4 * Copyright 2016 The Geany contributors
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21#include "tm_parser.h"
22#include "tm_ctags.h"
23
24#include <string.h>
25
26
27typedef struct
28{
29 const gchar kind;
32
33/* Allows remapping a subparser tag type to another type if there's a clash with
34 * the master parser tag type. Only subparser tag types explicitly listed within
35 * TMSubparserMapEntry maps are added to tag manager - tags with types not listed
36 * are discarded to prevent uncontrolled merging of tags from master parser and
37 * subparsers. */
38typedef struct
39{
43
44
45static GHashTable *subparser_map = NULL;
46
47
49 {'c', tm_tag_class_t},
50 {'d', tm_tag_macro_t},
52 {'f', tm_tag_function_t},
53 {'g', tm_tag_enum_t},
54 {'m', tm_tag_member_t},
55 {'n', tm_tag_namespace_t},
56 {'p', tm_tag_prototype_t},
57 {'s', tm_tag_struct_t},
58 {'t', tm_tag_typedef_t},
59 {'u', tm_tag_union_t},
60 {'v', tm_tag_variable_t},
61 {'x', tm_tag_externvar_t},
62};
63
64/* C++, same as C */
65#define map_CPP map_C
66
68 {'c', tm_tag_class_t},
69 {'f', tm_tag_field_t},
70 {'i', tm_tag_interface_t},
71 {'m', tm_tag_method_t},
72 {'p', tm_tag_package_t},
74 {'g', tm_tag_enum_t},
75};
76
78 {'m', tm_tag_macro_t},
79 {'t', tm_tag_function_t},
80};
81
83 {'f', tm_tag_function_t},
84 {'p', tm_tag_function_t},
85};
86
88 {'c', tm_tag_enum_t},
89 {'f', tm_tag_other_t},
90 {'l', tm_tag_macro_t},
91 {'p', tm_tag_package_t},
92 {'s', tm_tag_function_t},
93 {'d', tm_tag_prototype_t},
94};
95
97 {'c', tm_tag_class_t},
98 {'d', tm_tag_macro_t},
99 {'f', tm_tag_function_t},
100 {'i', tm_tag_interface_t},
101 {'l', tm_tag_undef_t},
102 {'n', tm_tag_namespace_t},
103 {'t', tm_tag_struct_t},
104 {'v', tm_tag_variable_t},
105};
106
108 {'c', tm_tag_class_t},
109 {'f', tm_tag_function_t},
110 {'m', tm_tag_method_t},
111 {'v', tm_tag_variable_t},
112 /* defined as externvar to get those excluded as forward type in symbols.c:goto_tag()
113 * so we can jump to the real implementation (if known) instead of to the import statement */
114 {'x', tm_tag_externvar_t},
115};
116
117/* different parser than tex.c from universal-ctags */
119 {'f', tm_tag_function_t},
120 {'c', tm_tag_class_t},
121 {'m', tm_tag_member_t},
122 {'d', tm_tag_macro_t},
123 {'v', tm_tag_variable_t},
124 {'n', tm_tag_namespace_t},
125 {'s', tm_tag_struct_t},
126};
128 {'a', tm_tag_function_t},
129 {'b', tm_tag_class_t},
130 {'B', tm_tag_class_t},
131 {'c', tm_tag_member_t},
132 {'i', tm_tag_macro_t},
133 {'I', tm_tag_macro_t},
134 {'j', tm_tag_member_t},
135 {'m', tm_tag_other_t},
136 {'M', tm_tag_variable_t},
137 {'n', tm_tag_other_t},
138 {'p', tm_tag_variable_t},
139 {'P', tm_tag_class_t},
140 {'s', tm_tag_namespace_t},
141 {'t', tm_tag_other_t},
142 {'u', tm_tag_externvar_t},
143};
144
146 {'d', tm_tag_macro_t},
147 {'l', tm_tag_namespace_t},
148 {'m', tm_tag_function_t},
149 {'t', tm_tag_struct_t},
150};
151
152/* not in universal-ctags */
154 {'n', tm_tag_namespace_t},
155 {'m', tm_tag_macro_t},
156};
157
159 {'c', tm_tag_undef_t},
160 {'d', tm_tag_prototype_t},
161 {'f', tm_tag_function_t},
162 {'E', tm_tag_field_t},
163 {'l', tm_tag_undef_t},
164 {'L', tm_tag_undef_t},
165 {'P', tm_tag_package_t},
166 {'p', tm_tag_namespace_t},
167 {'r', tm_tag_undef_t},
168 {'s', tm_tag_undef_t},
169 {'t', tm_tag_class_t},
170 {'T', tm_tag_macro_t},
171 {'v', tm_tag_variable_t},
172 {'i', tm_tag_struct_t},
173 {'e', tm_tag_undef_t},
174 {'U', tm_tag_undef_t},
175 {'R', tm_tag_undef_t},
176 {'D', tm_tag_undef_t},
177 {'V', tm_tag_member_t},
178 {'n', tm_tag_undef_t},
179 {'x', tm_tag_undef_t},
180 {'y', tm_tag_undef_t},
181 {'z', tm_tag_undef_t},
182};
183
184/* not in universal-ctags */
186 {'f', tm_tag_function_t},
187 {'c', tm_tag_class_t},
188 {'m', tm_tag_member_t},
189 {'d', tm_tag_macro_t},
190 {'v', tm_tag_variable_t},
191 {'s', tm_tag_struct_t},
192};
193
195 {'d', tm_tag_macro_t},
196 {'f', tm_tag_function_t},
197 {'m', tm_tag_undef_t},
198 {'r', tm_tag_struct_t},
199 {'t', tm_tag_typedef_t},
200};
201
203 {'c', tm_tag_class_t},
204 {'s', tm_tag_struct_t},
205 {'i', tm_tag_variable_t},
206};
207
209 {'c', tm_tag_class_t},
210 {'f', tm_tag_method_t},
211 {'m', tm_tag_namespace_t},
212 {'S', tm_tag_member_t},
213};
214
216 {'c', tm_tag_class_t},
217 {'m', tm_tag_member_t},
218 {'p', tm_tag_function_t},
219 {'n', tm_tag_namespace_t},
220};
221
223 {'f', tm_tag_function_t},
224};
225
227 {'c', tm_tag_class_t},
228 {'e', tm_tag_enumerator_t},
229 {'f', tm_tag_function_t},
230 {'g', tm_tag_enum_t},
231 {'i', tm_tag_interface_t},
232 {'m', tm_tag_member_t},
233 {'n', tm_tag_namespace_t},
234 {'p', tm_tag_prototype_t},
235 {'s', tm_tag_struct_t},
236 {'t', tm_tag_typedef_t},
237 {'u', tm_tag_union_t},
238 {'v', tm_tag_variable_t},
239 {'x', tm_tag_externvar_t},
240};
241
243 {'f', tm_tag_function_t},
244};
245
246/* different parser than in universal-ctags */
248 {'c', tm_tag_variable_t},
249 {'t', tm_tag_typedef_t},
250 {'v', tm_tag_variable_t},
251 {'a', tm_tag_undef_t},
252 {'s', tm_tag_variable_t},
253 {'f', tm_tag_function_t},
254 {'p', tm_tag_function_t},
255 {'k', tm_tag_member_t},
256 {'l', tm_tag_namespace_t},
257 {'m', tm_tag_member_t},
258 {'n', tm_tag_class_t},
259 {'o', tm_tag_struct_t},
260 {'u', tm_tag_undef_t},
261 {'b', tm_tag_member_t},
262 {'A', tm_tag_typedef_t},
263};
264
266 {'f', tm_tag_function_t},
267};
268
270 {'f', tm_tag_function_t},
271 {'c', tm_tag_class_t},
272 {'m', tm_tag_method_t},
273 {'p', tm_tag_member_t},
274 {'C', tm_tag_macro_t},
275 {'v', tm_tag_variable_t},
276 {'g', tm_tag_function_t},
277};
278
279/* not in universal-ctags */
281 {'t', tm_tag_typedef_t},
282 {'c', tm_tag_macro_t},
283 {'f', tm_tag_function_t},
284 {'m', tm_tag_namespace_t},
285};
286
288 {'c', tm_tag_class_t},
289 {'d', tm_tag_macro_t},
290 {'e', tm_tag_enumerator_t},
291 {'E', tm_tag_undef_t},
292 {'f', tm_tag_field_t},
293 {'g', tm_tag_enum_t},
294 {'i', tm_tag_interface_t},
295 {'l', tm_tag_undef_t},
296 {'m', tm_tag_method_t},
297 {'n', tm_tag_namespace_t},
298 {'p', tm_tag_undef_t},
299 {'s', tm_tag_struct_t},
300 {'t', tm_tag_typedef_t},
301};
302
304 {'c', tm_tag_macro_t},
305 {'f', tm_tag_function_t},
306 {'l', tm_tag_namespace_t},
307 {'t', tm_tag_struct_t},
308 {'v', tm_tag_variable_t},
309 {'g', tm_tag_externvar_t},
310};
311
312/* not in universal-ctags */
314 {'m', tm_tag_method_t},
315 {'c', tm_tag_class_t},
316 {'e', tm_tag_enum_t},
317 {'v', tm_tag_variable_t},
318 {'i', tm_tag_interface_t},
319 {'t', tm_tag_typedef_t},
320};
321
323 {'c', tm_tag_namespace_t},
324 {'s', tm_tag_member_t},
325 {'S', tm_tag_macro_t},
326 {'t', tm_tag_variable_t},
327 {'T', tm_tag_undef_t},
328};
329
331 {'a', tm_tag_member_t},
332 {'h', tm_tag_namespace_t},
333 {'i', tm_tag_class_t},
334 {'j', tm_tag_variable_t},
335};
336
339};
340
342 {'b', tm_tag_undef_t},
343 {'c', tm_tag_macro_t},
344 {'e', tm_tag_undef_t},
345 {'f', tm_tag_function_t},
346 {'i', tm_tag_interface_t},
347 {'k', tm_tag_member_t},
348 {'l', tm_tag_undef_t},
349 {'L', tm_tag_undef_t},
350 {'m', tm_tag_namespace_t},
351 {'n', tm_tag_undef_t},
352 {'p', tm_tag_struct_t},
353 {'s', tm_tag_method_t},
354 {'t', tm_tag_class_t},
355 {'v', tm_tag_variable_t},
356 {'E', tm_tag_enum_t},
357 {'N', tm_tag_enumerator_t},
358};
359
360#define map_FORTRAN map_F77
361
362#define map_FERITE map_C
363
364/* different parser than in universal-ctags */
366 {'f', tm_tag_function_t},
367 {'s', tm_tag_struct_t},
368};
369
370#define map_GLSL map_C
371
372/* not in universal-ctags */
374 {'c', tm_tag_class_t},
375 {'d', tm_tag_macro_t},
376 {'e', tm_tag_enumerator_t},
377 {'f', tm_tag_field_t},
378 {'g', tm_tag_enum_t},
379 {'i', tm_tag_interface_t},
380 {'l', tm_tag_undef_t},
381 {'m', tm_tag_method_t},
382 {'n', tm_tag_namespace_t},
383 {'p', tm_tag_undef_t},
384 {'S', tm_tag_undef_t},
385 {'s', tm_tag_struct_t},
386};
387
388/* not in universal-ctags */
390 {'f', tm_tag_function_t},
391 {'c', tm_tag_class_t},
392 {'i', tm_tag_interface_t},
393 {'P', tm_tag_package_t},
394 {'m', tm_tag_method_t},
395 {'p', tm_tag_member_t},
396 {'v', tm_tag_variable_t},
397 {'l', tm_tag_variable_t},
398 {'C', tm_tag_macro_t},
399 {'I', tm_tag_externvar_t},
400 {'x', tm_tag_other_t},
401};
402
403/* not in universal-ctags */
405 {'n', tm_tag_namespace_t},
406 {'f', tm_tag_function_t},
407 {'v', tm_tag_variable_t},
408};
409
410/* not in universal-ctags */
412 {'v', tm_tag_variable_t},
413};
414
415/* not in universal-ctags */
417 {'m', tm_tag_member_t},
418};
419
420/* not in universal-ctags */
422 {'m', tm_tag_member_t},
423 {'s', tm_tag_struct_t},
424};
425
427 {'c', tm_tag_variable_t},
428 {'e', tm_tag_typedef_t},
429 {'f', tm_tag_function_t},
430 {'m', tm_tag_class_t},
431 {'n', tm_tag_variable_t},
432 {'p', tm_tag_variable_t},
433 {'r', tm_tag_variable_t},
434 {'t', tm_tag_function_t},
435};
436
438 {'f', tm_tag_function_t},
439 {'l', tm_tag_other_t},
440 {'s', tm_tag_other_t},
441};
442
444 {'d', tm_tag_variable_t},
445 {'D', tm_tag_interface_t},
446 {'f', tm_tag_function_t},
447 {'g', tm_tag_struct_t},
448 {'p', tm_tag_macro_t},
449 {'P', tm_tag_class_t},
450 {'s', tm_tag_namespace_t},
451 {'S', tm_tag_externvar_t},
452};
453
455 {'i', tm_tag_interface_t},
456 {'I', tm_tag_undef_t},
457 {'P', tm_tag_undef_t},
458 {'m', tm_tag_method_t},
459 {'c', tm_tag_class_t},
460 {'v', tm_tag_variable_t},
461 {'E', tm_tag_field_t},
462 {'f', tm_tag_function_t},
463 {'p', tm_tag_undef_t},
464 {'t', tm_tag_typedef_t},
465 {'s', tm_tag_struct_t},
466 {'e', tm_tag_enum_t},
467 {'M', tm_tag_macro_t},
468};
469
471 {'c', tm_tag_namespace_t},
472 {'s', tm_tag_member_t},
473 {'S', tm_tag_macro_t},
474 {'t', tm_tag_variable_t},
475 {'T', tm_tag_struct_t},
476 {'u', tm_tag_undef_t},
477 {'a', tm_tag_undef_t},
478};
479
480/* not in universal-ctags */
482 {'c', tm_tag_class_t},
483 {'m', tm_tag_member_t},
484 {'n', tm_tag_interface_t},
485};
486
488 {'n', tm_tag_namespace_t},
489 {'s', tm_tag_struct_t},
490 {'i', tm_tag_interface_t},
491 {'c', tm_tag_class_t},
492 {'f', tm_tag_function_t},
493 {'g', tm_tag_enum_t},
494 {'t', tm_tag_typedef_t},
495 {'v', tm_tag_variable_t},
496 {'M', tm_tag_macro_t},
497 {'m', tm_tag_field_t},
498 {'e', tm_tag_enumerator_t},
499 {'P', tm_tag_method_t},
500};
501
503 {'p', tm_tag_namespace_t},
504 {'f', tm_tag_function_t},
505 {'c', tm_tag_macro_t},
506 {'t', tm_tag_typedef_t},
507 {'v', tm_tag_variable_t},
508 {'s', tm_tag_struct_t},
509 {'i', tm_tag_interface_t},
510 {'m', tm_tag_member_t},
511};
512
514 {'o', tm_tag_member_t},
515 {'a', tm_tag_member_t},
516 {'n', tm_tag_member_t},
517 {'s', tm_tag_member_t},
518 {'b', tm_tag_member_t},
519 {'z', tm_tag_member_t},
520};
521
522/* Zephir, same as PHP */
523#define map_ZEPHIR map_PHP
524
525/* not in universal-ctags */
527 {'f', tm_tag_function_t},
528 {'v', tm_tag_variable_t},
529};
530
532 {'c', tm_tag_variable_t},
533 {'f', tm_tag_function_t},
534 {'g', tm_tag_member_t},
535 {'m', tm_tag_macro_t},
536 {'n', tm_tag_namespace_t},
537 {'s', tm_tag_struct_t},
538 {'t', tm_tag_typedef_t},
539 /* defined as externvar to get those excluded as forward type in symbols.c:goto_tag()
540 * so we can jump to the real implementation (if known) instead of to the import statement */
541 {'x', tm_tag_externvar_t},
542};
543
544
545typedef struct
546{
548 guint size;
550
551#define MAP_ENTRY(lang) [TM_PARSER_##lang] = {map_##lang, G_N_ELEMENTS(map_##lang)}
552
553/* keep in sync with TM_PARSER_* definitions in the header */
555 MAP_ENTRY(C),
556 MAP_ENTRY(CPP),
557 MAP_ENTRY(JAVA),
558 MAP_ENTRY(MAKEFILE),
559 MAP_ENTRY(PASCAL),
560 MAP_ENTRY(PERL),
561 MAP_ENTRY(PHP),
562 MAP_ENTRY(PYTHON),
563 MAP_ENTRY(LATEX),
564 MAP_ENTRY(BIBTEX),
565 MAP_ENTRY(ASM),
566 MAP_ENTRY(CONF),
567 MAP_ENTRY(SQL),
568 MAP_ENTRY(DOCBOOK),
569 MAP_ENTRY(ERLANG),
570 MAP_ENTRY(CSS),
571 MAP_ENTRY(RUBY),
572 MAP_ENTRY(TCL),
573 MAP_ENTRY(SH),
574 MAP_ENTRY(D),
575 MAP_ENTRY(FORTRAN),
576 MAP_ENTRY(FERITE),
577 MAP_ENTRY(DIFF),
578 MAP_ENTRY(VHDL),
579 MAP_ENTRY(LUA),
580 MAP_ENTRY(JAVASCRIPT),
581 MAP_ENTRY(HASKELL),
582 MAP_ENTRY(CSHARP),
583 MAP_ENTRY(FREEBASIC),
584 MAP_ENTRY(HAXE),
585 MAP_ENTRY(REST),
586 MAP_ENTRY(HTML),
587 MAP_ENTRY(F77),
588 MAP_ENTRY(GLSL),
589 MAP_ENTRY(MATLAB),
590 MAP_ENTRY(VALA),
591 MAP_ENTRY(ACTIONSCRIPT),
592 MAP_ENTRY(NSIS),
593 MAP_ENTRY(MARKDOWN),
594 MAP_ENTRY(TXT2TAGS),
595 MAP_ENTRY(ABC),
596 MAP_ENTRY(VERILOG),
597 MAP_ENTRY(R),
598 MAP_ENTRY(COBOL),
599 MAP_ENTRY(OBJC),
600 MAP_ENTRY(ASCIIDOC),
601 MAP_ENTRY(ABAQUS),
602 MAP_ENTRY(RUST),
603 MAP_ENTRY(GO),
604 MAP_ENTRY(JSON),
605 MAP_ENTRY(ZEPHIR),
606 MAP_ENTRY(POWERSHELL),
607 MAP_ENTRY(JULIA),
608};
609/* make sure the parser map is consistent and complete */
610G_STATIC_ASSERT(G_N_ELEMENTS(parser_map) == TM_PARSER_COUNT);
611
612
614{
615 TMParserMap *map = &parser_map[lang];
616 guint i;
617
618 for (i = 0; i < map->size; i++)
619 {
620 TMParserMapEntry *entry = &map->entries[i];
621
622 if (entry->kind == kind)
623 return entry->type;
624 }
625 return tm_tag_undef_t;
626}
627
628
630{
631 TMParserMap *map = &parser_map[lang];
632 guint i;
633
634 for (i = 0; i < map->size; i++)
635 {
636 TMParserMapEntry *entry = &map->entries[i];
637
638 if (entry->type == type)
639 return entry->kind;
640 }
641 return '\0';
642}
643
644
645static void add_subparser(TMParserType lang, TMParserType sublang, TMSubparserMapEntry *map, guint map_size)
646{
647 guint i;
648 GPtrArray *mapping;
649 GHashTable *lang_map = g_hash_table_lookup(subparser_map, GINT_TO_POINTER(lang));
650
651 if (!lang_map)
652 {
653 lang_map = g_hash_table_new(g_direct_hash, g_direct_equal);
654 g_hash_table_insert(subparser_map, GINT_TO_POINTER(lang), lang_map);
655 }
656
657 mapping = g_ptr_array_new();
658 for (i = 0; i < map_size; i++)
659 g_ptr_array_add(mapping, &map[i]);
660
661 g_hash_table_insert(lang_map, GINT_TO_POINTER(sublang), mapping);
662}
663
664
665#define SUBPARSER_MAP_ENTRY(lang, sublang, map) add_subparser(TM_PARSER_##lang, TM_PARSER_##sublang, map, G_N_ELEMENTS(map))
666
667static void init_subparser_map(void)
668{
670}
671
672
674{
675 guint i;
676 GHashTable *lang_map;
677 GPtrArray *mapping;
678
679 if (!subparser_map)
680 {
681 subparser_map = g_hash_table_new(g_direct_hash, g_direct_equal);
683 }
684
685 lang_map = g_hash_table_lookup(subparser_map, GINT_TO_POINTER(lang));
686 if (!lang_map)
687 return tm_tag_undef_t;
688
689 mapping = g_hash_table_lookup(lang_map, GINT_TO_POINTER(sublang));
690 if (!mapping)
691 return tm_tag_undef_t;
692
693 for (i = 0; i < mapping->len; i++)
694 {
695 TMSubparserMapEntry *entry = mapping->pdata[i];
696 if (entry->orig_type == type)
697 return entry->new_type;
698 }
699
700 return tm_tag_undef_t;
701}
702
703
705{
706 TMParserType lang;
707
708 if (TM_PARSER_COUNT > tm_ctags_get_lang_count())
709 g_error("More parsers defined in Geany than in ctags");
710
711 for (lang = 0; lang < TM_PARSER_COUNT; lang++)
712 {
713 const gchar *kinds = tm_ctags_get_lang_kinds(lang);
714 TMParserMap *map = &parser_map[lang];
715 gchar presence_map[256];
716 guint i;
717
718 if (! map->entries || map->size < 1)
719 g_error("No tag types in TM for %s, is the language listed in parser_map?",
721
722 if (map->size != strlen(kinds))
723 g_error("Different number of tag types in TM (%d) and ctags (%d) for %s",
724 map->size, (int)strlen(kinds), tm_ctags_get_lang_name(lang));
725
726 memset(presence_map, 0, sizeof(presence_map));
727 for (i = 0; i < map->size; i++)
728 {
729 gboolean ctags_found = FALSE;
730 gboolean tm_found = FALSE;
731 guint j;
732
733 for (j = 0; j < map->size; j++)
734 {
735 /* check that for every type in TM there's a type in ctags */
736 if (map->entries[i].kind == kinds[j])
737 ctags_found = TRUE;
738 /* check that for every type in ctags there's a type in TM */
739 if (map->entries[j].kind == kinds[i])
740 tm_found = TRUE;
741 if (ctags_found && tm_found)
742 break;
743 }
744 if (!ctags_found)
745 g_error("Tag type '%c' found in TM but not in ctags for %s",
746 map->entries[i].kind, tm_ctags_get_lang_name(lang));
747 if (!tm_found)
748 g_error("Tag type '%c' found in ctags but not in TM for %s",
749 kinds[i], tm_ctags_get_lang_name(lang));
750
751 presence_map[(unsigned char) map->entries[i].kind]++;
752 }
753
754 for (i = 0; i < sizeof(presence_map); i++)
755 {
756 if (presence_map[i] > 1)
757 g_error("Duplicate tag type '%c' found for %s",
758 (gchar)i, tm_ctags_get_lang_name(lang));
759 }
760 }
761}
762
763
765{
766 switch (lang)
767 {
768 case TM_PARSER_C: /* for C++ .h headers or C structs */
769 case TM_PARSER_CPP:
770 case TM_PARSER_GLSL: /* for structs */
771 /*case GEANY_FILETYPES_RUBY:*/ /* not sure what to use atm*/
772 case TM_PARSER_PHP:
773 case TM_PARSER_POWERSHELL:
774 case TM_PARSER_RUST:
775 case TM_PARSER_ZEPHIR:
776 return "::";
777
778 /* avoid confusion with other possible separators in group/section name */
779 case TM_PARSER_CONF:
780 case TM_PARSER_REST:
781 return ":::";
782
783 /* no context separator */
784 case TM_PARSER_ASCIIDOC:
785 case TM_PARSER_TXT2TAGS:
786 return "\x03";
787
788 default:
789 return ".";
790 }
791}
792
793
795{
796 switch (lang)
797 {
798 /* These parsers include full hierarchy in the tag scope, separated by tm_parser_context_separator() */
799 case TM_PARSER_ACTIONSCRIPT:
800 case TM_PARSER_C:
801 case TM_PARSER_CPP:
802 case TM_PARSER_CSHARP:
803 case TM_PARSER_COBOL:
804 case TM_PARSER_D:
805 case TM_PARSER_FERITE:
806 case TM_PARSER_GLSL:
807 case TM_PARSER_JAVA:
808 case TM_PARSER_JAVASCRIPT:
809 case TM_PARSER_JSON:
810 case TM_PARSER_PHP:
811 case TM_PARSER_POWERSHELL:
812 case TM_PARSER_PYTHON:
813 case TM_PARSER_RUBY:
814 case TM_PARSER_RUST:
815 case TM_PARSER_SQL:
816 case TM_PARSER_TXT2TAGS:
817 case TM_PARSER_VALA:
818 case TM_PARSER_ZEPHIR:
819 return TRUE;
820
821 /* These make use of the scope, but don't include nested hierarchy
822 * (either as a parser limitation or a language semantic) */
823 case TM_PARSER_ASCIIDOC:
824 case TM_PARSER_CONF:
825 case TM_PARSER_ERLANG:
826 case TM_PARSER_F77:
827 case TM_PARSER_FORTRAN:
828 case TM_PARSER_GO:
829 case TM_PARSER_OBJC:
830 case TM_PARSER_REST:
831 /* Other parsers don't use scope at all (or should be somewhere above) */
832 default:
833 return FALSE;
834 }
835}
836
837
839{
840 if (lang == TM_PARSER_NONE || other == TM_PARSER_NONE)
841 return FALSE;
842 if (lang == other)
843 return TRUE;
844 /* Accept CPP tags for C lang and vice versa */
845 else if (lang == TM_PARSER_C && other == TM_PARSER_CPP)
846 return TRUE;
847 else if (lang == TM_PARSER_CPP && other == TM_PARSER_C)
848 return TRUE;
849
850 return FALSE;
851}
#define NULL
Definition: rbtree.h:150
GtkWidget * entry
Definition: search.c:118
TMTagType type
Definition: tm_parser.c:30
const gchar kind
Definition: tm_parser.c:29
guint size
Definition: tm_parser.c:548
TMParserMapEntry * entries
Definition: tm_parser.c:547
TMTagType new_type
Definition: tm_parser.c:41
TMTagType orig_type
Definition: tm_parser.c:40
guint tm_ctags_get_lang_count(void)
Definition: tm_ctags.c:272
const gchar * tm_ctags_get_lang_kinds(TMParserType lang)
Definition: tm_ctags.c:244
const gchar * tm_ctags_get_lang_name(TMParserType lang)
Definition: tm_ctags.c:232
static GHashTable * subparser_map
Definition: tm_parser.c:45
static TMParserMapEntry map_CSS[]
Definition: tm_parser.c:202
static TMParserMapEntry map_ACTIONSCRIPT[]
Definition: tm_parser.c:389
G_STATIC_ASSERT(G_N_ELEMENTS(parser_map)==TM_PARSER_COUNT)
static TMParserMapEntry map_JSON[]
Definition: tm_parser.c:513
static TMParserMapEntry map_HAXE[]
Definition: tm_parser.c:313
static TMParserMapEntry map_ABAQUS[]
Definition: tm_parser.c:481
static TMParserMapEntry map_F77[]
Definition: tm_parser.c:341
static TMParserMapEntry map_ABC[]
Definition: tm_parser.c:421
static TMParserMapEntry map_HASKELL[]
Definition: tm_parser.c:280
static TMParserMapEntry map_ERLANG[]
Definition: tm_parser.c:194
static TMParserMapEntry map_SH[]
Definition: tm_parser.c:222
static TMParserMapEntry map_HTML[]
Definition: tm_parser.c:330
#define MAP_ENTRY(lang)
Definition: tm_parser.c:551
static TMParserMapEntry map_JAVA[]
Definition: tm_parser.c:67
static TMParserMapEntry map_JULIA[]
Definition: tm_parser.c:531
static TMParserMapEntry map_CONF[]
Definition: tm_parser.c:153
gboolean tm_parser_has_full_context(TMParserType lang)
Definition: tm_parser.c:794
static TMParserMapEntry map_PHP[]
Definition: tm_parser.c:96
static TMParserMapEntry map_COBOL[]
Definition: tm_parser.c:443
static TMParserMapEntry map_C[]
Definition: tm_parser.c:48
static TMParserMapEntry map_MARKDOWN[]
Definition: tm_parser.c:411
static TMParserMapEntry map_MAKEFILE[]
Definition: tm_parser.c:77
static void init_subparser_map(void)
Definition: tm_parser.c:667
static TMParserMapEntry map_PERL[]
Definition: tm_parser.c:87
static TMParserMapEntry map_JAVASCRIPT[]
Definition: tm_parser.c:269
static TMParserMapEntry map_ASM[]
Definition: tm_parser.c:145
static TMParserMapEntry map_SQL[]
Definition: tm_parser.c:158
#define SUBPARSER_MAP_ENTRY(lang, sublang, map)
Definition: tm_parser.c:665
static TMParserMapEntry map_DIFF[]
Definition: tm_parser.c:242
gchar tm_parser_get_tag_kind(TMTagType type, TMParserType lang)
Definition: tm_parser.c:629
static TMParserMapEntry map_D[]
Definition: tm_parser.c:226
static TMParserMapEntry map_ASCIIDOC[]
Definition: tm_parser.c:470
static TMParserMapEntry map_FREEBASIC[]
Definition: tm_parser.c:303
static TMParserMapEntry map_BIBTEX[]
Definition: tm_parser.c:127
static TMParserMapEntry map_VHDL[]
Definition: tm_parser.c:247
static TMParserMapEntry map_TXT2TAGS[]
Definition: tm_parser.c:416
const gchar * tm_parser_context_separator(TMParserType lang)
Definition: tm_parser.c:764
static TMParserMapEntry map_LATEX[]
Definition: tm_parser.c:118
static TMParserMapEntry map_OBJC[]
Definition: tm_parser.c:454
static TMParserMapEntry map_VERILOG[]
Definition: tm_parser.c:426
static TMParserMapEntry map_POWERSHELL[]
Definition: tm_parser.c:526
static TMParserMapEntry map_VALA[]
Definition: tm_parser.c:373
static void add_subparser(TMParserType lang, TMParserType sublang, TMSubparserMapEntry *map, guint map_size)
Definition: tm_parser.c:645
static TMParserMap parser_map[]
Definition: tm_parser.c:554
static TMParserMapEntry map_RUST[]
Definition: tm_parser.c:487
static TMParserMapEntry map_CSHARP[]
Definition: tm_parser.c:287
static TMParserMapEntry map_LUA[]
Definition: tm_parser.c:265
static TMParserMapEntry map_PASCAL[]
Definition: tm_parser.c:82
gboolean tm_parser_langs_compatible(TMParserType lang, TMParserType other)
Definition: tm_parser.c:838
static TMParserMapEntry map_DOCBOOK[]
Definition: tm_parser.c:185
static TMParserMapEntry map_REST[]
Definition: tm_parser.c:322
static TMParserMapEntry map_RUBY[]
Definition: tm_parser.c:208
static TMSubparserMapEntry subparser_HTML_javascript_map[]
Definition: tm_parser.c:337
static TMParserMapEntry map_GO[]
Definition: tm_parser.c:502
static TMParserMapEntry map_MATLAB[]
Definition: tm_parser.c:365
void tm_parser_verify_type_mappings(void)
Definition: tm_parser.c:704
static TMParserMapEntry map_PYTHON[]
Definition: tm_parser.c:107
static TMParserMapEntry map_NSIS[]
Definition: tm_parser.c:404
static TMParserMapEntry map_R[]
Definition: tm_parser.c:437
TMTagType tm_parser_get_subparser_type(TMParserType lang, TMParserType sublang, TMTagType type)
Definition: tm_parser.c:673
static TMParserMapEntry map_TCL[]
Definition: tm_parser.c:215
TMTagType tm_parser_get_tag_type(gchar kind, TMParserType lang)
Definition: tm_parser.c:613
TMTagType
Types of tags.
Definition: tm_parser.h:23
@ tm_tag_function_t
Function definition.
Definition: tm_parser.h:29
@ tm_tag_package_t
Package (Java only)
Definition: tm_parser.h:34
@ tm_tag_interface_t
Interface (Java only)
Definition: tm_parser.h:30
@ tm_tag_field_t
Field (Java only)
Definition: tm_parser.h:28
@ tm_tag_class_t
Class declaration.
Definition: tm_parser.h:25
@ tm_tag_enumerator_t
Enumerator value.
Definition: tm_parser.h:27
@ tm_tag_undef_t
Unknown type.
Definition: tm_parser.h:24
@ tm_tag_member_t
Member variable of class/struct.
Definition: tm_parser.h:31
@ tm_tag_method_t
Class method (Java only)
Definition: tm_parser.h:32
@ tm_tag_union_t
Union.
Definition: tm_parser.h:38
@ tm_tag_struct_t
Struct declaration.
Definition: tm_parser.h:36
@ tm_tag_namespace_t
Namespace declaration.
Definition: tm_parser.h:33
@ tm_tag_variable_t
Variable.
Definition: tm_parser.h:39
@ tm_tag_other_t
Other (non C/C++/Java tag)
Definition: tm_parser.h:44
@ tm_tag_prototype_t
Function prototype.
Definition: tm_parser.h:35
@ tm_tag_typedef_t
Typedef.
Definition: tm_parser.h:37
@ tm_tag_externvar_t
Extern or forward declaration.
Definition: tm_parser.h:40
@ tm_tag_enum_t
Enum declaration.
Definition: tm_parser.h:26
@ tm_tag_macro_t
Macro (without arguments)
Definition: tm_parser.h:41
gint TMParserType
Definition: tm_parser.h:52