[scanner] Simplify strip_identifer/strip_symbol
authorJohan Dahlin <johan@gnome.org>
Thu, 2 Sep 2010 14:07:01 +0000 (11:07 -0300)
committerJohan Dahlin <johan@gnome.org>
Thu, 2 Sep 2010 15:37:54 +0000 (12:37 -0300)
The strip_* functions are problematic since they
have a fatal switch which determines if the message should
kill the scanner. Change the api to make it easier to extend
with other logging categories and move over the callsites to
use the new message module

giscanner/gdumpparser.py
giscanner/maintransformer.py
giscanner/transformer.py

index 7f1d229..d93a464 100644 (file)
@@ -27,6 +27,8 @@ from xml.etree.cElementTree import parse
 
 from . import ast
 from . import glibast
+from . import message
+from .transformer import TransformerException
 
 # GParamFlags
 G_PARAM_READABLE = 1 << 0
@@ -254,7 +256,10 @@ blob containing data gleaned from GObject's primitive introspection."""
 
         klass = (glibast.GLibFlags if node.tag == 'flags' else glibast.GLibEnum)
         type_name = node.attrib['name']
-        enum_name = self._transformer.strip_identifier_or_warn(type_name, fatal=True)
+        try:
+            enum_name = self._transformer.strip_identifier(type_name)
+        except TransformerException, e:
+            message.fatal(e)
         node = klass(enum_name, type_name, members, node.attrib['get-type'])
         self._namespace.append(node, replace=True)
 
@@ -275,11 +280,12 @@ blob containing data gleaned from GObject's primitive introspection."""
             return
         is_abstract = bool(xmlnode.attrib.get('abstract', False))
         (get_type, c_symbol_prefix) = self._split_type_and_symbol_prefix(xmlnode)
-        node = glibast.GLibObject(
-            self._transformer.strip_identifier_or_warn(type_name, fatal=True),
-            None,
-            type_name,
-            get_type, c_symbol_prefix, is_abstract)
+        try:
+            object_name = self._transformer.strip_identifier(type_name)
+        except TransformerException, e:
+            message.fatal(e)
+        node = glibast.GLibObject(object_name, None, type_name,
+                                  get_type, c_symbol_prefix, is_abstract)
         self._parse_parents(xmlnode, node)
         self._introspect_properties(node, xmlnode)
         self._introspect_signals(node, xmlnode)
@@ -291,10 +297,12 @@ blob containing data gleaned from GObject's primitive introspection."""
     def _introspect_interface(self, xmlnode):
         type_name = xmlnode.attrib['name']
         (get_type, c_symbol_prefix) = self._split_type_and_symbol_prefix(xmlnode)
-        node = glibast.GLibInterface(
-            self._transformer.strip_identifier_or_warn(type_name, fatal=True),
-            None,
-            type_name, get_type, c_symbol_prefix)
+        try:
+            interface_name = self._transformer.strip_identifier(type_name)
+        except TransformerException, e:
+            message.fatal(e)
+        node = glibast.GLibInterface(interface_name, None, type_name,
+                                     get_type, c_symbol_prefix)
         self._introspect_properties(node, xmlnode)
         self._introspect_signals(node, xmlnode)
         for child in xmlnode.findall('prerequisite'):
@@ -379,11 +387,13 @@ blob containing data gleaned from GObject's primitive introspection."""
         type_name = xmlnode.attrib['name']
         is_abstract = bool(xmlnode.attrib.get('abstract', False))
         (get_type, c_symbol_prefix) = self._split_type_and_symbol_prefix(xmlnode)
-        node = glibast.GLibObject(
-            self._transformer.strip_identifier_or_warn(type_name, fatal=True),
-            None,
-            type_name,
-            get_type, c_symbol_prefix, is_abstract)
+        try:
+            fundamental_name = self._transformer.strip_identifier(type_name)
+        except TransformerException, e:
+            message.fatal(e)
+
+        node = glibast.GLibObject(fundamental_name, None, type_name,
+                                  get_type, c_symbol_prefix, is_abstract)
         self._parse_parents(xmlnode, node)
         node.fundamental = True
         self._introspect_implemented_interfaces(node, xmlnode)
@@ -404,7 +414,10 @@ blob containing data gleaned from GObject's primitive introspection."""
                 field.writable = False
 
     def _pair_boxed_type(self, boxed):
-        name = self._transformer.strip_identifier_or_warn(boxed.type_name, fatal=True)
+        try:
+            name = self._transformer.strip_identifier(boxed.type_name)
+        except TransformerException, e:
+            message.fatal(e)
         pair_node = self._namespace.get(name)
         if not pair_node:
             boxed_item = glibast.GLibBoxedOther(name, boxed.type_name,
index b529ee8..867a6c7 100644 (file)
@@ -21,6 +21,7 @@ import re
 
 from . import ast
 from . import glibast
+from . import message
 from .annotationparser import (TAG_VFUNC, TAG_SINCE, TAG_DEPRECATED, TAG_RETURNS,
                                TAG_ATTRIBUTES, TAG_RENAME_TO, TAG_TYPE, TAG_TRANSFER,
                                TAG_UNREF_FUNC, TAG_REF_FUNC, TAG_SET_VALUE_FUNC,
@@ -32,6 +33,7 @@ from .annotationparser import (OPT_ALLOW_NONE,
                                OPT_FOREIGN, OPT_ARRAY_FIXED_SIZE,
                                OPT_ARRAY_LENGTH, OPT_ARRAY_ZERO_TERMINATED)
 from .annotationparser import AnnotationParser
+from .transformer import TransformerException
 from .utils import to_underscores, to_underscores_noprefix
 
 class MainTransformer(object):
@@ -688,7 +690,12 @@ the ones that failed to resolve removed."""
 
             uscore_enums[uscored] = enum
 
-            no_uscore_prefixed = self._transformer.strip_identifier_or_warn(type_name)
+            try:
+                no_uscore_prefixed = self._transformer.strip_identifier(type_name)
+            except TransformerException, e:
+                message.warn(e)
+                no_uscore_prefixed = None
+
             if no_uscore_prefixed not in uscore_enums:
                 uscore_enums[no_uscore_prefixed] = enum
 
index 9b061a3..30f7bbf 100644 (file)
@@ -24,6 +24,7 @@ import re
 
 from . import ast
 from . import glibast
+from . import message
 from .cachestore import CacheStore
 from .config import DATADIR, GIR_DIR, GIR_SUFFIX
 from .girparser import GIRParser
@@ -36,6 +37,10 @@ from .sourcescanner import (
     CSYMBOL_TYPE_MEMBER, CSYMBOL_TYPE_ELLIPSIS, CSYMBOL_TYPE_CONST,
     TYPE_QUALIFIER_CONST)
 
+class TransformerException(Exception):
+    pass
+
+
 _xdg_data_dirs = [x for x in os.environ.get('XDG_DATA_DIRS', '').split(':') \
                       + [DATADIR, '/usr/share'] if x]
 
@@ -317,26 +322,26 @@ raise ValueError."""
         matches = self._split_c_string_for_namespace_matches(symbol, is_identifier=False)
         return matches[-1]
 
-    def strip_identifier_or_warn(self, ident, fatal=False):
+    def strip_identifier(self, ident):
         hidden = ident.startswith('_')
         if hidden:
             ident = ident[1:]
         try:
             matches = self.split_ctype_namespaces(ident)
         except ValueError, e:
-            self.log_warning(str(e), fatal=fatal)
-            return None
+            raise TransformerException(str(e))
         for ns, name in matches:
             if ns is self._namespace:
                 if hidden:
                     return '_' + name
                 return name
         (ns, name) = matches[-1]
-        self.log_warning("Skipping foreign identifier %r from namespace %s" % (ident, ns.name, ),
-                         fatal=fatal)
+        raise TransformerException(
+            "Skipping foreign identifier %r from namespace %s" % (
+            ident, ns.name, ))
         return None
 
-    def _strip_symbol_or_warn(self, symbol, is_constant=False, fatal=False):
+    def _strip_symbol(self, symbol, is_constant=False):
         ident = symbol.ident
         if is_constant:
             # Temporarily lowercase
@@ -347,13 +352,10 @@ raise ValueError."""
         try:
             (ns, name) = self.split_csymbol(ident)
         except ValueError, e:
-            self.log_symbol_warning(symbol, "Unknown namespace", fatal=fatal)
-            return None
+            raise TransformerException("Unknown namespace")
         if ns != self._namespace:
-            self.log_symbol_warning(symbol,
-"Skipping foreign symbol from namespace %s" % (ns.name, ),
-                                    fatal=fatal)
-            return None
+            raise TransformerException(
+                "Skipping foreign symbol from namespace %s" % (ns.name, ))
         if is_constant:
             name = name.upper()
         if hidden:
@@ -421,15 +423,19 @@ raise ValueError."""
                 # Ok, the enum members don't have a consistent prefix
                 # among them, so let's just remove the global namespace
                 # prefix.
-                name = self._strip_symbol_or_warn(child, is_constant=True)
-                if name is None:
+                try:
+                    name = self._strip_symbol(child, is_constant=True)
+                except TransformerException, e:
+                    message.warn_symbol(child, e)
                     return None
             members.append(ast.Member(name.lower(),
-                                  child.const_int,
-                                  child.ident))
+                                      child.const_int,
+                                      child.ident))
 
-        enum_name = self.strip_identifier_or_warn(symbol.ident)
-        if not enum_name:
+        try:
+            enum_name = self.strip_identifier(symbol.ident)
+        except TransformerException, e:
+            message.warn(e)
             return None
         if symbol.base_type.is_bitfield:
             klass = ast.Bitfield
@@ -442,8 +448,10 @@ raise ValueError."""
     def _create_function(self, symbol):
         parameters = list(self._create_parameters(symbol.base_type))
         return_ = self._create_return(symbol.base_type.base_type)
-        name = self._strip_symbol_or_warn(symbol)
-        if not name:
+        try:
+            name = self._strip_symbol(symbol)
+        except TransformerException, e:
+            message.warn_symbol(symbol, e)
             return None
         func = ast.Function(name, return_, parameters, False, symbol.ident)
         func.add_symbol_reference(symbol)
@@ -523,8 +531,10 @@ raise ValueError."""
                        CTYPE_POINTER,
                        CTYPE_BASIC_TYPE,
                        CTYPE_VOID):
-            name = self.strip_identifier_or_warn(symbol.ident)
-            if not name:
+            try:
+                name = self.strip_identifier(symbol.ident)
+            except TransformerException, e:
+                message.warn(e)
                 return None
             if symbol.base_type.name:
                 target = self.create_type_from_ctype_string(symbol.base_type.name)
@@ -648,8 +658,10 @@ raise ValueError."""
         # ignore non-uppercase defines
         if not self.UCASE_CONSTANT_RE.match(symbol.ident):
             return None
-        name = self._strip_symbol_or_warn(symbol, is_constant=True)
-        if not name:
+        try:
+            name = self._strip_symbol(symbol, is_constant=True)
+        except TransformerException, e:
+            message.warn_symbol(symbol, e)
             return None
         if symbol.const_string is not None:
             typeval = ast.TYPE_STRING
@@ -668,8 +680,10 @@ raise ValueError."""
         return const
 
     def _create_typedef_struct(self, symbol, disguised=False):
-        name = self.strip_identifier_or_warn(symbol.ident)
-        if not name:
+        try:
+            name = self.strip_identifier(symbol.ident)
+        except TransformerException, e:
+            message.warn(e)
             return None
         struct = ast.Record(name, symbol.ident, disguised)
         self._parse_fields(symbol, struct)
@@ -678,8 +692,10 @@ raise ValueError."""
         return None
 
     def _create_typedef_union(self, symbol):
-        name = self.strip_identifier_or_warn(symbol.ident)
-        if not name:
+        try:
+            name = self.strip_identifier(symbol.ident)
+        except TransformerException, e:
+            message.warn(e)
             return None
         union = ast.Union(name, symbol.ident)
         self._parse_fields(symbol, union)
@@ -724,8 +740,10 @@ raise ValueError."""
                 if anonymous:
                     name = symbol.ident
                 else:
-                    name = self.strip_identifier_or_warn(symbol.ident)
-                    if not name:
+                    try:
+                        name = self.strip_identifier(symbol.ident)
+                    except TransformerException, e:
+                        message.warn(e)
                         return None
                 compound = klass(name, symbol.ident)
 
@@ -752,12 +770,16 @@ raise ValueError."""
         if member:
             name = symbol.ident
         elif symbol.ident.find('_') > 0:
-            name = self._strip_symbol_or_warn(symbol)
-            if not name:
+            try:
+                name = self._strip_symbol(symbol)
+            except TransformerException, e:
+                message.warn_symbol(symbol, e)
                 return None
         else:
-            name = self.strip_identifier_or_warn(symbol.ident)
-            if not name:
+            try:
+                name = self.strip_identifier(symbol.ident)
+            except TransformerException, e:
+                message.warn(e)
                 return None
         callback = ast.Callback(name, retval, parameters, False)
         callback.add_symbol_reference(symbol)