def end_file(self): self.end_block() self.out() self.out() self.out('cdef extern from *:') with self.block(): for u in self.unions: for o in u.options: self.out('const %s *dynamic_cast_%s ' '"dynamic_cast<const %s::%s *>" (void *)' % (title(o), snake(o), namespace, title(o))) for u in self.unions: self.out() self.out() self.out('cdef inline object visit_%s(const Node *ptr):' % snake(u.name)) with self.block(): for o in u.options: self.visit_option(o) for t in self.types: self.out() self.out() self.out('cdef inline object visit_%s(const Node *ptr):' % snake(t.name)) with self.block(): self.out('cdef const Node *tmp') self.out('res = {}') for f in t.fields: self.visit_field(t.name, f) self.out('return res')
def visit_field(self, ast_type, field): field_type, name, nullable, plural = field ref = '' if nullable else '&' if plural: vector = 'vector[unique_ptr[%s]] *' % title(field_type) self.out('cdef const %s%s = %s(<%s *>ptr).get%s()' % (vector, snake(name), ref, ast_type, title(name))) get = '%s[0].at(i).get()' % snake(name) size = '%s[0].size() if %s else 0' % (snake(name), snake(name)) self.out('res["%s"] = [visit_%s(%s) for i in xrange(%s)]' % (snake(name), snake(field_type), get, size)) else: mapped = type_map.get(field_type) get = '(<%s *>ptr)[0].get%s()' % (title(ast_type), title(name)) if mapped: assert (not nullable) decode = decode_map.get(field_type) if decode: self.out('res["%s"] = (<%s>%s).decode("%s")' % (snake(name), mapped, get, decode)) else: self.out('res["%s"] = <%s>%s' % (snake(name), mapped, get)) else: if nullable: self.out('tmp = %s' % get) self.out('res["%s"] = visit_%s(tmp) if tmp else None' % (snake(name), snake(field_type))) else: self.out('res["%s"] = visit_%s(&%s)' % (snake(name), snake(field_type), get))
def visit_field(self, ast_type, field): field_type, name, nullable, plural = field ref = '' if nullable else '&' if plural: vector = 'vector[unique_ptr[%s]] *' % title(field_type) self.out('cdef const %s%s = %s(<%s *>ptr).get%s()' % (vector, snake(name), ref, ast_type, title(name))) get = '%s[0].at(i).get()' % snake(name) size = '%s[0].size() if %s else 0' % (snake(name), snake(name)) self.out('res["%s"] = [visit_%s(%s) for i in xrange(%s)]' % (snake(name), snake(field_type), get, size)) else: mapped = type_map.get(field_type) get = '(<%s *>ptr)[0].get%s()' % (title(ast_type), title(name)) if mapped: assert(not nullable) decode = decode_map.get(field_type) if decode: self.out('res["%s"] = (<%s>%s).decode("%s")' % (snake(name), mapped, get, decode)) else: self.out('res["%s"] = <%s>%s' % (snake(name), mapped, get)) else: if nullable: self.out('tmp = %s' % get) self.out('res["%s"] = visit_%s(tmp) if tmp else None' % (snake(name), snake(field_type))) else: self.out('res["%s"] = visit_%s(&%s)' % (snake(name), snake(field_type), get))
def end_type(self, name): titleName = title(name) if self._anyFieldIsANode: print 'bool visit%s(const %s &node) override;' % (titleName, titleName) print 'void endVisit%s(const %s &node) override;' % (titleName, titleName) print
def start_type(self, name): titleName = title(name) camelName = camel(titleName) print ' virtual bool visit%s(const %s &%s) { return true; }' % ( titleName, titleName, camelName) print ' virtual void endVisit%s(const %s &%s) { }' % ( titleName, titleName, camelName) print
def _print_getters(self): for (type, name, nullable, plural) in self._fields: print >> self._deferredOutput, ' %s get%s() const' % ( self._getter_type(type, nullable, plural), title(name)) print >> self._deferredOutput, ' { return %s; }' % ( self._getter_value_to_return(name + '_', type, nullable, plural)) print >> self._deferredOutput
def end_type(self, name): titleName = title(name) anyFieldIsANode = any(type not in ('string, boolean') for (type, _, _, _) in self._fields) if anyFieldIsANode: print '''bool JsonVisitor::visit%s(const %s &node) { visitNode(); return true; } ''' % (titleName, titleName) print '''void JsonVisitor::endVisit%(tn)s(const %(tn)s &node) { NodeFieldPrinter fields(*this, "%(tn)s", node);''' % { 'tn': titleName } for (type, fieldName, nullable, plural) in self._fields: funcName = None if type == 'string': assert not plural, 'plural string fields not supported yet' funcName = 'printSingularPrimitiveField' elif type == 'boolean': assert not plural, 'plural boolean fields not supported yet' funcName = 'printSingularBooleanField' elif not nullable and not plural: # Special case: singular object fields don't need the value passed. print ' fields.printSingularObjectField("%s");' % fieldName continue else: nullable_str = 'Nullable' if nullable else '' plural_str = 'Plural' if plural else 'SingularObject' funcName = 'print%s%sField' % (nullable_str, plural_str) assert funcName is not None print ' fields.%s("%s", node.get%s());' % (funcName, fieldName, title(fieldName)) if anyFieldIsANode: print ''' endVisitNode(fields.finishPrinting()); } ''' else: print '''
def field(self, field_type, name, nullable, plural): self.types[-1].add_field(field_type, name, nullable, plural) name = 'get%s()' % title(name) ref = '*' if nullable else '&' if plural: self.out('const vector[unique_ptr[%s]] %s%s const' % (field_type, ref, name)) else: mapped = type_map.get(field_type) if mapped: assert (not nullable) self.out('%s%s' % (mapped, name)) else: self.out('const %s %s%s' % (field_type, ref, name))
def field(self, field_type, name, nullable, plural): self.types[-1].add_field(field_type, name, nullable, plural) name = 'get%s()' % title(name) ref = '*' if nullable else '&' if plural: self.out('const vector[unique_ptr[%s]] %s%s const' % (field_type, ref, name)) else: mapped = type_map.get(field_type) if mapped: assert(not nullable) self.out('%s%s' % (mapped, name)) else: self.out('const %s %s%s' % (field_type, ref, name))
def field(self, type, name, nullable, plural): print field_prototype(self._current_type, type, name, nullable, plural) + ' {' print ' const auto *realNode = (const %s *)node;' % self._current_type title_name = title(name) call_get = 'realNode->get%s()' % title_name if plural: if nullable: print ' return %s ? %s->size() : 0;' % (call_get, call_get) else: print ' return %s.size();' % call_get else: if type in ['string', 'OperationKind', 'boolean']: print ' return %s;' % call_get else: fmt = ' return (const struct %s *)%s%s;' print fmt % (struct_name(type), '' if nullable else '&', call_get) print '}'
def field(self, type, name, nullable, plural): print field_prototype(self._current_type, type, name, nullable, plural) + ' {' print ' const auto *realNode = reinterpret_cast<const %s *>(node);' % self._current_type title_name = title(name) call_get = 'realNode->get%s()' % title_name if plural: if nullable: print ' return %s ? %s->size() : 0;' % (call_get, call_get) else: print ' return %s.size();' % call_get else: if type in ['string', 'OperationKind', 'boolean']: print ' return %s;' % call_get else: fmt = ' return reinterpret_cast<const struct %s *>(%s%s);' print fmt % (struct_name(type), '' if nullable else '&', call_get) print '}'
def _print_getters(self): for (type, name, nullable, plural) in self._fields: print( " {} get{}() const".format(self._getter_type(type, nullable, plural), title(name)), file=self._deferredOutput, ) print( " {{ return {}; }}".format(self._getter_value_to_return(name + "_", type, nullable, plural)), file=self._deferredOutput, ) print(file=self._deferredOutput)
for (type, name, nullable, plural) - in self._fields) - print >> self._deferredOutput, ' {}' + in self._fields), file=self._deferredOutput) + print(' {}', file=self._deferredOutput) def _getter_type(self, type, nullable, plural): if plural and nullable: @@ -165,31 +165,31 @@ struct CDeleter { def _print_getters(self): for (type, name, nullable, plural) in self._fields: - print >> self._deferredOutput, ' %s get%s() const' % ( + print(' %s get%s() const' % ( self._getter_type(type, nullable, plural), - title(name)) - print >> self._deferredOutput, ' { return %s; }' % ( - self._getter_value_to_return(name + '_', type, nullable, plural)) - print >> self._deferredOutput + title(name)), file=self._deferredOutput) + print(' { return %s; }' % ( + self._getter_value_to_return(name + '_', type, nullable, plural)), file=self._deferredOutput) + print(file=self._deferredOutput) def _print_destructor_prototype(self): - print >> self._deferredOutput, ' ~%s() {}' % self._type_name + print(' ~%s() {}' % self._type_name, file=self._deferredOutput) def _print_noncopyable(self): - print >> self._deferredOutput, ' %s(const %s&) = delete;' % ( - self._type_name, self._type_name)