# Copyright 2019-present, GraphQL Foundation # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. from c import field_prototype, return_type, struct_name from casing import title from license import C_LICENSE_COMMENT class Printer(object): '''Printer for the implementation of the pure C interface to the AST. ''' def __init__(self): self._current_type = None def start_file(self): print(C_LICENSE_COMMENT + '''/** @generated */ #include "GraphQLAst.h" #include "../Ast.h" using namespace facebook::graphql::ast; // NOLINT ''') def end_file(self): pass def start_type(self, name): self._current_type = name def field(self, type, name, nullable, plural): print(field_prototype(self._current_type, type, name, nullable, plural) + ' {') print(' const auto *realNode = reinterpret_cast(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(%s%s);' print(fmt % (struct_name(type), '' if nullable else '&', call_get)) print('}') def end_type(self, name): pass def start_union(self, name): pass def union_option(self, option): pass def end_union(self, name): pass