Skip to content

Commit 4260f06

Browse files
committed
Handle doxygen comments for elements separated with a newline
1 parent d2dd075 commit 4260f06

File tree

3 files changed

+85
-12
lines changed

3 files changed

+85
-12
lines changed

CppHeaderParser/CppHeaderParser.py

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2127,7 +2127,7 @@ def _evaluate_method_stack(self):
21272127
info["name"],
21282128
info,
21292129
self.curTemplate,
2130-
self.lex.get_doxygen(),
2130+
self._get_stmt_doxygen(),
21312131
self._get_location(self.nameStack),
21322132
)
21332133
klass = self.classes[info["class"]]
@@ -2144,7 +2144,7 @@ def _evaluate_method_stack(self):
21442144
self.curClass,
21452145
info,
21462146
self.curTemplate,
2147-
self.lex.get_doxygen(),
2147+
self._get_stmt_doxygen(),
21482148
self._get_location(self.nameStack),
21492149
)
21502150
klass = self.classes[self.curClass]
@@ -2161,7 +2161,7 @@ def _evaluate_method_stack(self):
21612161
None,
21622162
info,
21632163
self.curTemplate,
2164-
self.lex.get_doxygen(),
2164+
self._get_stmt_doxygen(),
21652165
self._get_location(self.nameStack),
21662166
)
21672167
self.functions.append(newMethod)
@@ -2288,7 +2288,7 @@ def _evaluate_property_stack(self, clearStack=True, addToVar=None):
22882288

22892289
newVar = CppVariable(
22902290
self.nameStack,
2291-
self.lex.get_doxygen(),
2291+
self._get_stmt_doxygen(),
22922292
self._get_location(self.nameStack),
22932293
)
22942294
newVar["namespace"] = self.current_namespace()
@@ -2305,7 +2305,7 @@ def _evaluate_property_stack(self, clearStack=True, addToVar=None):
23052305
debug_print("Found Global variable")
23062306
newVar = CppVariable(
23072307
self.nameStack,
2308-
self.lex.get_doxygen(),
2308+
self._get_stmt_doxygen(),
23092309
self._get_location(self.nameStack),
23102310
)
23112311
if addToVar:
@@ -2345,7 +2345,7 @@ def _evaluate_class_stack(self):
23452345
if self.nameStack[0] == "union":
23462346
newClass = CppUnion(
23472347
self.nameStack,
2348-
self.lex.get_doxygen(),
2348+
self._get_stmt_doxygen(),
23492349
self._get_location(self.nameStack),
23502350
)
23512351
if newClass["name"] == "union ":
@@ -2357,7 +2357,7 @@ def _evaluate_class_stack(self):
23572357
newClass = CppClass(
23582358
self.nameStack,
23592359
self.curTemplate,
2360-
self.lex.get_doxygen(),
2360+
self._get_stmt_doxygen(),
23612361
self._get_location(self.nameStack),
23622362
)
23632363
trace_print("NEW CLASS", newClass["name"])
@@ -2631,6 +2631,7 @@ def __init__(self, headerFileName, argType="file", encoding=None, **kwargs):
26312631
# it's slowly getting there!), so take this with a grain of salt.
26322632
#
26332633

2634+
self._doxygen_cache = None
26342635
tok = None
26352636
try:
26362637
while True:
@@ -2648,6 +2649,7 @@ def __init__(self, headerFileName, argType="file", encoding=None, **kwargs):
26482649
if tok.value in self.IGNORE_NAMES:
26492650
continue
26502651
elif tok.value == "template":
2652+
self._doxygen_cache = self.lex.get_doxygen()
26512653
self._parse_template()
26522654
continue
26532655
elif tok.value == "alignas":
@@ -2666,6 +2668,7 @@ def __init__(self, headerFileName, argType="file", encoding=None, **kwargs):
26662668
continue
26672669

26682670
self.stack.append(tok.value)
2671+
nslen = len(self.nameStack)
26692672

26702673
if tok.type in ("PRECOMP_MACRO", "PRECOMP_MACRO_CONT"):
26712674
debug_print("PRECOMP: %s", tok)
@@ -2748,6 +2751,7 @@ def __init__(self, headerFileName, argType="file", encoding=None, **kwargs):
27482751

27492752
elif tok.type in _namestack_append_tokens:
27502753
self.nameStack.append(tok.value)
2754+
nameStackAppended = True
27512755
elif tok.type in _namestack_pass_tokens:
27522756
pass
27532757
elif tok.type in _namestack_str_tokens:
@@ -2797,6 +2801,11 @@ def __init__(self, headerFileName, argType="file", encoding=None, **kwargs):
27972801
self.stack = []
27982802
self.nameStack = []
27992803

2804+
newNsLen = len(self.nameStack)
2805+
if nslen != newNsLen and newNsLen == 1:
2806+
if not self.curTemplate:
2807+
self._doxygen_cache = self.lex.get_doxygen()
2808+
28002809
except Exception as e:
28012810
if debug:
28022811
raise
@@ -2829,6 +2838,7 @@ def __init__(self, headerFileName, argType="file", encoding=None, **kwargs):
28292838
# Delete some temporary variables
28302839
for key in [
28312840
"_precomp_macro_buf",
2841+
"_doxygen_cache",
28322842
"lex",
28332843
"nameStack",
28342844
"nameSpaces",
@@ -2856,6 +2866,14 @@ def _get_location(self, stack):
28562866

28572867
return self.lex.current_location()
28582868

2869+
def _get_stmt_doxygen(self):
2870+
# retrieves the doxygen comment associated with an accumulated
2871+
# statement (since doxygen comments have to be retrieved immediately)
2872+
doxygen, self._doxygen_cache = self._doxygen_cache, ""
2873+
if not doxygen:
2874+
doxygen = self.lex.get_doxygen()
2875+
return doxygen
2876+
28592877
def _parse_error(self, tokens, expected):
28602878
if not tokens:
28612879
# common case after a failed token_if
@@ -3003,13 +3021,13 @@ def _evaluate_stack(self, token=None):
30033021
alias = self.nameStack[1]
30043022
ns, stack = _split_namespace(self.nameStack[3:])
30053023
atype = CppVariable(
3006-
stack, self.lex.get_doxygen(), self._get_location(stack)
3024+
stack, self._get_stmt_doxygen(), self._get_location(stack)
30073025
)
30083026
else:
30093027
# using foo::bar
30103028
ns, stack = _split_namespace(self.nameStack[1:])
30113029
atype = CppVariable(
3012-
stack, self.lex.get_doxygen(), self._get_location(stack)
3030+
stack, self._get_stmt_doxygen(), self._get_location(stack)
30133031
)
30143032
alias = atype["type"]
30153033

@@ -3158,7 +3176,7 @@ def _parse_enum(self):
31583176
"""
31593177

31603178
# entry: enum token was just consumed
3161-
doxygen = self.lex.get_doxygen()
3179+
doxygen = self._get_stmt_doxygen()
31623180
location = self.lex.current_location()
31633181

31643182
nametok = self.lex.token()

CppHeaderParser/lexer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,8 @@ def get_doxygen(self):
147147
comments don't exist.
148148
"""
149149

150-
# assuption: only time you call this function is after a name
151-
# token is consumed along with all its pieces
150+
# Assumption: This function is either called at the beginning of a
151+
# statement or at the end of a statement
152152

153153
if self.comments:
154154
comments = self.comments

CppHeaderParser/test/test_CppHeaderParser.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3239,5 +3239,60 @@ def test_fn(self):
32393239
self.assertEqual("copy", fn["name"])
32403240

32413241

3242+
class MessedUpDoxygen_TestCase(unittest.TestCase):
3243+
def setUp(self):
3244+
self.cppHeader = CppHeaderParser.CppHeader(
3245+
"""
3246+
3247+
/// fn comment
3248+
void
3249+
fn();
3250+
3251+
/// var comment
3252+
int
3253+
v1 = 0;
3254+
3255+
int
3256+
v2 = 0; /// var2 comment
3257+
3258+
/// cls comment
3259+
class
3260+
C {};
3261+
3262+
/// template comment
3263+
template <typename T>
3264+
class
3265+
C2 {};
3266+
3267+
""",
3268+
"string",
3269+
)
3270+
3271+
def test_fn(self):
3272+
fn = self.cppHeader.functions[0]
3273+
self.assertEqual("fn", fn["name"])
3274+
self.assertEqual("/// fn comment", fn["doxygen"])
3275+
3276+
def test_var1(self):
3277+
v = self.cppHeader.variables[0]
3278+
self.assertEqual("v1", v["name"])
3279+
self.assertEqual("/// var comment", v["doxygen"])
3280+
3281+
def test_var2(self):
3282+
v = self.cppHeader.variables[1]
3283+
self.assertEqual("v2", v["name"])
3284+
self.assertEqual("/// var2 comment", v["doxygen"])
3285+
3286+
def test_cls(self):
3287+
c = self.cppHeader.classes["C"]
3288+
self.assertEqual("C", c["name"])
3289+
self.assertEqual("/// cls comment", c["doxygen"])
3290+
3291+
def test_cls2(self):
3292+
c = self.cppHeader.classes["C2"]
3293+
self.assertEqual("C2", c["name"])
3294+
self.assertEqual("/// template comment", c["doxygen"])
3295+
3296+
32423297
if __name__ == "__main__":
32433298
unittest.main()

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy