From f89e4e7dd02d6bd55b585d03bf4a1c2e0df658ac Mon Sep 17 00:00:00 2001 From: Hamdi Sahloul Date: Sun, 26 Aug 2018 18:38:07 +0900 Subject: [PATCH] Support parsing C++11 `enum struct` and `enum class` --- modules/java/generator/gen_java.py | 4 ++++ modules/python/src2/gen2.py | 5 +++++ modules/python/src2/hdr_parser.py | 16 +++++++--------- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/modules/java/generator/gen_java.py b/modules/java/generator/gen_java.py index 5de9b5df13..c17e1b38ad 100755 --- a/modules/java/generator/gen_java.py +++ b/modules/java/generator/gen_java.py @@ -425,6 +425,10 @@ class JavaWrapperGenerator(object): def add_enum(self, decl): # [ "enum cname", "", [], [] ] enumname = decl[0].replace("enum ", "").strip() self.enum_types.append(enumname) + const_decls = decl[3] + + for decl in const_decls: + self.add_const(decl) def add_func(self, decl): fi = FuncInfo(decl, namespaces=self.namespaces) diff --git a/modules/python/src2/gen2.py b/modules/python/src2/gen2.py index 497fe8e11b..c717ad7601 100755 --- a/modules/python/src2/gen2.py +++ b/modules/python/src2/gen2.py @@ -916,6 +916,11 @@ class PythonWrapperGenerator(object): def add_enum(self, name, decl): enumname = normalize_class_name(name) self.enum_types.append(enumname) + const_decls = decl[3] + + for decl in const_decls: + name = decl[0] + self.add_const(name.replace("const ", "").strip(), decl) def add_func(self, decl): namespace, classes, barename = self.split_decl_name(decl[0]) diff --git a/modules/python/src2/hdr_parser.py b/modules/python/src2/hdr_parser.py index 9fdde15ba1..f5364fc46a 100755 --- a/modules/python/src2/hdr_parser.py +++ b/modules/python/src2/hdr_parser.py @@ -634,8 +634,8 @@ class CppHeaderParser(object): block_type, block_name = b[self.BLOCK_TYPE], b[self.BLOCK_NAME] if block_type in ["file", "enum"]: continue - if block_type not in ["struct", "class", "namespace"]: - print("Error at %d: there are non-valid entries in the current block stack " % (self.lineno, self.block_stack)) + if block_type not in ["struct", "class", "namespace", "enum struct", "enum class"]: + print("Error at %d: there are non-valid entries in the current block stack %s" % (self.lineno, self.block_stack)) sys.exit(-1) if block_name and (block_type == "namespace" or not qualified_name): n += block_name + "." @@ -712,7 +712,7 @@ class CppHeaderParser(object): return stmt_type, classname, True, decl if stmt.startswith("enum") or stmt.startswith("namespace"): - stmt_list = stmt.split() + stmt_list = stmt.rsplit(" ", 1) if len(stmt_list) < 2: stmt_list.append("") return stmt_list[0], stmt_list[1], True, None @@ -720,10 +720,10 @@ class CppHeaderParser(object): if stmt.startswith("extern") and "\"C\"" in stmt: return "namespace", "", True, None - if end_token == "}" and context == "enum": + if end_token == "}" and context.startswith("enum"): decl = self.parse_enum(stmt) name = stack_top[self.BLOCK_NAME] - return "enum", name, False, decl + return context, name, False, decl if end_token == ";" and stmt.startswith("typedef"): # TODO: handle typedef's more intelligently @@ -900,10 +900,8 @@ class CppHeaderParser(object): docstring = docstring.strip() stmt_type, name, parse_flag, decl = self.parse_stmt(stmt, token, docstring=docstring) if decl: - if stmt_type == "enum": - if name != "": - decls.append(["enum " + self.get_dotted_name(name), "", [], [], None, ""]) - decls.extend(decl) + if stmt_type.startswith("enum"): + decls.append([stmt_type + " " + self.get_dotted_name(name), "", [], decl, None, ""]) else: decls.append(decl)