Skip to content

Commit 0abc804

Browse files
committed
Add support for initialization with {}
int double {0}; int double {(1.2+3.2)};
1 parent 4051ba7 commit 0abc804

File tree

2 files changed

+75
-5
lines changed

2 files changed

+75
-5
lines changed

CppHeaderParser/CppHeaderParser.py

+39-5
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ def trace_print(*args):
141141
_BRACE_REASON_OTHER = 0
142142
_BRACE_REASON_NS = 1
143143
_BRACE_REASON_EXTERN = 2
144+
_BRACE_REASON_VARIABLE = 3
144145

145146
# Track what was added in what order and at what depth
146147
parseHistory = []
@@ -239,10 +240,13 @@ def is_property_namestack(nameStack):
239240
r = False
240241
if "(" not in nameStack and ")" not in nameStack:
241242
r = True
242-
elif (
243-
"(" in nameStack
244-
and "=" in nameStack
245-
and nameStack.index("=") < nameStack.index("(")
243+
elif "(" in nameStack and (
244+
( # = initialization
245+
"=" in nameStack and nameStack.index("=") < nameStack.index("(")
246+
)
247+
or ( # {} initialization
248+
"{" in nameStack and nameStack.index("{") < nameStack.index("(")
249+
)
246250
):
247251
r = True
248252
# See if we are a function pointer
@@ -1226,6 +1230,16 @@ def __init__(self, nameStack, doxygen, location, is_var=True, **kwargs):
12261230
self["default"] = default
12271231
# backwards compat; deprecate camelCase in dicts
12281232
self["defaultValue"] = default
1233+
elif "{" in nameStack and "}" in nameStack:
1234+
posBracket = nameStack.index("{")
1235+
self["type"] = " ".join(nameStack[: posBracket - 1])
1236+
self["name"] = nameStack[posBracket - 1]
1237+
default = " ".join(nameStack[posBracket + 1 : -1])
1238+
nameStack = nameStack[:posBracket]
1239+
default = self._filter_name(default)
1240+
self["default"] = default
1241+
# backwards compat; deprecate camelCase in dicts
1242+
self["defaultValue"] = default
12291243

12301244
_stack_ = nameStack
12311245
self["array"] = 0
@@ -2931,7 +2945,23 @@ def __init__(
29312945
continue
29322946

29332947
if parenDepth == 0 and tok.type == "{":
2934-
self.lastBraceReason = _BRACE_REASON_OTHER
2948+
if self.nameStack[0] in (
2949+
"class",
2950+
"struct",
2951+
"union",
2952+
"namespace",
2953+
"enum",
2954+
"extern",
2955+
"typedef",
2956+
) or (is_method_namestack(self.stack) or (not self.curClass)):
2957+
self.lastBraceReason = _BRACE_REASON_OTHER
2958+
else:
2959+
# Case : type variable {init};
2960+
self.lastBraceReason = _BRACE_REASON_VARIABLE
2961+
self.braceDepth += 1
2962+
self.braceReason.append(self.lastBraceReason)
2963+
self.nameStack.append(tok.value)
2964+
continue
29352965
if len(self.nameStack) >= 2 and is_namespace(
29362966
self.nameStack
29372967
): # namespace {} with no name used in boost, this sets default?
@@ -2991,6 +3021,10 @@ def __init__(
29913021
self.linkage_stack.pop()
29923022
self.stack = [] # clear stack when linkage ends?
29933023
self.stmtTokens = []
3024+
# Case : type variable {init};
3025+
elif reason == _BRACE_REASON_VARIABLE:
3026+
self.nameStack.append(tok.value)
3027+
continue
29943028
else:
29953029
self._evaluate_stack()
29963030
self.braceDepth -= 1

test/test_CppHeaderParser.py

+36
Original file line numberDiff line numberDiff line change
@@ -4267,5 +4267,41 @@ def test_member(self):
42674267
)
42684268

42694269

4270+
class InitBracket_TestCase(unittest.TestCase):
4271+
def setUp(self):
4272+
self.cppHeader = CppHeaderParser.CppHeader(
4273+
"""
4274+
class InitBracket {
4275+
public:
4276+
int variable{10};
4277+
std::shared_ptr<int> variable2 {std::make_shared<int>(150)};
4278+
};
4279+
""",
4280+
"string",
4281+
)
4282+
4283+
def test_member(self):
4284+
self.assertEqual(
4285+
self.cppHeader.classes["InitBracket"]["properties"]["public"][0]["name"],
4286+
"variable",
4287+
)
4288+
self.assertEqual(
4289+
self.cppHeader.classes["InitBracket"]["properties"]["public"][0][
4290+
"defaultValue"
4291+
],
4292+
"10",
4293+
)
4294+
self.assertEqual(
4295+
self.cppHeader.classes["InitBracket"]["properties"]["public"][1]["name"],
4296+
"variable2",
4297+
)
4298+
self.assertEqual(
4299+
self.cppHeader.classes["InitBracket"]["properties"]["public"][0][
4300+
"defaultValue"
4301+
],
4302+
"std::make_shared<int> ( 150 )",
4303+
)
4304+
4305+
42704306
if __name__ == "__main__":
42714307
unittest.main()

0 commit comments

Comments
 (0)