diff --git a/gobject/glib-mkenums.in b/gobject/glib-mkenums.in index a44efed19..199868039 100755 --- a/gobject/glib-mkenums.in +++ b/gobject/glib-mkenums.in @@ -131,17 +131,18 @@ option_lowercase_name = '' # DEPRECATED. A lower case name to use as part # uses abnormal capitalization and we can not # guess where to put the underscores. option_since = '' # User provided version info for the enum. -seenbitshift = 0 # Have we seen bitshift operators? -enum_prefix = None # Prefix for this enumeration -enumname = '' # Name for this enumeration -enumshort = '' # $enumname without prefix -enumname_prefix = '' # prefix of $enumname -enumindex = 0 # Global enum counter -firstenum = 1 # Is this the first enumeration per file? -entries = [] # [ name, val ] for each entry -sandbox = None # sandbox for safe evaluation of expressions +seenbitshift = 0 # Have we seen bitshift operators? +seenprivate = False # Have we seen a private option? +enum_prefix = None # Prefix for this enumeration +enumname = '' # Name for this enumeration +enumshort = '' # $enumname without prefix +enumname_prefix = '' # prefix of $enumname +enumindex = 0 # Global enum counter +firstenum = 1 # Is this the first enumeration per file? +entries = [] # [ name, val ] for each entry +sandbox = None # sandbox for safe evaluation of expressions -output = '' # Filename to write result into +output = '' # Filename to write result into def parse_trigraph(opts): result = {} @@ -161,7 +162,7 @@ def parse_trigraph(opts): return result def parse_entries(file, file_name): - global entries, enumindex, enumname, seenbitshift, flags + global entries, enumindex, enumname, seenbitshift, seenprivate, flags looking_for_name = False while True: @@ -239,16 +240,33 @@ def parse_entries(file, file_name): if flags is None and value is not None and '<<' in value: seenbitshift = 1 + if seenprivate: + continue + if options is not None: options = parse_trigraph(options) if 'skip' not in options: entries.append((name, value, options.get('nick'))) else: entries.append((name, value)) - elif re.match(r's*\#', line): - pass else: - print_warning('Failed to parse "{}" in {}'.format(line, file_name)) + m = re.match(r'''\s* + /\*< (([^*]|\*(?!/))*) >\s*\*/ + \s*$''', line, flags=re.X) + if m: + options = m.groups()[0] + if options is not None: + options = parse_trigraph(options) + if 'private' in options: + seenprivate = True + continue + if 'public' in options: + seenprivate = False + continue + if re.match(r's*\#', line): + pass + else: + print_warning('Failed to parse "{}" in {}'.format(line, file_name)) return False help_epilog = '''Production text substitutions: @@ -464,7 +482,7 @@ if len(fhead) > 0: write_output(prod) def process_file(curfilename): - global entries, flags, seenbitshift, enum_prefix + global entries, flags, seenbitshift, seenprivate, enum_prefix firstenum = True try: @@ -542,6 +560,7 @@ def process_file(curfilename): break seenbitshift = 0 + seenprivate = False entries = [] # Now parse the entries diff --git a/gobject/tests/mkenums.py b/gobject/tests/mkenums.py index abde43deb..876089d4f 100644 --- a/gobject/tests/mkenums.py +++ b/gobject/tests/mkenums.py @@ -595,6 +595,61 @@ comment: {standard_bottom_comment} "0", ) + def test_enum_private_public(self): + """Test private/public enums. Bug #782162.""" + h_contents1 = """ + typedef enum { + ENUM_VALUE_PUBLIC1, + /*< private >*/ + ENUM_VALUE_PRIVATE, + } SomeEnumA + """ + + h_contents2 = """ + typedef enum { + /*< private >*/ + ENUM_VALUE_PRIVATE, + /*< public >*/ + ENUM_VALUE_PUBLIC2, + } SomeEnumB; + """ + + result = self.runMkenumsWithHeader(h_contents1) + self.maxDiff = None + self.assertEqual("", result.err) + self.assertSingleEnum( + result, + "SomeEnumA", + "some_enum_a", + "SOME_ENUM_A", + "ENUM_A", + "SOME", + "", + "enum", + "Enum", + "ENUM", + "ENUM_VALUE_PUBLIC1", + "public1", + "0", + ) + result = self.runMkenumsWithHeader(h_contents2) + self.assertEqual("", result.err) + self.assertSingleEnum( + result, + "SomeEnumB", + "some_enum_b", + "SOME_ENUM_B", + "ENUM_B", + "SOME", + "", + "enum", + "Enum", + "ENUM", + "ENUM_VALUE_PUBLIC2", + "public2", + "0", + ) + class TestRspMkenums(TestMkenums): """Run all tests again in @rspfile mode"""