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)
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)