summaryrefslogtreecommitdiff
path: root/giscanner/transformer.py
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2010-09-02 11:07:01 -0300
committerJohan Dahlin <johan@gnome.org>2010-09-02 12:37:54 -0300
commit5c25cabe5aa0385c224d519eedfd1df9e7e42187 (patch)
tree65a2bca8ceee20a9d0fa8dce27a30c0ee5eb1985 /giscanner/transformer.py
parent0b0a3cc7705ca797bc8315ba0815644bef5d30fb (diff)
downloadgobject-introspection-5c25cabe5aa0385c224d519eedfd1df9e7e42187.tar.gz
[scanner] Simplify strip_identifer/strip_symbol
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
Diffstat (limited to 'giscanner/transformer.py')
-rw-r--r--giscanner/transformer.py90
1 files changed, 56 insertions, 34 deletions
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)