Skip to content

Commit 67301b4

Browse files
committed
Automatically generate the repetitive parts of JsonVisitor
Use a straightforward AST generator script.
1 parent 084cdb6 commit 67301b4

7 files changed

+137
-345
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,5 @@ GraphQLParser.py
1919
install_manifest.txt
2020
build/
2121
libgraphqlparser.pc
22+
JsonVisitor.cpp.inc
23+
JsonVisitor.h.inc

CMakeLists.txt

+7-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ ADD_LIBRARY(graphqlparser SHARED
3939
${CMAKE_CURRENT_BINARY_DIR}/c/GraphQLAst.h
4040
${CMAKE_CURRENT_BINARY_DIR}/c/GraphQLAst.cpp
4141
${CMAKE_CURRENT_BINARY_DIR}/c/GraphQLAstForEachConcreteType.h
42+
${CMAKE_CURRENT_BINARY_DIR}/JsonVisitor.h.inc
43+
${CMAKE_CURRENT_BINARY_DIR}/JsonVisitor.cpp.inc
4244
c/GraphQLAstNode.cpp
4345
c/GraphQLAstToJSON.cpp
4446
c/GraphQLAstVisitor.h
@@ -62,7 +64,7 @@ FUNCTION(GENERATE_AST_FILE FILE_TYPE FILE_RELATIVE_PATH)
6264
ADD_CUSTOM_COMMAND(
6365
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILE_RELATIVE_PATH}
6466
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/ast/ast.py ${FILE_TYPE} ${CMAKE_CURRENT_SOURCE_DIR}/ast/ast.ast > ${CMAKE_CURRENT_BINARY_DIR}/${FILE_RELATIVE_PATH}
65-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ast/ast.ast ${CMAKE_CURRENT_SOURCE_DIR}/ast/ast.py)
67+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ast/ast.ast ${CMAKE_CURRENT_SOURCE_DIR}/ast/ast.py ${CMAKE_CURRENT_SOURCE_DIR}/ast/${FILE_TYPE}.py)
6668
ENDFUNCTION(GENERATE_AST_FILE)
6769

6870
GENERATE_AST_FILE(cxx Ast.h)
@@ -77,6 +79,10 @@ GENERATE_AST_FILE(c_impl c/GraphQLAst.cpp)
7779

7880
GENERATE_AST_FILE(c_visitor_impl c/GraphQLAstForEachConcreteType.h)
7981

82+
GENERATE_AST_FILE(cxx_json_visitor_header JsonVisitor.h.inc)
83+
84+
GENERATE_AST_FILE(cxx_json_visitor_impl JsonVisitor.cpp.inc)
85+
8086
ADD_SUBDIRECTORY(python)
8187

8288
OPTION(test "Build tests." OFF)

JsonVisitor.cpp

+2-278
Original file line numberDiff line numberDiff line change
@@ -120,290 +120,14 @@ void JsonVisitor::endVisitNode(std::string &&str) {
120120
printed_.back().emplace_back(std::move(str));
121121
}
122122

123-
bool JsonVisitor::visitDocument(const Document &document) {
124-
visitNode();
125-
return true;
126-
}
127-
128-
void JsonVisitor::endVisitDocument(const Document &document) {
129-
NodeFieldPrinter fields(*this, "Document", document);
130-
fields.printPluralField("definitions", document.getDefinitions());
131-
endVisitNode(fields.finishPrinting());
132-
assert(printed_.size() == 1);
133-
}
134-
135-
bool JsonVisitor::visitOperationDefinition(const OperationDefinition &operationDefinition) {
136-
visitNode();
137-
return true;
138-
}
139-
140-
void JsonVisitor::endVisitOperationDefinition(const OperationDefinition &operationDefinition) {
141-
NodeFieldPrinter fields(*this, "OperationDefinition", operationDefinition);
142-
143-
fields.printSingularPrimitiveField("operation", operationDefinition.getOperation());
144-
fields.printNullableSingularObjectField("name", operationDefinition.getName());
145-
146-
fields.printNullablePluralField(
147-
"variableDefinitions",
148-
operationDefinition.getVariableDefinitions());
149-
150-
fields.printNullablePluralField(
151-
"directives",
152-
operationDefinition.getDirectives());
153-
154-
fields.printSingularObjectField("selectionSet");
155-
156-
endVisitNode(fields.finishPrinting());
157-
}
158-
159-
bool JsonVisitor::visitVariableDefinition(const VariableDefinition &variableDefinition) {
160-
visitNode();
161-
return true;
162-
}
163-
164-
void JsonVisitor::endVisitVariableDefinition(const VariableDefinition &variableDefinition) {
165-
NodeFieldPrinter fields(*this, "VariableDefinition", variableDefinition);
166-
fields.printSingularObjectField("variable");
167-
fields.printSingularObjectField("type");
168-
fields.printNullableSingularObjectField(
169-
"defaultValue",
170-
variableDefinition.getDefaultValue());
171-
172-
173-
endVisitNode(fields.finishPrinting());
174-
}
175-
176-
bool JsonVisitor::visitSelectionSet(const SelectionSet &selectionSet) {
177-
visitNode();
178-
return true;
179-
}
180-
181-
void JsonVisitor::endVisitSelectionSet(const SelectionSet &selectionSet) {
182-
NodeFieldPrinter fields(*this, "SelectionSet", selectionSet);
183-
fields.printPluralField("selections", selectionSet.getSelections());
184-
185-
endVisitNode(fields.finishPrinting());
186-
}
187-
188-
bool JsonVisitor::visitField(const Field &field) {
189-
visitNode();
190-
return true;
191-
}
192-
193-
void JsonVisitor::endVisitField(const Field &field) {
194-
NodeFieldPrinter fields(*this, "Field", field);
195-
fields.printNullableSingularObjectField("alias", field.getAlias());
196-
fields.printSingularObjectField("name");
197-
fields.printNullablePluralField("arguments", field.getArguments());
198-
fields.printNullablePluralField("directives", field.getDirectives());
199-
fields.printNullableSingularObjectField("selectionSet", field.getSelectionSet());
200-
201-
endVisitNode(fields.finishPrinting());
202-
}
203-
204-
bool JsonVisitor::visitArgument(const Argument &argument) {
205-
visitNode();
206-
return true;
207-
}
208-
209-
void JsonVisitor::endVisitArgument(const Argument &argument) {
210-
NodeFieldPrinter fields(*this, "Argument", argument);
211-
fields.printSingularObjectField("name");
212-
fields.printSingularObjectField("value");
213-
214-
endVisitNode(fields.finishPrinting());
215-
}
216-
217-
bool JsonVisitor::visitFragmentSpread(const FragmentSpread &fragmentSpread) {
218-
visitNode();
219-
return true;
220-
}
221-
222-
void JsonVisitor::endVisitFragmentSpread(const FragmentSpread &fragmentSpread) {
223-
NodeFieldPrinter fields(*this, "FragmentSpread", fragmentSpread);
224-
fields.printSingularObjectField("name");
225-
fields.printNullablePluralField("directives", fragmentSpread.getDirectives());
226-
227-
endVisitNode(fields.finishPrinting());
228-
}
229-
230-
bool JsonVisitor::visitInlineFragment(const InlineFragment &inlineFragment) {
231-
visitNode();
232-
return true;
233-
}
234-
235-
void JsonVisitor::endVisitInlineFragment(const InlineFragment &inlineFragment) {
236-
NodeFieldPrinter fields(*this, "InlineFragment", inlineFragment);
237-
fields.printNullableSingularObjectField("typeCondition", inlineFragment.getTypeCondition());
238-
fields.printNullablePluralField("directives", inlineFragment.getDirectives());
239-
fields.printSingularObjectField("selectionSet");
240-
241-
endVisitNode(fields.finishPrinting());
242-
}
243-
244-
bool JsonVisitor::visitFragmentDefinition(const FragmentDefinition &fragmentDefinition) {
245-
visitNode();
246-
return true;
247-
}
248-
249-
void JsonVisitor::endVisitFragmentDefinition(const FragmentDefinition &fragmentDefinition) {
250-
NodeFieldPrinter fields(*this, "FragmentDefinition", fragmentDefinition);
251-
252-
fields.printSingularObjectField("name");
253-
fields.printSingularObjectField("typeCondition");
254-
fields.printNullablePluralField("directives", fragmentDefinition.getDirectives());
255-
fields.printSingularObjectField("selectionSet");
256-
257-
endVisitNode(fields.finishPrinting());
258-
}
259-
260-
bool JsonVisitor::visitVariable(const Variable &variable) {
261-
visitNode();
262-
return true;
263-
}
264-
265-
void JsonVisitor::endVisitVariable(const Variable &variable) {
266-
NodeFieldPrinter fields(*this, "Variable", variable);
267-
fields.printSingularObjectField("name");
268-
269-
endVisitNode(fields.finishPrinting());
270-
}
271-
272-
template <typename ValueNode>
273-
void JsonVisitor::endVisitValueRepresentedAsString(const char *valueKind, const ValueNode &value) {
274-
NodeFieldPrinter fields(*this, valueKind, value);
275-
fields.printSingularPrimitiveField("value", value.getValue());
276-
277-
printed_.back().emplace_back(fields.finishPrinting());
278-
}
279-
280-
void JsonVisitor::endVisitIntValue(const IntValue &intValue) {
281-
endVisitValueRepresentedAsString("IntValue", intValue);
282-
}
283-
284-
void JsonVisitor::endVisitFloatValue(const FloatValue &floatValue) {
285-
endVisitValueRepresentedAsString("FloatValue", floatValue);
286-
}
287-
288-
void JsonVisitor::endVisitStringValue(const StringValue &stringValue) {
289-
endVisitValueRepresentedAsString("StringValue", stringValue);
290-
}
291-
292-
void JsonVisitor::endVisitEnumValue(const EnumValue &enumValue) {
293-
endVisitValueRepresentedAsString("EnumValue", enumValue);
294-
}
295-
296-
void JsonVisitor::endVisitNullValue(const NullValue &nullValue) {
297-
NodeFieldPrinter fields(*this, "NullValue", nullValue);
298-
299-
printed_.back().emplace_back(fields.finishPrinting());
300-
}
301-
302-
void JsonVisitor::endVisitBooleanValue(const BooleanValue &booleanValue) {
303-
NodeFieldPrinter fields(*this, "BooleanValue", booleanValue);
304-
fields.printSingularBooleanField(
305-
"value",
306-
booleanValue.getValue());
307-
308-
printed_.back().emplace_back(fields.finishPrinting());
309-
}
310-
311-
bool JsonVisitor::visitListValue(const ListValue &arrayValue) {
312-
visitNode();
313-
return true;
314-
}
315-
316-
void JsonVisitor::endVisitListValue(const ListValue &arrayValue) {
317-
NodeFieldPrinter fields(*this, "ListValue", arrayValue);
318-
fields.printPluralField("values", arrayValue.getValues());
319-
320-
endVisitNode(fields.finishPrinting());
321-
}
322-
323-
bool JsonVisitor::visitObjectValue(const ObjectValue &objectValue) {
324-
visitNode();
325-
return true;
326-
}
327-
328-
void JsonVisitor::endVisitObjectValue(const ObjectValue &objectValue) {
329-
NodeFieldPrinter fields(*this, "ObjectValue", objectValue);
330-
fields.printPluralField("fields", objectValue.getFields());
331-
332-
endVisitNode(fields.finishPrinting());
333-
}
334-
335-
bool JsonVisitor::visitObjectField(const ObjectField &objectField) {
336-
visitNode();
337-
return true;
338-
}
339-
340-
void JsonVisitor::endVisitObjectField(const ObjectField &objectField) {
341-
NodeFieldPrinter fields(*this, "ObjectField", objectField);
342-
fields.printSingularObjectField("name");
343-
fields.printSingularObjectField("value");
344-
345-
endVisitNode(fields.finishPrinting());
346-
}
347-
348-
bool JsonVisitor::visitDirective(const Directive &directive) {
349-
visitNode();
350-
return true;
351-
}
352-
353-
void JsonVisitor::endVisitDirective(const Directive &directive) {
354-
NodeFieldPrinter fields(*this, "Directive", directive);
355-
fields.printSingularObjectField("name");
356-
fields.printNullablePluralField("arguments", directive.getArguments());
357-
358-
endVisitNode(fields.finishPrinting());
359-
}
360-
361-
void JsonVisitor::endVisitName(const Name &name) {
362-
endVisitValueRepresentedAsString("Name", name);
363-
}
364-
365-
bool JsonVisitor::visitNamedType(const NamedType &namedType) {
366-
visitNode();
367-
return true;
368-
}
369-
370-
void JsonVisitor::endVisitNamedType(const NamedType &namedType) {
371-
NodeFieldPrinter fields(*this, "NamedType", namedType);
372-
fields.printSingularObjectField("name");
373-
374-
endVisitNode(fields.finishPrinting());
375-
}
376-
377-
bool JsonVisitor::visitListType(const ListType &listType) {
378-
visitNode();
379-
return true;
380-
}
381-
382-
void JsonVisitor::endVisitListType(const ListType &listType) {
383-
NodeFieldPrinter fields(*this, "ListType", listType);
384-
fields.printSingularObjectField("type");
385-
386-
endVisitNode(fields.finishPrinting());
387-
}
388-
389-
bool JsonVisitor::visitNonNullType(const NonNullType &nonNullType) {
390-
visitNode();
391-
return true;
392-
}
393-
394-
void JsonVisitor::endVisitNonNullType(const NonNullType &nonNullType) {
395-
NodeFieldPrinter fields(*this, "NonNullType", nonNullType);
396-
fields.printSingularObjectField("type");
397-
398-
endVisitNode(fields.finishPrinting());
399-
}
400-
401123
std::string JsonVisitor::getResult() const {
402124
assert(printed_.size() == 1);
403125
assert(printed_[0].size() == 1);
404126
return printed_[0][0];
405127
}
406128

129+
#include "JsonVisitor.cpp.inc"
130+
407131
}
408132
}
409133
}

0 commit comments

Comments
 (0)