示例#1
0
    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')
示例#2
0
    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))
示例#3
0
    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))
示例#4
0
    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')
示例#5
0
 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
示例#6
0
 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
示例#7
0
 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
示例#8
0
 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
示例#9
0
    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 '''
示例#10
0
 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
示例#11
0
 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))
示例#12
0
 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))
示例#13
0
  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 '}'
示例#14
0
  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 '}'
示例#15
0
 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)
示例#16
0
                      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)