{"action":"created","comment":{"url":"https://api.github.com/repos/geany/geany/pulls/comments/62183859","id":62183859,"diff_hunk":"@@ -0,0 +1,647 @@\n+/*\n+ *      tm_parser.c - this file is part of Geany, a fast and lightweight IDE\n+ *\n+ *      Copyright 2016 Jiri Techet <techet(at)gmail(dot)com>\n+ *\n+ *      This program is free software; you can redistribute it and/or modify\n+ *      it under the terms of the GNU General Public License as published by\n+ *      the Free Software Foundation; either version 2 of the License, or\n+ *      (at your option) any later version.\n+ *\n+ *      This program is distributed in the hope that it will be useful,\n+ *      but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ *      GNU General Public License for more details.\n+ *\n+ *      You should have received a copy of the GNU General Public License along\n+ *      with this program; if not, write to the Free Software Foundation, Inc.,\n+ *      51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n+ */\n+\n+#include \"tm_parser.h\"\n+#include \"tm_ctags_wrappers.h\"\n+\n+#include <string.h>\n+\n+\n+typedef struct\n+{\n+    const gchar kind;\n+    TMTagType type;\n+} TMParserMapEntry;\n+\n+\n+static TMParserMapEntry c_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'d', tm_tag_macro_t},\n+\t{'e', tm_tag_enumerator_t},\n+\t{'f', tm_tag_function_t},\n+\t{'g', tm_tag_enum_t},\n+\t{'m', tm_tag_member_t},\n+\t{'n', tm_tag_namespace_t},\n+\t{'p', tm_tag_prototype_t},\n+\t{'s', tm_tag_struct_t},\n+\t{'t', tm_tag_typedef_t},\n+\t{'u', tm_tag_union_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'x', tm_tag_externvar_t},\n+};\n+\n+static TMParserMapEntry java_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'f', tm_tag_field_t},\n+\t{'i', tm_tag_interface_t},\n+\t{'m', tm_tag_method_t},\n+\t{'p', tm_tag_package_t},\n+\t{'e', tm_tag_enumerator_t},\n+\t{'g', tm_tag_enum_t},\n+};\n+\n+static TMParserMapEntry makefile_map[] = {\n+\t{'m', tm_tag_macro_t},\n+\t{'t', tm_tag_function_t},\n+};\n+\n+static TMParserMapEntry pascal_map[] = {\n+\t{'f', tm_tag_function_t},\n+\t{'p', tm_tag_function_t},\n+};\n+\n+static TMParserMapEntry perl_map[] = {\n+\t{'c', tm_tag_enum_t},\n+\t{'f', tm_tag_other_t},\n+\t{'l', tm_tag_macro_t},\n+\t{'p', tm_tag_package_t},\n+\t{'s', tm_tag_function_t},\n+\t{'d', tm_tag_prototype_t},\n+};\n+\n+static TMParserMapEntry php_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'d', tm_tag_macro_t},\n+\t{'f', tm_tag_function_t},\n+\t{'i', tm_tag_interface_t},\n+\t{'l', tm_tag_undef_t},\n+\t{'n', tm_tag_namespace_t},\n+\t{'t', tm_tag_struct_t},\n+\t{'v', tm_tag_variable_t},\n+};\n+\n+static TMParserMapEntry python_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'f', tm_tag_function_t},\n+\t{'m', tm_tag_method_t},\n+\t{'v', tm_tag_variable_t},\n+    /* defined as externvar to get those excluded as forward type in symbols.c:goto_tag()\n+     * so we can jump to the real implementation (if known) instead of to the import statement */\n+\t{'x', tm_tag_externvar_t},\n+};\n+\n+/* different parser than tex.c from universal-ctags */\n+static TMParserMapEntry latex_map[] = {\n+\t{'f', tm_tag_function_t},\n+\t{'c', tm_tag_class_t},\n+\t{'m', tm_tag_member_t},\n+\t{'d', tm_tag_macro_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'n', tm_tag_namespace_t},\n+\t{'s', tm_tag_struct_t},\n+};\n+\n+static TMParserMapEntry asm_map[] = {\n+\t{'d', tm_tag_macro_t},\n+\t{'l', tm_tag_namespace_t},\n+\t{'m', tm_tag_function_t},\n+\t{'t', tm_tag_struct_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry conf_map[] = {\n+\t{'n', tm_tag_namespace_t},\n+\t{'m', tm_tag_macro_t},\n+};\n+\n+static TMParserMapEntry sql_map[] = {\n+\t{'c', tm_tag_undef_t},\n+\t{'d', tm_tag_prototype_t},\n+\t{'f', tm_tag_function_t},\n+\t{'F', tm_tag_field_t},\n+\t{'l', tm_tag_undef_t},\n+\t{'L', tm_tag_undef_t},\n+\t{'P', tm_tag_package_t},\n+\t{'p', tm_tag_namespace_t},\n+\t{'r', tm_tag_undef_t},\n+\t{'s', tm_tag_undef_t},\n+\t{'t', tm_tag_class_t},\n+\t{'T', tm_tag_macro_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'i', tm_tag_struct_t},\n+\t{'e', tm_tag_undef_t},\n+\t{'U', tm_tag_undef_t},\n+\t{'R', tm_tag_undef_t},\n+\t{'D', tm_tag_undef_t},\n+\t{'V', tm_tag_member_t},\n+\t{'n', tm_tag_undef_t},\n+\t{'x', tm_tag_undef_t},\n+\t{'y', tm_tag_undef_t},\n+\t{'z', tm_tag_undef_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry docbook_map[] = {\n+\t{'f', tm_tag_function_t},\n+\t{'c', tm_tag_class_t},\n+\t{'m', tm_tag_member_t},\n+\t{'d', tm_tag_macro_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'s', tm_tag_struct_t},\n+};\n+\n+static TMParserMapEntry erlang_map[] = {\n+\t{'d', tm_tag_macro_t},\n+\t{'f', tm_tag_function_t},\n+\t{'m', tm_tag_undef_t},\n+\t{'r', tm_tag_struct_t},\n+\t{'t', tm_tag_typedef_t},\n+};\n+\n+static TMParserMapEntry css_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'s', tm_tag_struct_t},\n+\t{'i', tm_tag_variable_t},\n+};\n+\n+static TMParserMapEntry ruby_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'f', tm_tag_method_t},\n+\t{'m', tm_tag_namespace_t},\n+\t{'F', tm_tag_member_t},\n+};\n+\n+static TMParserMapEntry tcl_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'m', tm_tag_member_t},\n+\t{'p', tm_tag_function_t},\n+\t{'n', tm_tag_namespace_t},\n+};\n+\n+static TMParserMapEntry sh_map[] = {\n+\t{'f', tm_tag_function_t},\n+};\n+\n+static TMParserMapEntry d_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'e', tm_tag_enumerator_t},\n+\t{'f', tm_tag_function_t},\n+\t{'g', tm_tag_enum_t},\n+\t{'i', tm_tag_interface_t},\n+\t{'m', tm_tag_member_t},\n+\t{'n', tm_tag_namespace_t},\n+\t{'p', tm_tag_prototype_t},\n+\t{'s', tm_tag_struct_t},\n+\t{'t', tm_tag_typedef_t},\n+\t{'u', tm_tag_union_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'x', tm_tag_externvar_t},\n+};\n+\n+static TMParserMapEntry diff_map[] = {\n+\t{'f', tm_tag_function_t},\n+};\n+\n+/* different parser than in universal-ctags */\n+static TMParserMapEntry vhdl_map[] = {\n+\t{'c', tm_tag_variable_t},\n+\t{'t', tm_tag_typedef_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'a', tm_tag_undef_t},\n+\t{'s', tm_tag_variable_t},\n+\t{'f', tm_tag_function_t},\n+\t{'p', tm_tag_function_t},\n+\t{'k', tm_tag_member_t},\n+\t{'l', tm_tag_namespace_t},\n+\t{'m', tm_tag_member_t},\n+\t{'n', tm_tag_class_t},\n+\t{'o', tm_tag_struct_t},\n+\t{'u', tm_tag_undef_t},\n+\t{'b', tm_tag_member_t},\n+\t{'A', tm_tag_typedef_t},\n+};\n+\n+static TMParserMapEntry lua_map[] = {\n+\t{'f', tm_tag_function_t},\n+};\n+\n+static TMParserMapEntry javascript_map[] = {\n+\t{'f', tm_tag_function_t},\n+\t{'c', tm_tag_class_t},\n+\t{'m', tm_tag_method_t},\n+\t{'p', tm_tag_member_t},\n+\t{'C', tm_tag_macro_t},\n+\t{'v', tm_tag_variable_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry haskell_map[] = {\n+\t{'t', tm_tag_typedef_t},\n+\t{'c', tm_tag_macro_t},\n+\t{'f', tm_tag_function_t},\n+\t{'m', tm_tag_namespace_t},\n+};\n+\n+static TMParserMapEntry csharp_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'d', tm_tag_macro_t},\n+\t{'e', tm_tag_enumerator_t},\n+\t{'E', tm_tag_undef_t},\n+\t{'f', tm_tag_field_t},\n+\t{'g', tm_tag_enum_t},\n+\t{'i', tm_tag_interface_t},\n+\t{'l', tm_tag_undef_t},\n+\t{'m', tm_tag_method_t},\n+\t{'n', tm_tag_namespace_t},\n+\t{'p', tm_tag_undef_t},\n+\t{'s', tm_tag_struct_t},\n+\t{'t', tm_tag_typedef_t},\n+};\n+\n+static TMParserMapEntry freebasic_map[] = {\n+\t{'c', tm_tag_macro_t},\n+\t{'f', tm_tag_function_t},\n+\t{'l', tm_tag_namespace_t},\n+\t{'t', tm_tag_struct_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'g', tm_tag_externvar_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry haxe_map[] = {\n+\t{'m', tm_tag_method_t},\n+\t{'c', tm_tag_class_t},\n+\t{'e', tm_tag_enum_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'i', tm_tag_interface_t},\n+\t{'t', tm_tag_typedef_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry rest_map[] = {\n+\t{'n', tm_tag_namespace_t},\n+\t{'m', tm_tag_member_t},\n+\t{'d', tm_tag_macro_t},\n+\t{'v', tm_tag_variable_t},\n+};\n+\n+static TMParserMapEntry html_map[] = {\n+\t{'a', tm_tag_member_t},\n+\t{'f', tm_tag_function_t},\n+\t{'n', tm_tag_namespace_t},\n+\t{'c', tm_tag_class_t},\n+\t{'v', tm_tag_variable_t},\n+};\n+\n+static TMParserMapEntry f77_map[] = {\n+\t{'b', tm_tag_undef_t},\n+\t{'c', tm_tag_macro_t},\n+\t{'e', tm_tag_undef_t},\n+\t{'f', tm_tag_function_t},\n+\t{'i', tm_tag_interface_t},\n+\t{'k', tm_tag_member_t},\n+\t{'l', tm_tag_undef_t},\n+\t{'L', tm_tag_undef_t},\n+\t{'m', tm_tag_namespace_t},\n+\t{'n', tm_tag_undef_t},\n+\t{'p', tm_tag_struct_t},\n+\t{'s', tm_tag_method_t},\n+\t{'t', tm_tag_class_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'E', tm_tag_enum_t},\n+\t{'N', tm_tag_enumerator_t},\n+};\n+\n+/* different parser than in universal-ctags */\n+static TMParserMapEntry matlab_map[] = {\n+\t{'f', tm_tag_function_t},\n+\t{'s', tm_tag_struct_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry vala_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'d', tm_tag_macro_t},\n+\t{'e', tm_tag_enumerator_t},\n+\t{'f', tm_tag_field_t},\n+\t{'g', tm_tag_enum_t},\n+\t{'i', tm_tag_interface_t},\n+\t{'l', tm_tag_undef_t},\n+\t{'m', tm_tag_method_t},\n+\t{'n', tm_tag_namespace_t},\n+\t{'p', tm_tag_undef_t},\n+\t{'S', tm_tag_undef_t},\n+\t{'s', tm_tag_struct_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry actionscript_map[] = {\n+\t{'f', tm_tag_function_t},\n+\t{'l', tm_tag_field_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'m', tm_tag_macro_t},\n+\t{'c', tm_tag_class_t},\n+\t{'i', tm_tag_interface_t},\n+\t{'p', tm_tag_package_t},\n+\t{'o', tm_tag_other_t},\n+\t{'r', tm_tag_prototype_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry nsis_map[] = {\n+\t{'n', tm_tag_namespace_t},\n+\t{'f', tm_tag_function_t},\n+\t{'v', tm_tag_variable_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry markdown_map[] = {\n+\t{'v', tm_tag_variable_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry txt2tags_map[] = {\n+\t{'m', tm_tag_member_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry abc_map[] = {\n+\t{'m', tm_tag_member_t},\n+\t{'s', tm_tag_struct_t},\n+};\n+\n+static TMParserMapEntry verilog_map[] = {\n+\t{'c', tm_tag_variable_t},\n+\t{'e', tm_tag_typedef_t},\n+\t{'f', tm_tag_function_t},\n+\t{'m', tm_tag_class_t},\n+\t{'n', tm_tag_variable_t},\n+\t{'p', tm_tag_variable_t},\n+\t{'r', tm_tag_variable_t},\n+\t{'t', tm_tag_function_t},\n+};\n+\n+static TMParserMapEntry r_map[] = {\n+\t{'f', tm_tag_function_t},\n+\t{'l', tm_tag_other_t},\n+\t{'s', tm_tag_other_t},\n+};\n+\n+static TMParserMapEntry cobol_map[] = {\n+\t{'d', tm_tag_variable_t},\n+\t{'f', tm_tag_function_t},\n+\t{'g', tm_tag_struct_t},\n+\t{'p', tm_tag_macro_t},\n+\t{'P', tm_tag_class_t},\n+\t{'s', tm_tag_namespace_t},\n+};\n+\n+static TMParserMapEntry objc_map[] = {\n+\t{'i', tm_tag_interface_t},\n+\t{'I', tm_tag_undef_t},\n+\t{'P', tm_tag_undef_t},\n+\t{'m', tm_tag_method_t},\n+\t{'c', tm_tag_class_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'F', tm_tag_field_t},\n+\t{'f', tm_tag_function_t},\n+\t{'p', tm_tag_undef_t},\n+\t{'t', tm_tag_typedef_t},\n+\t{'s', tm_tag_struct_t},\n+\t{'e', tm_tag_enum_t},\n+\t{'M', tm_tag_macro_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry asciidoc_map[] = {\n+\t{'n', tm_tag_namespace_t},\n+\t{'m', tm_tag_member_t},\n+\t{'d', tm_tag_macro_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'s', tm_tag_struct_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry abaqus_map[] = {\n+\t{'c', tm_tag_class_t},\n+\t{'m', tm_tag_member_t},\n+\t{'n', tm_tag_interface_t},\n+};\n+\n+static TMParserMapEntry rust_map[] = {\n+\t{'n', tm_tag_namespace_t},\n+\t{'s', tm_tag_struct_t},\n+\t{'i', tm_tag_interface_t},\n+\t{'c', tm_tag_class_t},\n+\t{'f', tm_tag_function_t},\n+\t{'g', tm_tag_enum_t},\n+\t{'t', tm_tag_typedef_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'M', tm_tag_macro_t},\n+\t{'m', tm_tag_field_t},\n+\t{'e', tm_tag_enumerator_t},\n+\t{'F', tm_tag_method_t},\n+};\n+\n+static TMParserMapEntry go_map[] = {\n+\t{'p', tm_tag_namespace_t},\n+\t{'f', tm_tag_function_t},\n+\t{'c', tm_tag_macro_t},\n+\t{'t', tm_tag_typedef_t},\n+\t{'v', tm_tag_variable_t},\n+\t{'s', tm_tag_struct_t},\n+\t{'i', tm_tag_interface_t},\n+\t{'m', tm_tag_member_t},\n+};\n+\n+static TMParserMapEntry json_map[] = {\n+\t{'o', tm_tag_member_t},\n+\t{'a', tm_tag_member_t},\n+\t{'n', tm_tag_member_t},\n+\t{'s', tm_tag_member_t},\n+\t{'b', tm_tag_member_t},\n+\t{'z', tm_tag_member_t},\n+};\n+\n+/* not in universal-ctags */\n+static TMParserMapEntry powershell_map[] = {\n+\t{'f', tm_tag_function_t},\n+\t{'v', tm_tag_variable_t},\n+};\n+\n+\n+typedef struct\n+{\n+    TMParserMapEntry *entries;\n+    guint size;\n+} TMParserMap;\n+\n+#define MAP_ENTRY(map) {map, (sizeof(map)/sizeof(TMParserMapEntry))}\n+\n+/* keep in sync with TM_PARSER_* definitions in the header */\n+static TMParserMap parser_map[] = {\n+\tMAP_ENTRY(c_map),\n+\tMAP_ENTRY(c_map),\t/* C++ - same as C */\n+\tMAP_ENTRY(java_map),\n+\tMAP_ENTRY(makefile_map),\n+\tMAP_ENTRY(pascal_map),\n+\tMAP_ENTRY(perl_map),\n+\tMAP_ENTRY(php_map),\n+\tMAP_ENTRY(python_map),\n+\tMAP_ENTRY(latex_map),\n+\tMAP_ENTRY(asm_map),\n+\tMAP_ENTRY(conf_map),\n+\tMAP_ENTRY(sql_map),\n+\tMAP_ENTRY(docbook_map),\n+\tMAP_ENTRY(erlang_map),\n+\tMAP_ENTRY(css_map),\n+\tMAP_ENTRY(ruby_map),\n+\tMAP_ENTRY(tcl_map),\n+\tMAP_ENTRY(sh_map),\n+\tMAP_ENTRY(d_map),\n+\tMAP_ENTRY(f77_map),\n+\tMAP_ENTRY(c_map),\t/* Ferite - same as C */\n+\tMAP_ENTRY(diff_map),\n+\tMAP_ENTRY(vhdl_map),\n+\tMAP_ENTRY(lua_map),\n+\tMAP_ENTRY(javascript_map),\n+\tMAP_ENTRY(haskell_map),\n+\tMAP_ENTRY(csharp_map),\n+\tMAP_ENTRY(freebasic_map),\n+\tMAP_ENTRY(haxe_map),\n+\tMAP_ENTRY(rest_map),\n+\tMAP_ENTRY(html_map),\n+\tMAP_ENTRY(f77_map),\n+\tMAP_ENTRY(c_map),\t/* GLSL - same as C */\n+\tMAP_ENTRY(matlab_map),\n+\tMAP_ENTRY(vala_map),\n+\tMAP_ENTRY(actionscript_map),\n+\tMAP_ENTRY(nsis_map),\n+\tMAP_ENTRY(markdown_map),\n+\tMAP_ENTRY(txt2tags_map),\n+\tMAP_ENTRY(abc_map),\n+\tMAP_ENTRY(verilog_map),\n+\tMAP_ENTRY(r_map),\n+\tMAP_ENTRY(cobol_map),\n+\tMAP_ENTRY(objc_map),\n+\tMAP_ENTRY(asciidoc_map),\n+\tMAP_ENTRY(abaqus_map),\n+\tMAP_ENTRY(rust_map),\n+\tMAP_ENTRY(go_map),\n+\tMAP_ENTRY(json_map),\n+\tMAP_ENTRY(php_map),\t/* Zephir - same as PHP */\n+\tMAP_ENTRY(powershell_map),\n+};\n+\n+\n+TMTagType tm_parser_get_tag_type(gchar kind, TMParserType lang)\n+{\n+\tTMParserMap *map = &parser_map[lang];\n+\tguint i;\n+\n+\tfor (i = 0; i < map->size; i++)\n+\t{\n+\t\tTMParserMapEntry *entry = &map->entries[i];\n+\n+\t\tif (entry->kind == kind)\n+\t\t\treturn entry->type;\n+\t}\n+\treturn tm_tag_undef_t;\n+}\n+\n+\n+gchar tm_parser_get_tag_kind(TMTagType type, TMParserType lang)\n+{\n+\tTMParserMap *map = &parser_map[lang];\n+\tguint i;\n+\n+\tfor (i = 0; i < map->size; i++)\n+\t{\n+\t\tTMParserMapEntry *entry = &map->entries[i];\n+\n+\t\tif (entry->type == type)\n+\t\t\treturn entry->kind;\n+\t}\n+\treturn '-';\n+}\n+\n+\n+void tm_parser_verify_type_mappings(void)","path":"tagmanager/src/tm_parser.c","position":576,"original_position":576,"commit_id":"5d9376ea801a6e6c3ec22748741362a3a2eff7ac","original_commit_id":"5d9376ea801a6e6c3ec22748741362a3a2eff7ac","user":{"login":"techee","id":713965,"avatar_url":"https://avatars.githubusercontent.com/u/713965?v=3","gravatar_id":"","url":"https://api.github.com/users/techee","html_url":"https://github.com/techee","followers_url":"https://api.github.com/users/techee/followers","following_url":"https://api.github.com/users/techee/following{/other_user}","gists_url":"https://api.github.com/users/techee/gists{/gist_id}","starred_url":"https://api.github.com/users/techee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/techee/subscriptions","organizations_url":"https://api.github.com/users/techee/orgs","repos_url":"https://api.github.com/users/techee/repos","events_url":"https://api.github.com/users/techee/events{/privacy}","received_events_url":"https://api.github.com/users/techee/received_events","type":"User","site_admin":false},"body":"> Yeah, they all start in the \"unsynced\" directory and move to the other as they get accepted into upstream.\r\n\r\nYeah, I could introduce something like that once something gets actually synced - now the directory would be just empty.\r\n\r\n> Predict c.c is last :wink:\r\n\r\nYeah, I think you are good at predicting future :-).\r\n\r\nThere's by the way a new cxx parser in uctags (see the cxx directory) which, if I understand it correctly, parses also function bodies and which might fix many issues of the current c.c parser, especially for C++. It's used by default by uctags now - you could give it a try if it fixes some of the issues you reported. If it works better, it might be interesting for us to switch to it.","created_at":"2016-05-05T13:08:57Z","updated_at":"2016-05-05T13:08:57Z","html_url":"https://github.com/geany/geany/pull/957#discussion_r62183859","pull_request_url":"https://api.github.com/repos/geany/geany/pulls/957","_links":{"self":{"href":"https://api.github.com/repos/geany/geany/pulls/comments/62183859"},"html":{"href":"https://github.com/geany/geany/pull/957#discussion_r62183859"},"pull_request":{"href":"https://api.github.com/repos/geany/geany/pulls/957"}}},"pull_request":{"url":"https://api.github.com/repos/geany/geany/pulls/957","id":62427582,"html_url":"https://github.com/geany/geany/pull/957","diff_url":"https://github.com/geany/geany/pull/957.diff","patch_url":"https://github.com/geany/geany/pull/957.patch","issue_url":"https://api.github.com/repos/geany/geany/issues/957","number":957,"state":"open","locked":false,"title":"TM cleanups","user":{"login":"techee","id":713965,"avatar_url":"https://avatars.githubusercontent.com/u/713965?v=3","gravatar_id":"","url":"https://api.github.com/users/techee","html_url":"https://github.com/techee","followers_url":"https://api.github.com/users/techee/followers","following_url":"https://api.github.com/users/techee/following{/other_user}","gists_url":"https://api.github.com/users/techee/gists{/gist_id}","starred_url":"https://api.github.com/users/techee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/techee/subscriptions","organizations_url":"https://api.github.com/users/techee/orgs","repos_url":"https://api.github.com/users/techee/repos","events_url":"https://api.github.com/users/techee/events{/privacy}","received_events_url":"https://api.github.com/users/techee/received_events","type":"User","site_admin":false},"body":"This is hopefully the last \"big\" patch set related to TM. In fact, despite the diff size, it's actually not that big - the diffs are mostly caused by moving stuff around.\r\n\r\nThere are no functional changes in this patch set - just cleanups.\r\n\r\nMost of the patches concentrate on TM<-->ctags interaction and simplification of their interfaces.\r\n\r\nThe last patch is an API/ABI break affecting projectorganizer and geanyprj - probably not worth the break alone but if there are more patches requiring ABI break, this one could be added. Can remove it from this patch set and submit separately.\r\n\r\nIt would be nice to have it applied early-ish in the 1.28 cycle as I'd like to do some work on syncing with upstream universal-ctags which will depend on these patches.","created_at":"2016-03-10T17:41:06Z","updated_at":"2016-05-05T13:08:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"26d7f967980b5ac2c62c1ad07a067994e473c119","assignee":{"login":"b4n","id":793526,"avatar_url":"https://avatars.githubusercontent.com/u/793526?v=3","gravatar_id":"","url":"https://api.github.com/users/b4n","html_url":"https://github.com/b4n","followers_url":"https://api.github.com/users/b4n/followers","following_url":"https://api.github.com/users/b4n/following{/other_user}","gists_url":"https://api.github.com/users/b4n/gists{/gist_id}","starred_url":"https://api.github.com/users/b4n/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/b4n/subscriptions","organizations_url":"https://api.github.com/users/b4n/orgs","repos_url":"https://api.github.com/users/b4n/repos","events_url":"https://api.github.com/users/b4n/events{/privacy}","received_events_url":"https://api.github.com/users/b4n/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/geany/geany/milestones/5","html_url":"https://github.com/geany/geany/milestones/1.28","labels_url":"https://api.github.com/repos/geany/geany/milestones/5/labels","id":1495828,"number":5,"title":"1.28","description":"","creator":{"login":"b4n","id":793526,"avatar_url":"https://avatars.githubusercontent.com/u/793526?v=3","gravatar_id":"","url":"https://api.github.com/users/b4n","html_url":"https://github.com/b4n","followers_url":"https://api.github.com/users/b4n/followers","following_url":"https://api.github.com/users/b4n/following{/other_user}","gists_url":"https://api.github.com/users/b4n/gists{/gist_id}","starred_url":"https://api.github.com/users/b4n/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/b4n/subscriptions","organizations_url":"https://api.github.com/users/b4n/orgs","repos_url":"https://api.github.com/users/b4n/repos","events_url":"https://api.github.com/users/b4n/events{/privacy}","received_events_url":"https://api.github.com/users/b4n/received_events","type":"User","site_admin":false},"open_issues":11,"closed_issues":6,"state":"open","created_at":"2016-01-10T23:27:47Z","updated_at":"2016-05-03T18:47:12Z","due_on":"2016-07-09T22:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/geany/geany/pulls/957/commits","review_comments_url":"https://api.github.com/repos/geany/geany/pulls/957/comments","review_comment_url":"https://api.github.com/repos/geany/geany/pulls/comments{/number}","comments_url":"https://api.github.com/repos/geany/geany/issues/957/comments","statuses_url":"https://api.github.com/repos/geany/geany/statuses/5d9376ea801a6e6c3ec22748741362a3a2eff7ac","head":{"label":"techee:ctags_hook","ref":"ctags_hook","sha":"5d9376ea801a6e6c3ec22748741362a3a2eff7ac","user":{"login":"techee","id":713965,"avatar_url":"https://avatars.githubusercontent.com/u/713965?v=3","gravatar_id":"","url":"https://api.github.com/users/techee","html_url":"https://github.com/techee","followers_url":"https://api.github.com/users/techee/followers","following_url":"https://api.github.com/users/techee/following{/other_user}","gists_url":"https://api.github.com/users/techee/gists{/gist_id}","starred_url":"https://api.github.com/users/techee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/techee/subscriptions","organizations_url":"https://api.github.com/users/techee/orgs","repos_url":"https://api.github.com/users/techee/repos","events_url":"https://api.github.com/users/techee/events{/privacy}","received_events_url":"https://api.github.com/users/techee/received_events","type":"User","site_admin":false},"repo":{"id":24825705,"name":"geany","full_name":"techee/geany","owner":{"login":"techee","id":713965,"avatar_url":"https://avatars.githubusercontent.com/u/713965?v=3","gravatar_id":"","url":"https://api.github.com/users/techee","html_url":"https://github.com/techee","followers_url":"https://api.github.com/users/techee/followers","following_url":"https://api.github.com/users/techee/following{/other_user}","gists_url":"https://api.github.com/users/techee/gists{/gist_id}","starred_url":"https://api.github.com/users/techee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/techee/subscriptions","organizations_url":"https://api.github.com/users/techee/orgs","repos_url":"https://api.github.com/users/techee/repos","events_url":"https://api.github.com/users/techee/events{/privacy}","received_events_url":"https://api.github.com/users/techee/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/techee/geany","description":"A fast and lightweight IDE","fork":true,"url":"https://api.github.com/repos/techee/geany","forks_url":"https://api.github.com/repos/techee/geany/forks","keys_url":"https://api.github.com/repos/techee/geany/keys{/key_id}","collaborators_url":"https://api.github.com/repos/techee/geany/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/techee/geany/teams","hooks_url":"https://api.github.com/repos/techee/geany/hooks","issue_events_url":"https://api.github.com/repos/techee/geany/issues/events{/number}","events_url":"https://api.github.com/repos/techee/geany/events","assignees_url":"https://api.github.com/repos/techee/geany/assignees{/user}","branches_url":"https://api.github.com/repos/techee/geany/branches{/branch}","tags_url":"https://api.github.com/repos/techee/geany/tags","blobs_url":"https://api.github.com/repos/techee/geany/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/techee/geany/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/techee/geany/git/refs{/sha}","trees_url":"https://api.github.com/repos/techee/geany/git/trees{/sha}","statuses_url":"https://api.github.com/repos/techee/geany/statuses/{sha}","languages_url":"https://api.github.com/repos/techee/geany/languages","stargazers_url":"https://api.github.com/repos/techee/geany/stargazers","contributors_url":"https://api.github.com/repos/techee/geany/contributors","subscribers_url":"https://api.github.com/repos/techee/geany/subscribers","subscription_url":"https://api.github.com/repos/techee/geany/subscription","commits_url":"https://api.github.com/repos/techee/geany/commits{/sha}","git_commits_url":"https://api.github.com/repos/techee/geany/git/commits{/sha}","comments_url":"https://api.github.com/repos/techee/geany/comments{/number}","issue_comment_url":"https://api.github.com/repos/techee/geany/issues/comments{/number}","contents_url":"https://api.github.com/repos/techee/geany/contents/{+path}","compare_url":"https://api.github.com/repos/techee/geany/compare/{base}...{head}","merges_url":"https://api.github.com/repos/techee/geany/merges","archive_url":"https://api.github.com/repos/techee/geany/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/techee/geany/downloads","issues_url":"https://api.github.com/repos/techee/geany/issues{/number}","pulls_url":"https://api.github.com/repos/techee/geany/pulls{/number}","milestones_url":"https://api.github.com/repos/techee/geany/milestones{/number}","notifications_url":"https://api.github.com/repos/techee/geany/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/techee/geany/labels{/name}","releases_url":"https://api.github.com/repos/techee/geany/releases{/id}","deployments_url":"https://api.github.com/repos/techee/geany/deployments","created_at":"2014-10-05T20:38:07Z","updated_at":"2015-03-11T21:37:59Z","pushed_at":"2016-05-04T14:32:00Z","git_url":"git://github.com/techee/geany.git","ssh_url":"git@github.com:techee/geany.git","clone_url":"https://github.com/techee/geany.git","svn_url":"https://github.com/techee/geany","homepage":"http://www.geany.org","size":47400,"stargazers_count":0,"watchers_count":0,"language":"Gettext Catalog","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"geany:master","ref":"master","sha":"d75873f9bc574e98ef024dc562100348595d959e","user":{"login":"geany","id":1108795,"avatar_url":"https://avatars.githubusercontent.com/u/1108795?v=3","gravatar_id":"","url":"https://api.github.com/users/geany","html_url":"https://github.com/geany","followers_url":"https://api.github.com/users/geany/followers","following_url":"https://api.github.com/users/geany/following{/other_user}","gists_url":"https://api.github.com/users/geany/gists{/gist_id}","starred_url":"https://api.github.com/users/geany/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geany/subscriptions","organizations_url":"https://api.github.com/users/geany/orgs","repos_url":"https://api.github.com/users/geany/repos","events_url":"https://api.github.com/users/geany/events{/privacy}","received_events_url":"https://api.github.com/users/geany/received_events","type":"Organization","site_admin":false},"repo":{"id":2532922,"name":"geany","full_name":"geany/geany","owner":{"login":"geany","id":1108795,"avatar_url":"https://avatars.githubusercontent.com/u/1108795?v=3","gravatar_id":"","url":"https://api.github.com/users/geany","html_url":"https://github.com/geany","followers_url":"https://api.github.com/users/geany/followers","following_url":"https://api.github.com/users/geany/following{/other_user}","gists_url":"https://api.github.com/users/geany/gists{/gist_id}","starred_url":"https://api.github.com/users/geany/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geany/subscriptions","organizations_url":"https://api.github.com/users/geany/orgs","repos_url":"https://api.github.com/users/geany/repos","events_url":"https://api.github.com/users/geany/events{/privacy}","received_events_url":"https://api.github.com/users/geany/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/geany/geany","description":"A fast and lightweight IDE","fork":false,"url":"https://api.github.com/repos/geany/geany","forks_url":"https://api.github.com/repos/geany/geany/forks","keys_url":"https://api.github.com/repos/geany/geany/keys{/key_id}","collaborators_url":"https://api.github.com/repos/geany/geany/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/geany/geany/teams","hooks_url":"https://api.github.com/repos/geany/geany/hooks","issue_events_url":"https://api.github.com/repos/geany/geany/issues/events{/number}","events_url":"https://api.github.com/repos/geany/geany/events","assignees_url":"https://api.github.com/repos/geany/geany/assignees{/user}","branches_url":"https://api.github.com/repos/geany/geany/branches{/branch}","tags_url":"https://api.github.com/repos/geany/geany/tags","blobs_url":"https://api.github.com/repos/geany/geany/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/geany/geany/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/geany/geany/git/refs{/sha}","trees_url":"https://api.github.com/repos/geany/geany/git/trees{/sha}","statuses_url":"https://api.github.com/repos/geany/geany/statuses/{sha}","languages_url":"https://api.github.com/repos/geany/geany/languages","stargazers_url":"https://api.github.com/repos/geany/geany/stargazers","contributors_url":"https://api.github.com/repos/geany/geany/contributors","subscribers_url":"https://api.github.com/repos/geany/geany/subscribers","subscription_url":"https://api.github.com/repos/geany/geany/subscription","commits_url":"https://api.github.com/repos/geany/geany/commits{/sha}","git_commits_url":"https://api.github.com/repos/geany/geany/git/commits{/sha}","comments_url":"https://api.github.com/repos/geany/geany/comments{/number}","issue_comment_url":"https://api.github.com/repos/geany/geany/issues/comments{/number}","contents_url":"https://api.github.com/repos/geany/geany/contents/{+path}","compare_url":"https://api.github.com/repos/geany/geany/compare/{base}...{head}","merges_url":"https://api.github.com/repos/geany/geany/merges","archive_url":"https://api.github.com/repos/geany/geany/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/geany/geany/downloads","issues_url":"https://api.github.com/repos/geany/geany/issues{/number}","pulls_url":"https://api.github.com/repos/geany/geany/pulls{/number}","milestones_url":"https://api.github.com/repos/geany/geany/milestones{/number}","notifications_url":"https://api.github.com/repos/geany/geany/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/geany/geany/labels{/name}","releases_url":"https://api.github.com/repos/geany/geany/releases{/id}","deployments_url":"https://api.github.com/repos/geany/geany/deployments","created_at":"2011-10-07T14:25:32Z","updated_at":"2016-05-05T00:15:13Z","pushed_at":"2016-05-05T00:59:57Z","git_url":"git://github.com/geany/geany.git","ssh_url":"git@github.com:geany/geany.git","clone_url":"https://github.com/geany/geany.git","svn_url":"https://github.com/geany/geany","homepage":"http://www.geany.org","size":54978,"stargazers_count":751,"watchers_count":751,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":263,"mirror_url":null,"open_issues_count":332,"forks":263,"open_issues":332,"watchers":751,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/geany/geany/pulls/957"},"html":{"href":"https://github.com/geany/geany/pull/957"},"issue":{"href":"https://api.github.com/repos/geany/geany/issues/957"},"comments":{"href":"https://api.github.com/repos/geany/geany/issues/957/comments"},"review_comments":{"href":"https://api.github.com/repos/geany/geany/pulls/957/comments"},"review_comment":{"href":"https://api.github.com/repos/geany/geany/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/geany/geany/pulls/957/commits"},"statuses":{"href":"https://api.github.com/repos/geany/geany/statuses/5d9376ea801a6e6c3ec22748741362a3a2eff7ac"}}}}