From 4674749d51b4c736695dc8d7b1ad7c60cb04dccf Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Sat, 18 May 2024 03:52:09 +0900 Subject: [PATCH] C++: record "export" in the property field if the keyword is put at a "using" declaration Signed-off-by: Masatake YAMATO --- Units/parser-cxx.r/export-using.d/args.ctags | 6 ++++++ Units/parser-cxx.r/export-using.d/expected.tags | 5 +++++ Units/parser-cxx.r/export-using.d/input.cpp | 7 +++++++ Units/parser-cxx.r/export-using.d/validator | 1 + parsers/cxx/cxx_parser_using.c | 13 +++++++++++++ 5 files changed, 32 insertions(+) create mode 100644 Units/parser-cxx.r/export-using.d/args.ctags create mode 100644 Units/parser-cxx.r/export-using.d/expected.tags create mode 100644 Units/parser-cxx.r/export-using.d/input.cpp create mode 100644 Units/parser-cxx.r/export-using.d/validator diff --git a/Units/parser-cxx.r/export-using.d/args.ctags b/Units/parser-cxx.r/export-using.d/args.ctags new file mode 100644 index 0000000000..8fea28e43e --- /dev/null +++ b/Units/parser-cxx.r/export-using.d/args.ctags @@ -0,0 +1,6 @@ +--sort=no +--fields=+K +--kinds-C++=+MtNp +--fields-C++=+{properties} +--extras=+r +--fields=+r diff --git a/Units/parser-cxx.r/export-using.d/expected.tags b/Units/parser-cxx.r/export-using.d/expected.tags new file mode 100644 index 0000000000..431ef8fa99 --- /dev/null +++ b/Units/parser-cxx.r/export-using.d/expected.tags @@ -0,0 +1,5 @@ +Delta input.cpp /^export module Delta;$/;" module roles:def properties:export +Param input.cpp /^export using Param = int;$/;" typedef typeref:typename:int file: roles:def properties:export +Param input.cpp /^export using ::Param;$/;" name file: roles:def properties:export +Param input.cpp /^export using ::Param; \/\/ We can declare an object more than twice.$/;" name file: roles:def properties:export +fn input.cpp /^export void fn();$/;" prototype typeref:typename:void file: roles:def properties:export diff --git a/Units/parser-cxx.r/export-using.d/input.cpp b/Units/parser-cxx.r/export-using.d/input.cpp new file mode 100644 index 0000000000..b5cccbc1d1 --- /dev/null +++ b/Units/parser-cxx.r/export-using.d/input.cpp @@ -0,0 +1,7 @@ +// Derived from https://github.com/universal-ctags/ctags/issues/4003 submitted by @adrianconstantin-leroy. +export module Delta; + +export using Param = int; +export using ::Param; +export using ::Param; // We can declare an object more than twice. +export void fn(); diff --git a/Units/parser-cxx.r/export-using.d/validator b/Units/parser-cxx.r/export-using.d/validator new file mode 100644 index 0000000000..4f72a995fe --- /dev/null +++ b/Units/parser-cxx.r/export-using.d/validator @@ -0,0 +1 @@ +cxx20+module diff --git a/parsers/cxx/cxx_parser_using.c b/parsers/cxx/cxx_parser_using.c index 4fa9dfdb0e..c9c337e0c5 100644 --- a/parsers/cxx/cxx_parser_using.c +++ b/parsers/cxx/cxx_parser_using.c @@ -24,6 +24,8 @@ bool cxxParserParseUsingClause(void) { CXX_DEBUG_ENTER(); + unsigned int uInitialKeywordState = g_cxx.uKeywordState; + // using-directives for namespaces and using-declarations // for namespace members // using-declarations for class members @@ -170,7 +172,18 @@ bool cxxParserParseUsingClause(void) { tag->isFileScope = (cxxScopeGetType() == CXXScopeTypeNamespace) && (!isInputHeaderFile()); + + unsigned int uProperties = 0; + if(uInitialKeywordState & CXXParserKeywordStateSeenExport) + uProperties |= CXXTagPropertyExport; + vString * pszProperties = NULL; + + if(uProperties) + pszProperties = cxxTagSetProperties(uProperties); + cxxTagCommit(NULL); + + vStringDelete (pszProperties); } } }