Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

main: experimental implementation of multi-pass parsing #2741

Draft
wants to merge 19 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
686744f
build-sys: link libreadtags to ctags
masatake Nov 28, 2020
73b5335
main: rename tagFile type to tagSinkInfo to avoid conflicting the typ…
masatake Dec 29, 2020
e5d7ced
main: enable TAG_{KIND,EXTRA,FIELD,ROLE}_DESCRIPTION pseudo tags
masatake Dec 29, 2020
8074f87
main: add minimum API for reading an existing tags file from ctags
masatake Nov 28, 2020
13d4420
main: notify ptag descs that ptags are loaded from a hint file
masatake Dec 30, 2020
573aef9
units.py,docs(web): add --_hint-file=hint.tags if hint.tags exists
masatake Dec 27, 2020
0c8dd8a
main: export getLanguageKindForName to parsers
masatake Nov 28, 2020
0bea0dd
Python,refactor: make roles defined for "unknown" kind reusable
masatake Nov 28, 2020
5ba6a80
Python: resolve real kinds for tags with unknown kinds when a hint fi…
masatake Nov 28, 2020
dbdcb42
main: export ePtagType to parsers
masatake Dec 30, 2020
80b6156
main: notify parser that ptags are loaded from a hint file
masatake Dec 30, 2020
39e924a
main: provide the way to know whether a field is available or not in …
masatake Dec 30, 2020
84352f9
main: notify parser that regular tags are loaded from a hint file
masatake Dec 30, 2020
7b4b70d
main: provide the way to know whether a kind is available or not in a…
masatake Dec 30, 2020
46404e7
main: provide the way to know whether an extra (xtag) is available or…
masatake Dec 30, 2020
4474e11
main: provide the way to know whether a role is available or not in a…
masatake Dec 30, 2020
cd3d7b4
Cxx: hint based macro expansions
masatake Dec 31, 2020
980b996
CPreProcessor: don't prepare per-input-file macro table if the client…
masatake Jan 21, 2021
61e5266
CPreProcessor: use the negative cache table only when it is prepared
masatake Feb 18, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ endif

PARSER_HEADS += $(PEG_EXTRA_HEADS)

libctags_a_CPPFLAGS = -I. -I$(srcdir) -I$(srcdir)/main -I$(srcdir)/dsl -I$(srcdir)/peg -DHAVE_PACKCC
libctags_a_CPPFLAGS = -I. -I$(srcdir) -I$(srcdir)/main -I$(srcdir)/dsl -I$(srcdir)/libreadtags -I$(srcdir)/peg -DHAVE_PACKCC
if ENABLE_DEBUGGING
libctags_a_CPPFLAGS+= $(DEBUG_CPPFLAGS)
endif
Expand Down
36 changes: 36 additions & 0 deletions Tmain/extras-field-for-pseudo-tags.d/stdout-expected.txt
Original file line number Diff line number Diff line change
@@ -1,22 +1,58 @@
# option: --format=1
!_TAG_EXTRA_DESCRIPTION pseudo /Include pseudo tags/
!_TAG_FIELD_DESCRIPTION extras /Extra tag type information/
!_TAG_FIELD_DESCRIPTION input /input file/
!_TAG_FIELD_DESCRIPTION name /tag name/
!_TAG_FIELD_DESCRIPTION pattern /pattern/
!_TAG_FILE_FORMAT 1 /original ctags format/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_KIND_DESCRIPTION!C d,macro /macro definitions/
!_TAG_KIND_DESCRIPTION!C e,enumerator /enumerators (values inside an enumeration)/
!_TAG_KIND_DESCRIPTION!C f,function /function definitions/
!_TAG_KIND_DESCRIPTION!C g,enum /enumeration names/
!_TAG_KIND_DESCRIPTION!C h,header /included header files/
!_TAG_KIND_DESCRIPTION!C m,member /struct, and union members/
!_TAG_KIND_DESCRIPTION!C s,struct /structure names/
!_TAG_KIND_DESCRIPTION!C t,typedef /typedefs/
!_TAG_KIND_DESCRIPTION!C u,union /union names/
!_TAG_KIND_DESCRIPTION!C v,variable /variable definitions/
!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP slash /slash or backslash/
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
!_TAG_ROLE_DESCRIPTION!C!header local /local header/
!_TAG_ROLE_DESCRIPTION!C!header system /system header/
!_TAG_ROLE_DESCRIPTION!C!macro undef /undefined/
main input.c /^int main (void) { return 0; }$/
# option: --format=2
!_TAG_EXTRA_DESCRIPTION pseudo /Include pseudo tags/;" extras:pseudo
!_TAG_FIELD_DESCRIPTION extras /Extra tag type information/;" extras:pseudo
!_TAG_FIELD_DESCRIPTION input /input file/;" extras:pseudo
!_TAG_FIELD_DESCRIPTION name /tag name/;" extras:pseudo
!_TAG_FIELD_DESCRIPTION pattern /pattern/;" extras:pseudo
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/;" extras:pseudo
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/;" extras:pseudo
!_TAG_KIND_DESCRIPTION!C d,macro /macro definitions/;" extras:pseudo
!_TAG_KIND_DESCRIPTION!C e,enumerator /enumerators (values inside an enumeration)/;" extras:pseudo
!_TAG_KIND_DESCRIPTION!C f,function /function definitions/;" extras:pseudo
!_TAG_KIND_DESCRIPTION!C g,enum /enumeration names/;" extras:pseudo
!_TAG_KIND_DESCRIPTION!C h,header /included header files/;" extras:pseudo
!_TAG_KIND_DESCRIPTION!C m,member /struct, and union members/;" extras:pseudo
!_TAG_KIND_DESCRIPTION!C s,struct /structure names/;" extras:pseudo
!_TAG_KIND_DESCRIPTION!C t,typedef /typedefs/;" extras:pseudo
!_TAG_KIND_DESCRIPTION!C u,union /union names/;" extras:pseudo
!_TAG_KIND_DESCRIPTION!C v,variable /variable definitions/;" extras:pseudo
!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/;" extras:pseudo
!_TAG_OUTPUT_FILESEP slash /slash or backslash/;" extras:pseudo
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/;" extras:pseudo
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/;" extras:pseudo
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //;" extras:pseudo
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/;" extras:pseudo
!_TAG_PROGRAM_URL https://ctags.io/ /official site/;" extras:pseudo
!_TAG_ROLE_DESCRIPTION!C!header local /local header/;" extras:pseudo
!_TAG_ROLE_DESCRIPTION!C!header system /system header/;" extras:pseudo
!_TAG_ROLE_DESCRIPTION!C!macro undef /undefined/;" extras:pseudo
main input.c /^int main (void) { return 0; }$/
4 changes: 4 additions & 0 deletions Tmain/input-encoding-option.d/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ BUILDDIR=$2
if ${CTAGS} --quiet --options=NONE --list-features | grep -q iconv; then
if ${CTAGS} --quiet --options=NONE \
--pseudo-tags=-TAG_PROC_CWD \
--pseudo-tags=-TAG_KIND_DESCRIPTION \
--pseudo-tags=-TAG_EXTRA_DESCRIPTION \
--pseudo-tags=-TAG_FIELD_DESCRIPTION \
--pseudo-tags=-TAG_ROLE_DESCRIPTION \
--input-encoding=utf-8 --input-encoding-java=shift_jis --input-encoding-javascript=euc-jp \
-o ${BUILDDIR}/tags \
input.js input.java ; then
Expand Down
78 changes: 78 additions & 0 deletions Tmain/json-output-format.d/stdout-expected.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,90 @@
{"_type": "tag", "name": "main", "path": "input.go", "pattern": "/^package main$/", "language": "Go", "line": 1, "kind": "package", "roles": "def"}
# json --languages=+man --fields=*-T --extras=*
{"_type": "ptag", "name": "JSON_OUTPUT_VERSION", "path": "0.0", "pattern": "in development"}
{"_type": "ptag", "name": "TAG_EXTRA_DESCRIPTION", "path": "anonymous", "pattern": "Include tags for non-named objects like lambda"}
{"_type": "ptag", "name": "TAG_EXTRA_DESCRIPTION", "path": "fileScope", "pattern": "Include tags of file scope"}
{"_type": "ptag", "name": "TAG_EXTRA_DESCRIPTION", "path": "guest", "pattern": "Include tags generated by guest parsers"}
{"_type": "ptag", "name": "TAG_EXTRA_DESCRIPTION", "path": "inputFile", "pattern": "Include an entry for the base file name of every input file"}
{"_type": "ptag", "name": "TAG_EXTRA_DESCRIPTION", "path": "pseudo", "pattern": "Include pseudo tags"}
{"_type": "ptag", "name": "TAG_EXTRA_DESCRIPTION", "path": "qualified", "pattern": "Include an extra class-qualified tag entry for each tag"}
{"_type": "ptag", "name": "TAG_EXTRA_DESCRIPTION", "path": "reference", "pattern": "Include reference tags"}
{"_type": "ptag", "name": "TAG_EXTRA_DESCRIPTION", "path": "subparser", "pattern": "Include tags generated by subparsers"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "parserName": "Go", "path": "package", "pattern": "the real package specified by the package name"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "parserName": "Go", "path": "packageName", "pattern": "the name for referring the package"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "parserName": "Python", "path": "nameref", "pattern": "the original name for the tag"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "access", "pattern": "Access (or export) of class members"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "compact", "pattern": "compact input line (used only in xref output)"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "end", "pattern": "end lines of various items"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "extras", "pattern": "Extra tag type information"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "file", "pattern": "File-restricted scoping"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "implementation", "pattern": "Implementation information"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "inherits", "pattern": "Inheritance information"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "input", "pattern": "input file"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "kind", "pattern": "[tags output] prepend \"kind:\" to k\\/ (or K\\/) field output, [xref and json output] kind in long-name form"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "language", "pattern": "Language of input file containing tag"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "line", "pattern": "Line number of tag definition"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "name", "pattern": "tag name"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "pattern", "pattern": "pattern"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "roles", "pattern": "Roles"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "scope", "pattern": "[tags output] prepend \"scope:\" key to s\\/scope field output, [xref and json output] the same as s\\/ field"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "scopeKind", "pattern": "[tags output] no effect, [xref and json output] kind of scope in long-name form"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "signature", "pattern": "Signature of routine (e.g. prototype or parameter list)"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "typeref", "pattern": "Type and name of a variable or typedef"}
{"_type": "ptag", "name": "TAG_FIELD_DESCRIPTION", "path": "xpath", "pattern": "xpath for the tag"}
{"_type": "ptag", "name": "TAG_FILE_SORTED", "path": "1", "pattern": "0=unsorted, 1=sorted, 2=foldcase"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "C", "path": "d,macro", "pattern": "macro definitions"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "C", "path": "e,enumerator", "pattern": "enumerators (values inside an enumeration)"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "C", "path": "f,function", "pattern": "function definitions"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "C", "path": "g,enum", "pattern": "enumeration names"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "C", "path": "h,header", "pattern": "included header files"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "C", "path": "m,member", "pattern": "struct, and union members"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "C", "path": "s,struct", "pattern": "structure names"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "C", "path": "t,typedef", "pattern": "typedefs"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "C", "path": "u,union", "pattern": "union names"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "C", "path": "v,variable", "pattern": "variable definitions"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "M,anonMember", "pattern": "struct anonymous members"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "P,packageName", "pattern": "name for specifying imported package"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "a,talias", "pattern": "type aliases"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "c,const", "pattern": "constants"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "f,func", "pattern": "functions"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "i,interface", "pattern": "interfaces"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "m,member", "pattern": "struct members"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "n,methodSpec", "pattern": "interface method specification"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "p,package", "pattern": "packages"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "s,struct", "pattern": "structs"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "t,type", "pattern": "types"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "u,unknown", "pattern": "unknown"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Go", "path": "v,var", "pattern": "variables"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Man", "path": "s,section", "pattern": "sections"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Man", "path": "t,title", "pattern": "titles"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Python", "path": "I,namespace", "pattern": "name referring a module defined in other file"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Python", "path": "c,class", "pattern": "classes"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Python", "path": "f,function", "pattern": "functions"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Python", "path": "i,module", "pattern": "modules"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Python", "path": "m,member", "pattern": "class members"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Python", "path": "v,variable", "pattern": "variables"}
{"_type": "ptag", "name": "TAG_KIND_DESCRIPTION", "parserName": "Python", "path": "x,unknown", "pattern": "name referring a class\\/variable\\/function\\/module defined in other module"}
{"_type": "ptag", "name": "TAG_OUTPUT_EXCMD", "path": "mixed", "pattern": "number, pattern, mixed, or combineV2"}
{"_type": "ptag", "name": "TAG_PATTERN_LENGTH_LIMIT", "path": "96", "pattern": "0 for no limit"}
{"_type": "ptag", "name": "TAG_PROGRAM_AUTHOR", "path": "Universal Ctags Team", "pattern": ""}
{"_type": "ptag", "name": "TAG_PROGRAM_NAME", "path": "Universal Ctags", "pattern": "Derived from Exuberant Ctags"}
{"_type": "ptag", "name": "TAG_PROGRAM_URL", "path": "https://ctags.io/", "pattern": "official site"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "C!header", "path": "local", "pattern": "local header"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "C!header", "path": "system", "pattern": "system header"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "C!macro", "path": "undef", "pattern": "undefined"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Go!package", "path": "imported", "pattern": "imported package"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Go!unknown", "path": "receiverType", "pattern": "receiver type"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!class", "path": "imported", "pattern": "imported module\\/imported from the other module"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!class", "path": "indirectlyImported", "pattern": "classes\\/variables\\/functions\\/modules imported in alternative name"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!function", "path": "imported", "pattern": "imported module\\/imported from the other module"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!function", "path": "indirectlyImported", "pattern": "classes\\/variables\\/functions\\/modules imported in alternative name"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!module", "path": "imported", "pattern": "imported module\\/imported from the other module"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!module", "path": "indirectlyImported", "pattern": "classes\\/variables\\/functions\\/modules imported in alternative name"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!module", "path": "namespace", "pattern": "namespace from where classes\\/variables\\/functions are imported"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!unknown", "path": "imported", "pattern": "imported module\\/imported from the other module"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!unknown", "path": "indirectlyImported", "pattern": "classes\\/variables\\/functions\\/modules imported in alternative name"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!variable", "path": "imported", "pattern": "imported module\\/imported from the other module"}
{"_type": "ptag", "name": "TAG_ROLE_DESCRIPTION", "parserName": "Python!variable", "path": "indirectlyImported", "pattern": "classes\\/variables\\/functions\\/modules imported in alternative name"}
{"_type": "tag", "name": "Foo", "path": "input.py", "pattern": "/^class Foo:$/", "access": "public", "inherits": false, "language": "Python", "line": 1, "kind": "class", "roles": "def", "end": 3}
{"_type": "tag", "name": "Foo.doIt", "path": "input.py", "pattern": "/^ def doIt():$/", "access": "public", "language": "Python", "line": 2, "signature": "()", "kind": "member", "roles": "def", "scope": "Foo", "extras": "qualified", "scopeKind": "class", "end": 3}
{"_type": "tag", "name": "N\tA\tM\tE", "path": "input.1", "pattern": "/^.SH \"\tN\tA\tM\tE\t\"$/", "language": "Man", "line": 1, "kind": "section", "roles": "def"}
Expand Down
8 changes: 4 additions & 4 deletions Tmain/list-pseudo-tags.d/stdout-expected.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#NAME ENABLED DESCRIPTION
JSON_OUTPUT_VERSION off the version of json output stream format
TAG_EXTRA_DESCRIPTION off the names and descriptions of enabled extras
TAG_FIELD_DESCRIPTION off the names and descriptions of enabled fields
TAG_EXTRA_DESCRIPTION on the names and descriptions of enabled extras
TAG_FIELD_DESCRIPTION on the names and descriptions of enabled fields
TAG_FILE_FORMAT on the version of tags file format
TAG_FILE_SORTED on how tags are sorted
TAG_KIND_DESCRIPTION off the letters, names and descriptions of enabled kinds in the language
TAG_KIND_DESCRIPTION on the letters, names and descriptions of enabled kinds in the language
TAG_KIND_SEPARATOR off the separators used in kinds
TAG_OUTPUT_EXCMD on the excmd: number, pattern, mixed, or combine
TAG_OUTPUT_FILESEP on the separator used in file name (slash or backslash)
Expand All @@ -15,4 +15,4 @@ TAG_PROGRAM_AUTHOR on the author of this ctags implementation
TAG_PROGRAM_NAME on the name of this ctags implementation
TAG_PROGRAM_URL on the official site URL of this ctags implementation
TAG_PROGRAM_VERSION on the version of this ctags implementation
TAG_ROLE_DESCRIPTION off the names and descriptions of enabled roles
TAG_ROLE_DESCRIPTION on the names and descriptions of enabled roles
Loading