[glibmm/gmmproc-refactor] Generate longer names for enum values.



commit c78fac67dd82ea589234d2dffb2dbdbc7455c7b1
Author: Krzesimir Nowak <qdlacz gmail com>
Date:   Sun Jul 22 16:28:30 2012 +0200

    Generate longer names for enum values.
    
    Because of enum breaking the scoping rule, its values has to be unique
    in outer scope. So, for now we can't use names from gir files - we
    have to use full names without global prefix. There is an option to
    use new style enums, that is - enum classes from C++11, which we might
    want to use in future. In new style enums, we can just use names from
    gir without fear of multiple definitions of the same name.

 tools/pm/Common/Output/Enum.pm   |   24 +++++++-------
 tools/pm/Common/Output/GError.pm |   24 +++++++-------
 tools/pm/Common/WrapParser.pm    |   62 +++++++++++++++++++++++++++++++------
 3 files changed, 76 insertions(+), 34 deletions(-)
---
diff --git a/tools/pm/Common/Output/Enum.pm b/tools/pm/Common/Output/Enum.pm
index e5428d1..87d0ada 100644
--- a/tools/pm/Common/Output/Enum.pm
+++ b/tools/pm/Common/Output/Enum.pm
@@ -28,13 +28,13 @@ sub nl
   return Common::Output::Shared::nl @_;
 }
 
-sub _output_enum ($$$)
+sub _output_enum
 {
-  my ($wrap_parser, $cxx_type, $members) = @_;
+  my ($wrap_parser, $cxx_type, $members, $new_style) = @_;
   my $section_manager = $wrap_parser->get_section_manager;
   my $main_section = $wrap_parser->get_main_section;
   my $string_members = Common::Output::Shared::convert_members_to_strings $members;
-  my $code_string = nl ('enum ' . $cxx_type) .
+  my $code_string = nl ('enum ' . ($new_style ? 'class ' : '') . $cxx_type) .
                     nl ('{') .
                     nl (join ((nl ','), @{$string_members})) .
                     nl ('};') .
@@ -43,7 +43,7 @@ sub _output_enum ($$$)
   $section_manager->append_string_to_section ($code_string, $main_section);
 }
 
-sub _output_flag_ops ($$$)
+sub _output_flag_ops
 {
   my ($wrap_parser, $cxx_type, $flags) = @_;
 
@@ -87,7 +87,7 @@ sub _output_flag_ops ($$$)
   }
 }
 
-sub _output_gtype_func_h ($$$$)
+sub _output_gtype_func_h
 {
   my ($wrap_parser, $cxx_type, $flags, $get_type_func) = @_;
   my $type = undef;
@@ -104,21 +104,21 @@ sub _output_gtype_func_h ($$$$)
   Common::Output::Shared::output_enum_gtype_func_h $wrap_parser, $cxx_type, $type, $get_type_func;
 }
 
-sub _output_gtype_func_cc ($$$)
+sub _output_gtype_func_cc
 {
   my ($wrap_parser, $cxx_type, $get_type_func) = @_;
 
   Common::Output::Shared::output_enum_gtype_func_cc $wrap_parser, $cxx_type, $get_type_func;
 }
 
-sub output ($$$$$)
+sub output
 {
-  my ($wrap_parser, $cxx_type, $members, $flags, $get_type_func) = @_;
+  my ($wrap_parser, $cxx_type, $members, $flags, $get_type_func, $new_style) = @_;
 
-  _output_enum $wrap_parser, $cxx_type, $members;
-  _output_flag_ops $wrap_parser, $cxx_type, $flags;
-  _output_gtype_func_h $wrap_parser, $cxx_type, $flags, $get_type_func;
-  _output_gtype_func_cc $wrap_parser, $cxx_type, $get_type_func;
+  _output_enum ($wrap_parser, $cxx_type, $members, $new_style);
+  _output_flag_ops ($wrap_parser, $cxx_type, $flags);
+  _output_gtype_func_h ($wrap_parser, $cxx_type, $flags, $get_type_func);
+  _output_gtype_func_cc ($wrap_parser, $cxx_type, $get_type_func);
 }
 
 1; # indicate proper module load.
diff --git a/tools/pm/Common/Output/GError.pm b/tools/pm/Common/Output/GError.pm
index d3ca2b9..0e1d17d 100644
--- a/tools/pm/Common/Output/GError.pm
+++ b/tools/pm/Common/Output/GError.pm
@@ -28,9 +28,9 @@ sub nl
   return Common::Output::Shared::nl @_;
 }
 
-sub _output_gerror ($$$)
+sub _output_gerror
 {
-  my ($wrap_parser, $cxx_type, $members) = @_;
+  my ($wrap_parser, $cxx_type, $members, $new_style) = @_;
   my $string_members = Common::Output::Shared::convert_members_to_strings ($members);
   my $section_manager = $wrap_parser->get_section_manager;
   my $namespaces = $wrap_parser->get_namespaces;
@@ -44,7 +44,7 @@ sub _output_gerror ($$$)
   my $code_string = nl ('class ' . $cxx_type . ' : public Glib::Error') .
                     nl ('{') .
                     nl ('public:') .
-                    nl ('  enum Code') .
+                    nl ('  enum ' . ($new_style ? 'class ' : '') . 'Code') .
                     nl ('  {') .
                     nl (join nl (','), @{$string_members}) .
                     nl ('  };') .
@@ -66,14 +66,14 @@ sub _output_gerror ($$$)
   $section_manager->append_string_to_section ($code_string, $wrap_parser->get_main_section);
 }
 
-sub _output_gerror_gtype_h ($$$)
+sub _output_gerror_gtype_h
 {
   my ($wrap_parser, $cxx_type, $get_type_func) = @_;
 
   Common::Output::Shared::output_enum_gtype_func_h $wrap_parser, $cxx_type, Common::Output::Shared::ENUM_TYPE, $get_type_func;
 }
 
-sub _output_gerror_impl ($$$)
+sub _output_gerror_impl
 {
   my ($wrap_parser, $cxx_type, $domain) = @_;
   my $container_cxx_type = Common::Output::Shared::get_full_cxx_type $wrap_parser;
@@ -107,21 +107,21 @@ sub _output_gerror_impl ($$$)
   $section_manager->append_string_to_section ($code_string, $section);
 }
 
-sub _output_gerror_gtype_cc ($$$)
+sub _output_gerror_gtype_cc
 {
   my ($wrap_parser, $cxx_type, $get_type_func) = @_;
 
   Common::Output::Shared::output_enum_gtype_func_cc ($wrap_parser, $cxx_type, $get_type_func);
 }
 
-sub output ($$$$$)
+sub output
 {
-  my ($wrap_parser, $cxx_type, $members, $domain, $get_type_func) = @_;
+  my ($wrap_parser, $cxx_type, $members, $domain, $get_type_func, $new_style) = @_;
 
-  _output_gerror $wrap_parser, $cxx_type, $members;
-  _output_gerror_gtype_h $wrap_parser, $cxx_type, $get_type_func;
-  _output_gerror_impl $wrap_parser, $cxx_type, $domain;
-  _output_gerror_gtype_cc $wrap_parser, $cxx_type, $get_type_func;
+  _output_gerror ($wrap_parser, $cxx_type, $members, $new_style);
+  _output_gerror_gtype_h ($wrap_parser, $cxx_type, $get_type_func);
+  _output_gerror_impl ($wrap_parser, $cxx_type, $domain);
+  _output_gerror_gtype_cc ($wrap_parser, $cxx_type, $get_type_func);
 }
 
 1; # indicate proper module load.
diff --git a/tools/pm/Common/WrapParser.pm b/tools/pm/Common/WrapParser.pm
index 6fc1b55..3fd62f1 100644
--- a/tools/pm/Common/WrapParser.pm
+++ b/tools/pm/Common/WrapParser.pm
@@ -228,17 +228,40 @@ sub _extract_bracketed_text ($)
   $self->fixed_error ('Hit eof when extracting bracketed text.');
 }
 
-sub _extract_members ($$)
+sub _extract_members
 {
-  my ($object, $substs) = @_;
+  my ($object, $substs, $new_style, $identifier_prefixes) = @_;
   my $member_count = $object->get_g_member_count;
   my @all_members = ();
 
   for (my $iter = 0; $iter < $member_count; ++$iter)
   {
     my $member = $object->get_g_member_by_index ($iter);
-    my $name = uc $member->get_a_name;
-    my $value = $member->get_a_value;
+    my $name = undef;
+
+    if ($new_style)
+    {
+      $name = uc ($member->get_a_name ());
+    }
+    else
+    {
+      # For old style enums we have to use full names without global
+      # prefix. Otherwise we can get some conflicts like for SURROGATE
+      # that is in both UnicodeType and UnicodeBreakType.
+      foreach my $prefix (@{$identifier_prefixes})
+      {
+        my $to_remove = $prefix . '_';
+
+        $name = $member->get_a_c_identifier ();
+        if ($name =~ /^$to_remove/)
+        {
+          $name =~ s/^$to_remove//;
+          last;
+        }
+      }
+    }
+
+    my $value = $member->get_a_value ();
 
     foreach my $pair (@{$substs})
     {
@@ -1299,11 +1322,13 @@ sub _on_wrap_enum ($)
   my $cxx_type = Common::Util::string_trim(shift @args);
   my $c_type = Common::Util::string_trim(shift @args);
   my @sed = ();
+  my $new_style = 0;
   my $setup =
   {
     'ob(NO_GTYPE)' => undef,
     'a(sed)' => \ sed,
     'os(get_type_func)' => undef,
+    'b(new_style)' => \$new_style
   };
 
   $self->_handle_get_args_results (Common::Shared::get_args \ args, $setup);
@@ -1335,10 +1360,16 @@ sub _on_wrap_enum ($)
     }
   }
 
+  my @identifier_prefixes = split (',', $namespace->get_a_c_identifier_prefixes ());
   my $gir_gtype = $enum->get_a_glib_get_type;
-  my $members = _extract_members $enum, \ substs;
+  my $members = _extract_members ($enum, \ substs, $new_style, \ identifier_prefixes);
 
-  Common::Output::Enum::output ($self, $cxx_type, $members, $flags, $gir_gtype);
+  Common::Output::Enum::output ($self,
+                                $cxx_type,
+                                $members,
+                                $flags,
+                                $gir_gtype,
+                                $new_style);
 }
 
 # TODO: move it outside handlers section
@@ -1377,6 +1408,7 @@ sub _on_wrap_gerror ($)
   my $cxx_type = Common::Util::string_trim (shift @args);
   my $c_type = Common::Util::string_trim (shift @args);
   my $enum = $namespace->get_g_enumeration_by_name ($c_type);
+  my @identifier_prefixes = split (',', $namespace->get_a_c_identifier_prefixes ());
 
   if (@args)
   {
@@ -1390,11 +1422,13 @@ sub _on_wrap_gerror ($)
   }
 
   my @sed = ();
+  my $new_style = 0;
   my $setup =
   {
     'ob(NO_GTYPE)' => undef,
     'a(sed)' => \ sed,
     'os(get_type_func)' => undef,
+    'b(new_style)' => \$new_style
   };
 
   $self->_handle_get_args_results (Common::Shared::get_args \ args, $setup);
@@ -1420,9 +1454,17 @@ sub _on_wrap_gerror ($)
 
   my $gir_gtype = $enum->get_a_glib_get_type;
   my $gir_domain = $enum->get_a_glib_error_domain;
-  my $members = _extract_members $enum, \ substs;
+  #my $members = _extract_members ($enum, \ substs, $new_style, \ identifier_prefixes);
+  # We are passing true for "new style" members - we are not afraid of name collisions
+  # in GError code enums. Also, it seems that the same was done in old gmmproc.
+  my $members = _extract_members ($enum, \ substs, 1, \ identifier_prefixes);
 
-  Common::Output::GError::output $self, $cxx_type, $members, $gir_domain, $gir_gtype;
+  Common::Output::GError::output ($self,
+                                  $cxx_type,
+                                  $members,
+                                  $gir_domain,
+                                  $gir_gtype,
+                                  $new_style);
 
   my $c_includes = _get_c_includes ($repository);
   my $cxx_includes = [join ('', '"', $self->get_base (), '.h"')];



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]