from . import ast
from . import glibast
+from . import message
+from .transformer import TransformerException
# GParamFlags
G_PARAM_READABLE = 1 << 0
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)
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)
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'):
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)
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,
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,
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):
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
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
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]
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
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:
# 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
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)
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)
# 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
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)
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)
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)
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)