コード例 #1
0
ファイル: ast.py プロジェクト: bazsi/codega
class Info(object):
    '''Stores information about an AST class'''

    def __init__(self, name, properties, base=AstNodeBase):
        self.__base = base
        self.__name = name
        self.__properties = OrderedDict(properties)

    @property
    def name(self):
        return self.__name

    @property
    def bases(self):
        return self.__bases

    @property
    def properties(self):
        return OrderedDict(self.__properties)

    def map_properties(self, obj, args, kwargs):
        res = OrderedDict()
        args = list(args)
        kwargs = dict(kwargs)

        for name, klass in self.__properties.iteritems():
            if kwargs and name in kwargs:
                res[name] = kwargs.pop(name)

            elif args:
                res[name] = args[0]
                del args[0]

            elif klass == OPTIONAL:
                res[name] = None

            else:
                raise ValueError("Cannot handle required argument %s" % name)

        setattr(obj, 'ast_properties', res)
        for key, value in res.iteritems():
            assert not hasattr(obj, key)
            setattr(obj, key, value)

    def get_class(self, metainfo):
        if not metainfo.has_class(self.__name):
            self.__create_class(metainfo)

        return metainfo.get_class(self.__name)

    def __create_class(self, metainfo):
        members = {}
        members['ast_class_info'] = self
        members['ast_name'] = self.__name

        return metainfo.define_class(self.__name, (self.__base,), members)
コード例 #2
0
ファイル: ast.py プロジェクト: bazsi/codega
    def map_properties(self, obj, args, kwargs):
        res = OrderedDict()
        args = list(args)
        kwargs = dict(kwargs)

        for name, klass in self.__properties.iteritems():
            if kwargs and name in kwargs:
                res[name] = kwargs.pop(name)

            elif args:
                res[name] = args[0]
                del args[0]

            elif klass == OPTIONAL:
                res[name] = None

            else:
                raise ValueError("Cannot handle required argument %s" % name)

        setattr(obj, 'ast_properties', res)
        for key, value in res.iteritems():
            assert not hasattr(obj, key)
            setattr(obj, key, value)