diff options
-rw-r--r-- | giscanner/gdumpparser.py | 45 | ||||
-rw-r--r-- | giscanner/maintransformer.py | 9 | ||||
-rw-r--r-- | giscanner/transformer.py | 90 |
3 files changed, 93 insertions, 51 deletions
diff --git a/giscanner/gdumpparser.py b/giscanner/gdumpparser.py index 7f1d2290..d93a4645 100644 --- a/giscanner/gdumpparser.py +++ b/giscanner/gdumpparser.py @@ -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, diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py index b529ee8c..867a6c7c 100644 --- a/giscanner/maintransformer.py +++ b/giscanner/maintransformer.py @@ -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 diff --git a/giscanner/transformer.py b/giscanner/transformer.py index 9b061a3e..30f7bbf6 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -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) |