From 63afe03e5aaa8208afa34b369089ef5922986522 Mon Sep 17 00:00:00 2001 From: Dustin Spicuzza Date: Sun, 24 Jan 2021 01:11:13 -0500 Subject: [PATCH 1/2] Emit correct types when 'typename' is present --- CppHeaderParser/CppHeaderParser.py | 12 +++++++++++- test/test_CppHeaderParser.py | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CppHeaderParser/CppHeaderParser.py b/CppHeaderParser/CppHeaderParser.py index 007d78a..1204846 100644 --- a/CppHeaderParser/CppHeaderParser.py +++ b/CppHeaderParser/CppHeaderParser.py @@ -280,6 +280,10 @@ def _split_namespace(namestack): :rtype: Tuple[str, list] """ # TODO: this should be using tokens instead of nhack + typename = None + if namestack and namestack[0] == "typename": + typename = namestack[0] + namestack = namestack[1:] last_colon = None for i, n in enumerate(namestack): @@ -296,6 +300,9 @@ def _split_namespace(namestack): else: ns = "" + if typename: + namestack = [typename] + namestack + return ns, namestack @@ -3348,7 +3355,10 @@ def _evaluate_stack(self, token=None): else: atype["namespace"] = ns - atype["raw_type"] = ns + atype["type"] + if atype["type"].startswith("typename "): + atype["raw_type"] = "typename " + ns + atype["type"][9:] + else: + atype["raw_type"] = ns + atype["type"] if self.curClass: klass = self.classes[self.curClass] diff --git a/test/test_CppHeaderParser.py b/test/test_CppHeaderParser.py index 9656437..91f9d74 100644 --- a/test/test_CppHeaderParser.py +++ b/test/test_CppHeaderParser.py @@ -4010,5 +4010,25 @@ def test_fn(self): self.assertEqual(False, c["methods"]["public"][1]["template"]) +class UsingTypename(unittest.TestCase): + def setUp(self): + self.cppHeader = CppHeaderParser.CppHeader( + """ +template class P { +public: + using State = typename f::TP::S; +}; +""", + "string", + ) + + def test_fn(self): + c = self.cppHeader.classes["P"] + self.assertEqual("P", c["name"]) + state = c["using"]["State"] + self.assertEqual(state["raw_type"], "typename f::TP::") + self.assertEqual(state["type"], "typename TP::") + + if __name__ == "__main__": unittest.main() From 0bac48227d208cab04105893c9594c7463bf67a5 Mon Sep 17 00:00:00 2001 From: Dustin Spicuzza Date: Sun, 24 Jan 2021 02:06:52 -0500 Subject: [PATCH 2/2] Fix 'using' typealiases that end with ::N --- CppHeaderParser/CppHeaderParser.py | 6 +++++- test/test_CppHeaderParser.py | 12 ++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CppHeaderParser/CppHeaderParser.py b/CppHeaderParser/CppHeaderParser.py index 1204846..a369308 100644 --- a/CppHeaderParser/CppHeaderParser.py +++ b/CppHeaderParser/CppHeaderParser.py @@ -1276,7 +1276,11 @@ def __init__(self, nameStack, doxygen, location, **kwargs): # backwards compat; deprecate camelCase in dicts self["defaultValue"] = default - elif is_fundamental(nameStack[-1]) or nameStack[-1] in [">", "<", ":", "."]: + elif ( + is_fundamental(nameStack[-1]) + or nameStack[-1] in [">", "<", ":", "."] + or (len(nameStack) > 2 and nameStack[-2] == "::") + ): # Un named parameter self["type"] = " ".join(nameStack) self["name"] = "" diff --git a/test/test_CppHeaderParser.py b/test/test_CppHeaderParser.py index 91f9d74..fedacc0 100644 --- a/test/test_CppHeaderParser.py +++ b/test/test_CppHeaderParser.py @@ -4017,6 +4017,7 @@ def setUp(self): template class P { public: using State = typename f::TP::S; + P(State st); }; """, "string", @@ -4026,8 +4027,15 @@ def test_fn(self): c = self.cppHeader.classes["P"] self.assertEqual("P", c["name"]) state = c["using"]["State"] - self.assertEqual(state["raw_type"], "typename f::TP::") - self.assertEqual(state["type"], "typename TP::") + self.assertEqual(state["raw_type"], "typename f::TP::S") + self.assertEqual(state["type"], "typename TP::S") + + m = c["methods"]["public"][0] + self.assertEqual(m["name"], "P") + self.assertEqual(m["parameters"][0]["namespace"], "f::") + self.assertEqual(m["parameters"][0]["name"], "st") + self.assertEqual(m["parameters"][0]["raw_type"], "typename f::TP::S") + self.assertEqual(m["parameters"][0]["type"], "typename TP::S") if __name__ == "__main__": 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