diff --git a/cxxheaderparser/parser.py b/cxxheaderparser/parser.py index 0be63e4..9a1e098 100644 --- a/cxxheaderparser/parser.py +++ b/cxxheaderparser/parser.py @@ -308,25 +308,34 @@ class CxxParser: ";": lambda _1, _2: None, } + _keep_doxygen = {"__declspec", "alignas", "__attribute__", "DBL_LBRACKET"} + tok = None get_token_eof_ok = self.lex.token_eof_ok get_doxygen = self.lex.get_doxygen + doxygen = None + try: while True: tok = get_token_eof_ok() if not tok: break - doxygen = get_doxygen() + if doxygen is None: + doxygen = get_doxygen() fn = _translation_unit_tokens.get(tok.type) if fn: fn(tok, doxygen) + + if tok.type not in _keep_doxygen: + doxygen = None else: # this processes ambiguous declarations self._parse_declarations(tok, doxygen) + doxygen = None except Exception as e: if self.verbose: diff --git a/tests/test_doxygen.py b/tests/test_doxygen.py index f82e615..88824b9 100644 --- a/tests/test_doxygen.py +++ b/tests/test_doxygen.py @@ -329,3 +329,50 @@ def test_doxygen_namespace() -> None: } ) ) + + +def test_doxygen_declspec() -> None: + content = """ + /// declspec comment + __declspec(thread) int i = 1; + """ + data = parse_string(content, cleandoc=True) + + assert data == ParsedData( + namespace=NamespaceScope( + variables=[ + Variable( + name=PQName(segments=[NameSpecifier(name="i")]), + type=Type( + typename=PQName(segments=[FundamentalSpecifier(name="int")]) + ), + value=Value(tokens=[Token(value="1")]), + doxygen="/// declspec comment", + ) + ] + ) + ) + + +def test_doxygen_attribute() -> None: + content = """ + /// hasattr comment + [[nodiscard]] + int hasattr(); + """ + data = parse_string(content, cleandoc=True) + + assert data == ParsedData( + namespace=NamespaceScope( + functions=[ + Function( + return_type=Type( + typename=PQName(segments=[FundamentalSpecifier(name="int")]) + ), + name=PQName(segments=[NameSpecifier(name="hasattr")]), + parameters=[], + doxygen="/// hasattr comment", + ) + ] + ) + )