Skip to content

Commit 0e011f8

Browse files
authored
Merge pull request #62 from robotpy/typename
Various fixes for 'using'
2 parents 849cf50 + 0bac482 commit 0e011f8

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

CppHeaderParser/CppHeaderParser.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,10 @@ def _split_namespace(namestack):
280280
:rtype: Tuple[str, list]
281281
"""
282282
# TODO: this should be using tokens instead of nhack
283+
typename = None
284+
if namestack and namestack[0] == "typename":
285+
typename = namestack[0]
286+
namestack = namestack[1:]
283287

284288
last_colon = None
285289
for i, n in enumerate(namestack):
@@ -296,6 +300,9 @@ def _split_namespace(namestack):
296300
else:
297301
ns = ""
298302

303+
if typename:
304+
namestack = [typename] + namestack
305+
299306
return ns, namestack
300307

301308

@@ -1269,7 +1276,11 @@ def __init__(self, nameStack, doxygen, location, **kwargs):
12691276
# backwards compat; deprecate camelCase in dicts
12701277
self["defaultValue"] = default
12711278

1272-
elif is_fundamental(nameStack[-1]) or nameStack[-1] in [">", "<", ":", "."]:
1279+
elif (
1280+
is_fundamental(nameStack[-1])
1281+
or nameStack[-1] in [">", "<", ":", "."]
1282+
or (len(nameStack) > 2 and nameStack[-2] == "::")
1283+
):
12731284
# Un named parameter
12741285
self["type"] = " ".join(nameStack)
12751286
self["name"] = ""
@@ -3348,7 +3359,10 @@ def _evaluate_stack(self, token=None):
33483359
else:
33493360
atype["namespace"] = ns
33503361

3351-
atype["raw_type"] = ns + atype["type"]
3362+
if atype["type"].startswith("typename "):
3363+
atype["raw_type"] = "typename " + ns + atype["type"][9:]
3364+
else:
3365+
atype["raw_type"] = ns + atype["type"]
33523366

33533367
if self.curClass:
33543368
klass = self.classes[self.curClass]

test/test_CppHeaderParser.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4010,5 +4010,33 @@ def test_fn(self):
40104010
self.assertEqual(False, c["methods"]["public"][1]["template"])
40114011

40124012

4013+
class UsingTypename(unittest.TestCase):
4014+
def setUp(self):
4015+
self.cppHeader = CppHeaderParser.CppHeader(
4016+
"""
4017+
template <class D> class P {
4018+
public:
4019+
using State = typename f::TP<D>::S;
4020+
P(State st);
4021+
};
4022+
""",
4023+
"string",
4024+
)
4025+
4026+
def test_fn(self):
4027+
c = self.cppHeader.classes["P"]
4028+
self.assertEqual("P", c["name"])
4029+
state = c["using"]["State"]
4030+
self.assertEqual(state["raw_type"], "typename f::TP<D >::S")
4031+
self.assertEqual(state["type"], "typename TP<D >::S")
4032+
4033+
m = c["methods"]["public"][0]
4034+
self.assertEqual(m["name"], "P")
4035+
self.assertEqual(m["parameters"][0]["namespace"], "f::")
4036+
self.assertEqual(m["parameters"][0]["name"], "st")
4037+
self.assertEqual(m["parameters"][0]["raw_type"], "typename f::TP<D >::S")
4038+
self.assertEqual(m["parameters"][0]["type"], "typename TP<D >::S")
4039+
4040+
40134041
if __name__ == "__main__":
40144042
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