rails-graphql 0.2.1 → 1.0.0.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/console.rb +18 -0
- data/ext/extconf.h +3 -0
- data/ext/extconf.rb +1 -54
- data/ext/gql_parser.c +646 -0
- data/ext/shared.c +482 -0
- data/ext/shared.h +177 -0
- data/lib/gql_parser.so +0 -0
- data/lib/rails/graphql/adapters/mysql_adapter.rb +59 -0
- data/lib/rails/graphql/adapters/pg_adapter.rb +25 -22
- data/lib/rails/graphql/adapters/sqlite_adapter.rb +17 -14
- data/lib/rails/graphql/alternative/field_set.rb +36 -0
- data/lib/rails/graphql/alternative/mutation.rb +17 -0
- data/lib/rails/graphql/alternative/query.rb +93 -0
- data/lib/rails/graphql/alternative/subscription.rb +17 -0
- data/lib/rails/graphql/alternative.rb +20 -0
- data/lib/rails/graphql/argument.rb +21 -24
- data/lib/rails/graphql/callback.rb +24 -9
- data/lib/rails/graphql/collectors/hash_collector.rb +14 -6
- data/lib/rails/graphql/collectors/idented_collector.rb +10 -7
- data/lib/rails/graphql/collectors/json_collector.rb +22 -17
- data/lib/rails/graphql/collectors.rb +4 -4
- data/lib/rails/graphql/config.rb +130 -15
- data/lib/rails/graphql/directive/cached_directive.rb +33 -0
- data/lib/rails/graphql/directive/deprecated_directive.rb +10 -10
- data/lib/rails/graphql/directive/include_directive.rb +5 -4
- data/lib/rails/graphql/directive/skip_directive.rb +5 -4
- data/lib/rails/graphql/directive.rb +118 -63
- data/lib/rails/graphql/errors.rb +33 -4
- data/lib/rails/graphql/event.rb +16 -5
- data/lib/rails/graphql/field/authorized_field.rb +19 -3
- data/lib/rails/graphql/field/input_field.rb +11 -10
- data/lib/rails/graphql/field/mutation_field.rb +42 -7
- data/lib/rails/graphql/field/output_field.rb +102 -13
- data/lib/rails/graphql/field/proxied_field.rb +31 -22
- data/lib/rails/graphql/field/resolved_field.rb +26 -24
- data/lib/rails/graphql/field/scoped_config.rb +10 -4
- data/lib/rails/graphql/field/subscription_field.rb +140 -0
- data/lib/rails/graphql/field/typed_field.rb +43 -22
- data/lib/rails/graphql/field.rb +70 -56
- data/lib/rails/graphql/global_id.rb +85 -0
- data/lib/rails/graphql/helpers/attribute_delegator.rb +5 -5
- data/lib/rails/graphql/helpers/inherited_collection/array.rb +50 -0
- data/lib/rails/graphql/helpers/inherited_collection/base.rb +43 -0
- data/lib/rails/graphql/helpers/inherited_collection/hash.rb +87 -0
- data/lib/rails/graphql/helpers/inherited_collection.rb +25 -76
- data/lib/rails/graphql/helpers/instantiable.rb +15 -0
- data/lib/rails/graphql/helpers/leaf_from_ar.rb +7 -7
- data/lib/rails/graphql/helpers/registerable.rb +44 -62
- data/lib/rails/graphql/helpers/unregisterable.rb +16 -0
- data/lib/rails/graphql/helpers/with_arguments.rb +31 -27
- data/lib/rails/graphql/helpers/with_assignment.rb +6 -6
- data/lib/rails/graphql/helpers/with_callbacks.rb +25 -8
- data/lib/rails/graphql/helpers/with_description.rb +71 -0
- data/lib/rails/graphql/helpers/with_directives.rb +54 -30
- data/lib/rails/graphql/helpers/with_events.rb +21 -23
- data/lib/rails/graphql/helpers/with_fields.rb +76 -22
- data/lib/rails/graphql/helpers/with_global_id.rb +22 -0
- data/lib/rails/graphql/helpers/with_name.rb +43 -0
- data/lib/rails/graphql/helpers/with_namespace.rb +7 -4
- data/lib/rails/graphql/helpers/with_owner.rb +8 -7
- data/lib/rails/graphql/helpers/with_schema_fields.rb +137 -55
- data/lib/rails/graphql/helpers/with_validator.rb +9 -9
- data/lib/rails/graphql/helpers.rb +10 -3
- data/lib/rails/graphql/introspection.rb +43 -36
- data/lib/rails/graphql/railtie.rb +88 -33
- data/lib/rails/graphql/railties/base_generator.rb +3 -9
- data/lib/rails/graphql/railties/channel.rb +157 -0
- data/lib/rails/graphql/railties/controller.rb +62 -17
- data/lib/rails/graphql/railties/controller_runtime.rb +5 -5
- data/lib/rails/graphql/railties/log_subscriber.rb +81 -14
- data/lib/rails/graphql/request/arguments.rb +24 -49
- data/lib/rails/graphql/request/backtrace.rb +191 -0
- data/lib/rails/graphql/request/component/field.rb +86 -65
- data/lib/rails/graphql/request/component/fragment.rb +72 -24
- data/lib/rails/graphql/request/component/operation/subscription.rb +164 -4
- data/lib/rails/graphql/request/component/operation.rb +63 -31
- data/lib/rails/graphql/request/component/spread.rb +68 -25
- data/lib/rails/graphql/request/component/typename.rb +27 -12
- data/lib/rails/graphql/request/component.rb +75 -36
- data/lib/rails/graphql/request/context.rb +18 -8
- data/lib/rails/graphql/request/errors.rb +16 -6
- data/lib/rails/graphql/request/event.rb +19 -8
- data/lib/rails/graphql/request/helpers/directives.rb +68 -27
- data/lib/rails/graphql/request/helpers/selection_set.rb +51 -25
- data/lib/rails/graphql/request/helpers/value_writers.rb +18 -16
- data/lib/rails/graphql/request/prepared_data.rb +98 -0
- data/lib/rails/graphql/request/steps/authorizable.rb +24 -14
- data/lib/rails/graphql/request/steps/organizable.rb +110 -48
- data/lib/rails/graphql/request/steps/{prepareable.rb → preparable.rb} +20 -7
- data/lib/rails/graphql/request/steps/{resolveable.rb → resolvable.rb} +15 -6
- data/lib/rails/graphql/request/strategy/cached_strategy.rb +64 -0
- data/lib/rails/graphql/request/strategy/dynamic_instance.rb +6 -6
- data/lib/rails/graphql/request/strategy/multi_query_strategy.rb +6 -13
- data/lib/rails/graphql/request/strategy/sequenced_strategy.rb +9 -9
- data/lib/rails/graphql/request/strategy.rb +131 -75
- data/lib/rails/graphql/request/subscription.rb +80 -0
- data/lib/rails/graphql/request.rb +305 -86
- data/lib/rails/graphql/schema.rb +240 -48
- data/lib/rails/graphql/shortcuts.rb +22 -3
- data/lib/rails/graphql/source/active_record/builders.rb +49 -35
- data/lib/rails/graphql/source/active_record_source.rb +70 -54
- data/lib/rails/graphql/source/base.rb +111 -0
- data/lib/rails/graphql/source/builder.rb +128 -0
- data/lib/rails/graphql/source/scoped_arguments.rb +31 -19
- data/lib/rails/graphql/source.rb +89 -213
- data/lib/rails/graphql/subscription/provider/action_cable.rb +112 -0
- data/lib/rails/graphql/subscription/provider/base.rb +191 -0
- data/lib/rails/graphql/subscription/provider.rb +18 -0
- data/lib/rails/graphql/subscription/store/base.rb +145 -0
- data/lib/rails/graphql/subscription/store/memory.rb +127 -0
- data/lib/rails/graphql/subscription/store.rb +19 -0
- data/lib/rails/graphql/subscription.rb +17 -0
- data/lib/rails/graphql/to_gql.rb +29 -32
- data/lib/rails/graphql/type/enum/directive_location_enum.rb +11 -11
- data/lib/rails/graphql/type/enum/type_kind_enum.rb +3 -3
- data/lib/rails/graphql/type/enum.rb +34 -48
- data/lib/rails/graphql/type/input.rb +74 -23
- data/lib/rails/graphql/type/interface.rb +16 -26
- data/lib/rails/graphql/type/object/directive_object.rb +4 -4
- data/lib/rails/graphql/type/object/enum_value_object.rb +3 -3
- data/lib/rails/graphql/type/object/field_object.rb +24 -6
- data/lib/rails/graphql/type/object/input_value_object.rb +3 -3
- data/lib/rails/graphql/type/object/schema_object.rb +5 -8
- data/lib/rails/graphql/type/object/type_object.rb +29 -19
- data/lib/rails/graphql/type/object.rb +26 -23
- data/lib/rails/graphql/type/scalar/any_scalar.rb +30 -0
- data/lib/rails/graphql/type/scalar/bigint_scalar.rb +5 -5
- data/lib/rails/graphql/type/scalar/binary_scalar.rb +3 -3
- data/lib/rails/graphql/type/scalar/boolean_scalar.rb +8 -8
- data/lib/rails/graphql/type/scalar/date_scalar.rb +3 -3
- data/lib/rails/graphql/type/scalar/date_time_scalar.rb +3 -3
- data/lib/rails/graphql/type/scalar/decimal_scalar.rb +3 -3
- data/lib/rails/graphql/type/scalar/float_scalar.rb +5 -5
- data/lib/rails/graphql/type/scalar/id_scalar.rb +6 -5
- data/lib/rails/graphql/type/scalar/int_scalar.rb +6 -5
- data/lib/rails/graphql/type/scalar/json_scalar.rb +39 -0
- data/lib/rails/graphql/type/scalar/string_scalar.rb +18 -4
- data/lib/rails/graphql/type/scalar/time_scalar.rb +5 -5
- data/lib/rails/graphql/type/scalar.rb +25 -22
- data/lib/rails/graphql/type/union.rb +14 -16
- data/lib/rails/graphql/type.rb +34 -25
- data/lib/rails/graphql/type_map.rb +256 -164
- data/lib/rails/graphql/uri.rb +166 -0
- data/lib/rails/graphql/version.rb +15 -3
- data/lib/rails/graphql.rake +3 -0
- data/lib/rails/graphql.rb +85 -52
- data/lib/rails-graphql.rb +1 -1
- data/test/assets/en.yml +29 -0
- data/test/assets/introspection-mem.txt +1 -1
- data/test/assets/mem.gql +18 -45
- data/test/assets/mysql.gql +392 -0
- data/test/assets/sqlite.gql +21 -12
- data/test/assets/translate.gql +335 -0
- data/test/config.rb +18 -8
- data/test/graphql/schema_test.rb +12 -19
- data/test/graphql/source_test.rb +8 -75
- data/test/graphql/type/enum_test.rb +207 -203
- data/test/graphql/type/input_test.rb +14 -9
- data/test/graphql/type/interface_test.rb +4 -4
- data/test/graphql/type/scalar/any_scalar_test.rb +38 -0
- data/test/graphql/type/scalar/boolean_scalar_test.rb +6 -3
- data/test/graphql/type/scalar/json_scalar_test.rb +23 -0
- data/test/graphql/type_map_test.rb +51 -66
- data/test/graphql/type_test.rb +0 -19
- data/test/graphql_test.rb +1 -1
- data/test/integration/{authorization/authorization_test.rb → authorization_test.rb} +40 -14
- data/test/integration/config.rb +36 -3
- data/test/integration/customization_test.rb +39 -0
- data/test/integration/global_id_test.rb +99 -0
- data/test/integration/memory/star_wars_introspection_test.rb +24 -16
- data/test/integration/memory/star_wars_query_test.rb +54 -3
- data/test/integration/memory/star_wars_validation_test.rb +1 -1
- data/test/integration/mysql/star_wars_introspection_test.rb +25 -0
- data/test/integration/persisted_query_test.rb +87 -0
- data/test/integration/resolver_precedence_test.rb +154 -0
- data/test/integration/schemas/memory.rb +22 -7
- data/test/integration/schemas/mysql.rb +62 -0
- data/test/integration/schemas/sqlite.rb +21 -12
- data/test/integration/sqlite/star_wars_global_id_test.rb +83 -0
- data/test/integration/sqlite/star_wars_introspection_test.rb +10 -0
- data/test/integration/sqlite/star_wars_query_test.rb +14 -1
- data/test/integration/translate_test.rb +61 -0
- data/test/test_ext.rb +16 -13
- metadata +108 -157
- data/ext/depend +0 -3
- data/ext/graphqlparser/Ast.cpp +0 -346
- data/ext/graphqlparser/Ast.h +0 -1214
- data/ext/graphqlparser/AstNode.h +0 -36
- data/ext/graphqlparser/AstVisitor.h +0 -137
- data/ext/graphqlparser/GraphQLParser.cpp +0 -76
- data/ext/graphqlparser/GraphQLParser.h +0 -55
- data/ext/graphqlparser/JsonVisitor.cpp +0 -161
- data/ext/graphqlparser/JsonVisitor.cpp.inc +0 -456
- data/ext/graphqlparser/JsonVisitor.h +0 -121
- data/ext/graphqlparser/JsonVisitor.h.inc +0 -110
- data/ext/graphqlparser/VERSION +0 -1
- data/ext/graphqlparser/c/GraphQLAst.cpp +0 -324
- data/ext/graphqlparser/c/GraphQLAst.h +0 -180
- data/ext/graphqlparser/c/GraphQLAstForEachConcreteType.h +0 -44
- data/ext/graphqlparser/c/GraphQLAstNode.cpp +0 -25
- data/ext/graphqlparser/c/GraphQLAstNode.h +0 -33
- data/ext/graphqlparser/c/GraphQLAstToJSON.cpp +0 -21
- data/ext/graphqlparser/c/GraphQLAstToJSON.h +0 -24
- data/ext/graphqlparser/c/GraphQLAstVisitor.cpp +0 -55
- data/ext/graphqlparser/c/GraphQLAstVisitor.h +0 -53
- data/ext/graphqlparser/c/GraphQLParser.cpp +0 -35
- data/ext/graphqlparser/c/GraphQLParser.h +0 -54
- data/ext/graphqlparser/dump_json_ast.cpp +0 -48
- data/ext/graphqlparser/lexer.lpp +0 -324
- data/ext/graphqlparser/parser.ypp +0 -693
- data/ext/graphqlparser/parsergen/lexer.cpp +0 -2633
- data/ext/graphqlparser/parsergen/lexer.h +0 -528
- data/ext/graphqlparser/parsergen/location.hh +0 -189
- data/ext/graphqlparser/parsergen/parser.tab.cpp +0 -3300
- data/ext/graphqlparser/parsergen/parser.tab.hpp +0 -646
- data/ext/graphqlparser/parsergen/position.hh +0 -179
- data/ext/graphqlparser/parsergen/stack.hh +0 -156
- data/ext/graphqlparser/syntaxdefs.h +0 -19
- data/ext/libgraphqlparser/AstNode.h +0 -36
- data/ext/libgraphqlparser/CMakeLists.txt +0 -148
- data/ext/libgraphqlparser/CONTRIBUTING.md +0 -23
- data/ext/libgraphqlparser/GraphQLParser.cpp +0 -76
- data/ext/libgraphqlparser/GraphQLParser.h +0 -55
- data/ext/libgraphqlparser/JsonVisitor.cpp +0 -161
- data/ext/libgraphqlparser/JsonVisitor.h +0 -121
- data/ext/libgraphqlparser/LICENSE +0 -22
- data/ext/libgraphqlparser/README.clang-tidy +0 -7
- data/ext/libgraphqlparser/README.md +0 -84
- data/ext/libgraphqlparser/ast/ast.ast +0 -203
- data/ext/libgraphqlparser/ast/ast.py +0 -61
- data/ext/libgraphqlparser/ast/c.py +0 -100
- data/ext/libgraphqlparser/ast/c.pyc +0 -0
- data/ext/libgraphqlparser/ast/c_impl.py +0 -61
- data/ext/libgraphqlparser/ast/c_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/c_visitor_impl.py +0 -39
- data/ext/libgraphqlparser/ast/c_visitor_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/casing.py +0 -26
- data/ext/libgraphqlparser/ast/casing.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx.py +0 -197
- data/ext/libgraphqlparser/ast/cxx.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_impl.py +0 -61
- data/ext/libgraphqlparser/ast/cxx_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_json_visitor_header.py +0 -42
- data/ext/libgraphqlparser/ast/cxx_json_visitor_header.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.py +0 -80
- data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_visitor.py +0 -64
- data/ext/libgraphqlparser/ast/cxx_visitor.pyc +0 -0
- data/ext/libgraphqlparser/ast/js.py +0 -65
- data/ext/libgraphqlparser/ast/license.py +0 -10
- data/ext/libgraphqlparser/ast/license.pyc +0 -0
- data/ext/libgraphqlparser/c/GraphQLAstNode.cpp +0 -25
- data/ext/libgraphqlparser/c/GraphQLAstNode.h +0 -33
- data/ext/libgraphqlparser/c/GraphQLAstToJSON.cpp +0 -21
- data/ext/libgraphqlparser/c/GraphQLAstToJSON.h +0 -24
- data/ext/libgraphqlparser/c/GraphQLAstVisitor.cpp +0 -55
- data/ext/libgraphqlparser/c/GraphQLAstVisitor.h +0 -53
- data/ext/libgraphqlparser/c/GraphQLParser.cpp +0 -35
- data/ext/libgraphqlparser/c/GraphQLParser.h +0 -54
- data/ext/libgraphqlparser/clang-tidy-all.sh +0 -3
- data/ext/libgraphqlparser/cmake/version.cmake +0 -16
- data/ext/libgraphqlparser/dump_json_ast.cpp +0 -48
- data/ext/libgraphqlparser/go/README.md +0 -20
- data/ext/libgraphqlparser/go/callbacks.go +0 -18
- data/ext/libgraphqlparser/go/gotest.go +0 -64
- data/ext/libgraphqlparser/lexer.lpp +0 -324
- data/ext/libgraphqlparser/libgraphqlparser.pc.in +0 -11
- data/ext/libgraphqlparser/parser.ypp +0 -693
- data/ext/libgraphqlparser/parsergen/lexer.cpp +0 -2633
- data/ext/libgraphqlparser/parsergen/lexer.h +0 -528
- data/ext/libgraphqlparser/parsergen/location.hh +0 -189
- data/ext/libgraphqlparser/parsergen/parser.tab.cpp +0 -3300
- data/ext/libgraphqlparser/parsergen/parser.tab.hpp +0 -646
- data/ext/libgraphqlparser/parsergen/position.hh +0 -179
- data/ext/libgraphqlparser/parsergen/stack.hh +0 -156
- data/ext/libgraphqlparser/python/CMakeLists.txt +0 -14
- data/ext/libgraphqlparser/python/README.md +0 -5
- data/ext/libgraphqlparser/python/example.py +0 -31
- data/ext/libgraphqlparser/syntaxdefs.h +0 -19
- data/ext/libgraphqlparser/test/BuildCAPI.c +0 -5
- data/ext/libgraphqlparser/test/CMakeLists.txt +0 -25
- data/ext/libgraphqlparser/test/JsonVisitorTests.cpp +0 -28
- data/ext/libgraphqlparser/test/ParserTests.cpp +0 -352
- data/ext/libgraphqlparser/test/kitchen-sink.graphql +0 -59
- data/ext/libgraphqlparser/test/kitchen-sink.json +0 -1
- data/ext/libgraphqlparser/test/schema-kitchen-sink.graphql +0 -78
- data/ext/libgraphqlparser/test/schema-kitchen-sink.json +0 -1
- data/ext/libgraphqlparser/test/valgrind.supp +0 -33
- data/ext/version.cpp +0 -21
- data/lib/graphqlparser.so +0 -0
- data/lib/rails/graphql/native/functions.rb +0 -38
- data/lib/rails/graphql/native/location.rb +0 -41
- data/lib/rails/graphql/native/pointers.rb +0 -23
- data/lib/rails/graphql/native/visitor.rb +0 -349
- data/lib/rails/graphql/native.rb +0 -56
- data/test/integration/schemas/authorization.rb +0 -12
@@ -1,161 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Copyright 2019-present, GraphQL Foundation
|
3
|
-
*
|
4
|
-
* This source code is licensed under the MIT license found in the
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
6
|
-
*/
|
7
|
-
|
8
|
-
#include "position.hh"
|
9
|
-
#include "JsonVisitor.h"
|
10
|
-
|
11
|
-
#include <cassert>
|
12
|
-
#include <iterator>
|
13
|
-
|
14
|
-
namespace facebook {
|
15
|
-
namespace graphql {
|
16
|
-
namespace ast {
|
17
|
-
namespace visitor {
|
18
|
-
|
19
|
-
static std::string escape(const char *s) {
|
20
|
-
static char hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
|
21
|
-
std::string result;
|
22
|
-
while (unsigned char ch = *s++) {
|
23
|
-
if (ch >= '\0' && ch <= '\x1f') {
|
24
|
-
result.push_back('\\');
|
25
|
-
result.push_back('u');
|
26
|
-
result.push_back('0');
|
27
|
-
result.push_back('0');
|
28
|
-
result.push_back(ch >= 16 ? '1' : '0');
|
29
|
-
result.push_back(hex[ch % 16]);
|
30
|
-
} else if (ch == '"') {
|
31
|
-
result.push_back('\\');
|
32
|
-
result.push_back('"');
|
33
|
-
} else if (ch == '\\') {
|
34
|
-
result.push_back('\\');
|
35
|
-
result.push_back('\\');
|
36
|
-
} else {
|
37
|
-
result.push_back(ch);
|
38
|
-
}
|
39
|
-
}
|
40
|
-
return result;
|
41
|
-
}
|
42
|
-
|
43
|
-
JsonVisitor::NodeFieldPrinter::NodeFieldPrinter(
|
44
|
-
JsonVisitor &visitor,
|
45
|
-
const char *nodeKind,
|
46
|
-
const Node &node)
|
47
|
-
: visitor_(visitor)
|
48
|
-
{
|
49
|
-
if (!visitor_.printed_.empty()) {
|
50
|
-
nextChild_ = visitor_.printed_.back().begin();
|
51
|
-
}
|
52
|
-
// NOTE: If you're an Emacs user and this file's use of C++11 raw
|
53
|
-
// strings doesn't highlight correctly in c++-mode, try upgrading to
|
54
|
-
// Emacs 26 if you can.
|
55
|
-
out_ << R"({"kind":")" << nodeKind << R"(","loc":)";
|
56
|
-
printLocation(out_, node.getLocation());
|
57
|
-
}
|
58
|
-
|
59
|
-
std::string JsonVisitor::NodeFieldPrinter::finishPrinting() {
|
60
|
-
assert(!out_.str().empty());
|
61
|
-
out_ << '}';
|
62
|
-
auto result(out_.str());
|
63
|
-
#ifndef NDEBUG
|
64
|
-
out_.str("");
|
65
|
-
#endif
|
66
|
-
return result;
|
67
|
-
|
68
|
-
}
|
69
|
-
|
70
|
-
void JsonVisitor::NodeFieldPrinter::printFieldSeparator()
|
71
|
-
{
|
72
|
-
out_ << ',';
|
73
|
-
}
|
74
|
-
|
75
|
-
void JsonVisitor::NodeFieldPrinter::printSingularPrimitiveField(
|
76
|
-
const char *fieldName,
|
77
|
-
const char *value) {
|
78
|
-
printFieldSeparator();
|
79
|
-
out_ << '"' << fieldName << R"(":)";
|
80
|
-
out_ << '"' << escape(value) << '"';
|
81
|
-
}
|
82
|
-
|
83
|
-
void JsonVisitor::NodeFieldPrinter::printSingularBooleanField(
|
84
|
-
const char *fieldName,
|
85
|
-
bool value) {
|
86
|
-
printFieldSeparator();
|
87
|
-
out_ << '"' << fieldName << R"(":)";
|
88
|
-
out_ << (value ? "true" : "false");
|
89
|
-
}
|
90
|
-
|
91
|
-
void JsonVisitor::NodeFieldPrinter::printSingularObjectField(const char *fieldName) {
|
92
|
-
printFieldSeparator();
|
93
|
-
out_ << '"' << fieldName << R"(":)";
|
94
|
-
assert(!visitor_.printed_.empty());
|
95
|
-
out_ << *nextChild_++;
|
96
|
-
}
|
97
|
-
|
98
|
-
void JsonVisitor::NodeFieldPrinter::printNullableSingularObjectField(
|
99
|
-
const char *fieldName,
|
100
|
-
const void *value) {
|
101
|
-
printFieldSeparator();
|
102
|
-
out_ << '"' << fieldName << R"(":)";
|
103
|
-
if (value != nullptr) {
|
104
|
-
assert(!visitor_.printed_.empty());
|
105
|
-
out_ << *nextChild_++;
|
106
|
-
} else {
|
107
|
-
out_ << "null";
|
108
|
-
}
|
109
|
-
}
|
110
|
-
|
111
|
-
// Method invariant: printed_ contains strings for this node's children.
|
112
|
-
void JsonVisitor::NodeFieldPrinter::printLocation(
|
113
|
-
std::ostringstream &out,
|
114
|
-
const yy::location &location)
|
115
|
-
{
|
116
|
-
out << R"({"start": {"line": )" << location.begin.line
|
117
|
-
<< R"(,"column":)" << location.begin.column
|
118
|
-
<< R"(}, "end": {"line":)" << location.end.line
|
119
|
-
<< R"(,"column":)" << location.end.column
|
120
|
-
<< "}}";
|
121
|
-
}
|
122
|
-
|
123
|
-
void JsonVisitor::NodeFieldPrinter::printChildList(
|
124
|
-
std::ostringstream &out,
|
125
|
-
const std::vector<std::string>::const_iterator &childIterator,
|
126
|
-
size_t numChildren) {
|
127
|
-
out << '[';
|
128
|
-
for (size_t ii = 0; ii < numChildren; ++ii) {
|
129
|
-
if (ii != 0) {
|
130
|
-
out << ',';
|
131
|
-
}
|
132
|
-
out << *(childIterator + ii);
|
133
|
-
}
|
134
|
-
out << ']';
|
135
|
-
}
|
136
|
-
|
137
|
-
JsonVisitor::JsonVisitor() {
|
138
|
-
printed_.emplace_back();
|
139
|
-
}
|
140
|
-
|
141
|
-
void JsonVisitor::visitNode() {
|
142
|
-
printed_.emplace_back();
|
143
|
-
}
|
144
|
-
|
145
|
-
void JsonVisitor::endVisitNode(std::string &&str) {
|
146
|
-
printed_.pop_back();
|
147
|
-
printed_.back().emplace_back(std::move(str));
|
148
|
-
}
|
149
|
-
|
150
|
-
std::string JsonVisitor::getResult() const {
|
151
|
-
assert(printed_.size() == 1);
|
152
|
-
assert(printed_[0].size() == 1);
|
153
|
-
return printed_[0][0];
|
154
|
-
}
|
155
|
-
|
156
|
-
#include "JsonVisitor.cpp.inc"
|
157
|
-
|
158
|
-
} // namespace visitor
|
159
|
-
} // namespace ast
|
160
|
-
} // namespace graphql
|
161
|
-
} // namespace facebook
|
@@ -1,121 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Copyright 2019-present, GraphQL Foundation
|
3
|
-
*
|
4
|
-
* This source code is licensed under the MIT license found in the
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
6
|
-
*/
|
7
|
-
|
8
|
-
#pragma once
|
9
|
-
|
10
|
-
#include "AstNode.h"
|
11
|
-
#include "AstVisitor.h"
|
12
|
-
|
13
|
-
#include <sstream>
|
14
|
-
#include <vector>
|
15
|
-
|
16
|
-
namespace facebook {
|
17
|
-
namespace graphql {
|
18
|
-
namespace ast {
|
19
|
-
namespace visitor {
|
20
|
-
|
21
|
-
/**
|
22
|
-
* Produces a JSON string describing the visited AST, in a format that
|
23
|
-
* would be a valid graphql-js AST when parsed.
|
24
|
-
*/
|
25
|
-
class JsonVisitor : public AstVisitor {
|
26
|
-
private:
|
27
|
-
using ChildrenList = std::vector<std::string>;
|
28
|
-
// Stack of lists of printed children.
|
29
|
-
// Postvisit method precondition: printed.back() contains strings
|
30
|
-
// for this node's children.
|
31
|
-
// Postvisit method postcondition: *(printed.rbegin() - 1) has had this
|
32
|
-
std::vector<ChildrenList> printed_;
|
33
|
-
|
34
|
-
// Interface to print fields for each kind of node.
|
35
|
-
// Note that, because of the post-order traversal for printing,
|
36
|
-
// field values need not be passed explicitly; they are grabbed from
|
37
|
-
// the passed-in visitor!
|
38
|
-
class NodeFieldPrinter {
|
39
|
-
private:
|
40
|
-
JsonVisitor &visitor_;
|
41
|
-
ChildrenList::const_iterator nextChild_;
|
42
|
-
std::ostringstream out_;
|
43
|
-
|
44
|
-
void printFieldSeparator();
|
45
|
-
|
46
|
-
// Prints a non-null array of n children from the given
|
47
|
-
// iterator. Does not update the iterator.
|
48
|
-
void printChildList(
|
49
|
-
std::ostringstream &out,
|
50
|
-
const std::vector<std::string>::const_iterator &childIterator,
|
51
|
-
size_t numChildren);
|
52
|
-
|
53
|
-
void printLocation(std::ostringstream &out, const yy::location &location);
|
54
|
-
|
55
|
-
public:
|
56
|
-
// Begin printing the fields for a node of the given kind at the
|
57
|
-
// given location.
|
58
|
-
NodeFieldPrinter(
|
59
|
-
JsonVisitor &visitor,
|
60
|
-
const char *nodeKind,
|
61
|
-
const Node &node);
|
62
|
-
|
63
|
-
std::string finishPrinting();
|
64
|
-
|
65
|
-
void printSingularPrimitiveField(const char *fieldName, const char *value);
|
66
|
-
void printSingularBooleanField(const char *fieldName, bool value);
|
67
|
-
void printSingularObjectField(const char *fieldName);
|
68
|
-
void printNullableSingularObjectField(const char *fieldName, const void *value);
|
69
|
-
|
70
|
-
template <typename T>
|
71
|
-
void printPluralField(
|
72
|
-
const char *fieldName,
|
73
|
-
const std::vector<std::unique_ptr<T>> &value) {
|
74
|
-
printFieldSeparator();
|
75
|
-
out_ << '"' << fieldName << "\":";
|
76
|
-
printChildList(out_, nextChild_, value.size());
|
77
|
-
nextChild_ += value.size();
|
78
|
-
}
|
79
|
-
|
80
|
-
template <typename T>
|
81
|
-
void printNullablePluralField(
|
82
|
-
const char *fieldName,
|
83
|
-
const std::vector<std::unique_ptr<T>> *value) {
|
84
|
-
printFieldSeparator();
|
85
|
-
out_ << '"' << fieldName << "\":";
|
86
|
-
if (value == nullptr) {
|
87
|
-
out_ << "null";
|
88
|
-
} else {
|
89
|
-
printChildList(out_, nextChild_, value->size());
|
90
|
-
nextChild_ += value->size();
|
91
|
-
}
|
92
|
-
}
|
93
|
-
};
|
94
|
-
|
95
|
-
// Must be called at the start of all visit methods for node types
|
96
|
-
// that have children. Maintains printed_.
|
97
|
-
void visitNode();
|
98
|
-
|
99
|
-
// Must be called at the end of all visit methods for node types
|
100
|
-
// that have children, passing the text for this node. Maintains
|
101
|
-
// printed_.
|
102
|
-
void endVisitNode(std::string &&str);
|
103
|
-
|
104
|
-
// Prints one of the many FooValue types that is prepresented with a
|
105
|
-
// single string.
|
106
|
-
template <typename ValueNode>
|
107
|
-
void endVisitValueRepresentedAsString(const char *valueKind, const ValueNode &value);
|
108
|
-
|
109
|
-
public:
|
110
|
-
JsonVisitor();
|
111
|
-
~JsonVisitor() {}
|
112
|
-
|
113
|
-
std::string getResult() const;
|
114
|
-
|
115
|
-
#include "JsonVisitor.h.inc"
|
116
|
-
};
|
117
|
-
|
118
|
-
}
|
119
|
-
}
|
120
|
-
}
|
121
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
MIT License
|
2
|
-
|
3
|
-
Copyright 2015-2018, Facebook, Inc.
|
4
|
-
Copyright 2019-present, GraphQL Foundation
|
5
|
-
|
6
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
of this software and associated documentation files (the "Software"), to deal
|
8
|
-
in the Software without restriction, including without limitation the rights
|
9
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
copies of the Software, and to permit persons to whom the Software is
|
11
|
-
furnished to do so, subject to the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be included in all
|
14
|
-
copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
22
|
-
SOFTWARE.
|
@@ -1,7 +0,0 @@
|
|
1
|
-
* readability-implicit-bool is disabled because I disagree with it.
|
2
|
-
|
3
|
-
* cppcoreguidelines-pro-type-reinterpret-cast is disabled because we use it
|
4
|
-
to implement our C API.
|
5
|
-
|
6
|
-
* cppcoreguidelines-pro-bounds-array-to-pointer-decay is disabled
|
7
|
-
because it fires a false positive on every use of assert().
|
@@ -1,84 +0,0 @@
|
|
1
|
-
# libgraphqlparser
|
2
|
-
|
3
|
-
libgraphqlparser is a parser for
|
4
|
-
[GraphQL](http://graphql.org/), a query language for describing data
|
5
|
-
requirements on complex application data models, implemented in C++11.
|
6
|
-
It can be used on its own in C++ code (or in C code via the pure C API
|
7
|
-
defined in the `c` subdirectory), or you can use it as the basis for an
|
8
|
-
extension module for your favorite programming language instead of writing
|
9
|
-
your own parser from scratch.
|
10
|
-
|
11
|
-
## Example
|
12
|
-
|
13
|
-
The provided `dump_json_ast` is a simple program that reads GraphQL
|
14
|
-
text on stdin and prints a JSON representation of the AST to stdout.
|
15
|
-
|
16
|
-
The `python` subdirectory contains an example Python binding for the
|
17
|
-
pure C API.
|
18
|
-
|
19
|
-
## Requirements
|
20
|
-
|
21
|
-
libgraphqlparser requires a C++ compiler that supports C++11. It
|
22
|
-
also requires Mac OS X or Linux.
|
23
|
-
|
24
|
-
To run tests, first, compile and install the library as described above. Then,
|
25
|
-
please download googletest from
|
26
|
-
https://github.com/google/googletest/archive/release-1.8.0.zip
|
27
|
-
and unzip it in the `test` subdirectory. In consequence, a folder
|
28
|
-
`googletest-release-1.8.0` should be contained in `test`. Next, within the
|
29
|
-
`test` folder, run `cmake .` and `make` to generate the `runTests` binary.
|
30
|
-
To execute the tests run `./test/runTests` from the main folder.
|
31
|
-
|
32
|
-
## Building libgraphqlparser
|
33
|
-
|
34
|
-
libgraphqlparser is built with [CMake](http://www.cmake.org/). If a
|
35
|
-
sufficiently-recent version of [Flex](http://flex.sourceforge.net/) and [Bison](http://www.gnu.org/software/bison/) are installed on your
|
36
|
-
system, it will use them; otherwise, it will rely on the checked-in
|
37
|
-
`parser.tab.{c,h}pp` and `lexer.{h,cpp}`.
|
38
|
-
|
39
|
-
To build libgraphqlparser from source:
|
40
|
-
|
41
|
-
```
|
42
|
-
$ # inside the project root:
|
43
|
-
$ cmake .
|
44
|
-
$ make
|
45
|
-
```
|
46
|
-
|
47
|
-
Then, to install it on your system:
|
48
|
-
|
49
|
-
```
|
50
|
-
$ make install
|
51
|
-
```
|
52
|
-
|
53
|
-
## How libgraphqlparser works
|
54
|
-
|
55
|
-
libgraphqlparser uses flex and bison to generate a C++ parser for
|
56
|
-
GraphQL. These tools work well but have idiosyncratic interfaces by
|
57
|
-
modern standards, so GraphQLParser.h provides a simple interface to
|
58
|
-
parse GraphQL.
|
59
|
-
|
60
|
-
In order to make it simpler to write code based around the GraphQL
|
61
|
-
AST, libgraphqlparser includes an extremely simple code generation
|
62
|
-
framework in the `ast/` subdirectory. This framework is used to build
|
63
|
-
the AST classes themselves, as well as a visitor over the AST. It may
|
64
|
-
be easier to understand the output of the generation steps directly
|
65
|
-
(i.e., Ast.h, Ast.cpp, and AstVisitor.h) rather than trying to read
|
66
|
-
the generation scripts. Simply building libgraphqlparser will cause
|
67
|
-
these files to be generated.
|
68
|
-
|
69
|
-
libgraphqlparser also uses the AST generation framework to build a
|
70
|
-
pure C API in the `c` subdirectory. This API can be used from C code,
|
71
|
-
and it should also simplify the task of creating bindings to other
|
72
|
-
programming languages.
|
73
|
-
|
74
|
-
## License
|
75
|
-
|
76
|
-
libgraphqlparser is MIT-licensed.
|
77
|
-
|
78
|
-
## Related Projects
|
79
|
-
|
80
|
-
- [graphql-parser (Ruby interface)](https://github.com/Shopify/graphql-parser)
|
81
|
-
- [py-graphqlparser (Python interface)](https://github.com/elastic-coders/py-graphqlparser)
|
82
|
-
- [graphql_parser (Elixir interface)](https://github.com/aarvay/graphql_parser)
|
83
|
-
- [graphql-parser-php (PHP interface)](https://github.com/dosten/graphql-parser-php)
|
84
|
-
- [graphql-libgraphqlparser (Ruby interface)](https://github.com/rmosolgo/graphql-libgraphqlparser-ruby)
|
@@ -1,203 +0,0 @@
|
|
1
|
-
# Copyright 2019-present, GraphQL Foundation
|
2
|
-
|
3
|
-
# Mini-language for AST definition.
|
4
|
-
# All AST nodes extend AstNode.
|
5
|
-
# All AST nodes are visitible.
|
6
|
-
# All AST fields have a getter and a setter and are a constructor argument.
|
7
|
-
# We have concrete types (code T) and unions (code U).
|
8
|
-
# S for singular field, P for plural, ? for nullable.
|
9
|
-
# O for option in a union.
|
10
|
-
# Scalar type ontology: string, boolean
|
11
|
-
|
12
|
-
# Definitions other than OperationDefinition and FragmentDefinition
|
13
|
-
# are experimental additions for schema parsing. (We don't support
|
14
|
-
# nested unions in the AST mini-language, so I've flattened and elided
|
15
|
-
# TypeSystemDefinition and TypeDefinition.)
|
16
|
-
U Definition
|
17
|
-
O OperationDefinition
|
18
|
-
O FragmentDefinition
|
19
|
-
O SchemaDefinition
|
20
|
-
O ScalarTypeDefinition
|
21
|
-
O ObjectTypeDefinition
|
22
|
-
O InterfaceTypeDefinition
|
23
|
-
O UnionTypeDefinition
|
24
|
-
O EnumTypeDefinition
|
25
|
-
O InputObjectTypeDefinition
|
26
|
-
O TypeExtensionDefinition
|
27
|
-
O DirectiveDefinition
|
28
|
-
|
29
|
-
|
30
|
-
T Document
|
31
|
-
P Definition definitions
|
32
|
-
|
33
|
-
T OperationDefinition
|
34
|
-
S OperationKind operation
|
35
|
-
S? Name name
|
36
|
-
P? VariableDefinition variableDefinitions
|
37
|
-
P? Directive directives
|
38
|
-
S SelectionSet selectionSet
|
39
|
-
|
40
|
-
T VariableDefinition
|
41
|
-
S Variable variable
|
42
|
-
S Type type
|
43
|
-
S? Value defaultValue
|
44
|
-
|
45
|
-
T SelectionSet
|
46
|
-
P Selection selections
|
47
|
-
|
48
|
-
U Selection
|
49
|
-
O Field
|
50
|
-
O FragmentSpread
|
51
|
-
O InlineFragment
|
52
|
-
|
53
|
-
T Field
|
54
|
-
S? Name alias
|
55
|
-
S Name name
|
56
|
-
P? Argument arguments
|
57
|
-
P? Directive directives
|
58
|
-
S? SelectionSet selectionSet
|
59
|
-
|
60
|
-
T Argument
|
61
|
-
S Name name
|
62
|
-
S Value value
|
63
|
-
|
64
|
-
T FragmentSpread
|
65
|
-
S Name name
|
66
|
-
P? Directive directives
|
67
|
-
|
68
|
-
T InlineFragment
|
69
|
-
S? NamedType typeCondition
|
70
|
-
P? Directive directives
|
71
|
-
S SelectionSet selectionSet
|
72
|
-
|
73
|
-
T FragmentDefinition
|
74
|
-
S Name name
|
75
|
-
S NamedType typeCondition
|
76
|
-
P? Directive directives
|
77
|
-
S SelectionSet selectionSet
|
78
|
-
|
79
|
-
U Value
|
80
|
-
O Variable
|
81
|
-
O IntValue
|
82
|
-
O FloatValue
|
83
|
-
O StringValue
|
84
|
-
O BooleanValue
|
85
|
-
O NullValue
|
86
|
-
O EnumValue
|
87
|
-
O ListValue
|
88
|
-
O ObjectValue
|
89
|
-
|
90
|
-
T Variable
|
91
|
-
S Name name
|
92
|
-
|
93
|
-
T IntValue
|
94
|
-
S string value
|
95
|
-
|
96
|
-
T FloatValue
|
97
|
-
S string value
|
98
|
-
|
99
|
-
T StringValue
|
100
|
-
S string value
|
101
|
-
|
102
|
-
T BooleanValue
|
103
|
-
S boolean value
|
104
|
-
|
105
|
-
T NullValue
|
106
|
-
|
107
|
-
T EnumValue
|
108
|
-
S string value
|
109
|
-
|
110
|
-
T ListValue
|
111
|
-
P Value values
|
112
|
-
|
113
|
-
T ObjectValue
|
114
|
-
P ObjectField fields
|
115
|
-
|
116
|
-
T ObjectField
|
117
|
-
S Name name
|
118
|
-
S Value value
|
119
|
-
|
120
|
-
T Directive
|
121
|
-
S Name name
|
122
|
-
P? Argument arguments
|
123
|
-
|
124
|
-
U Type
|
125
|
-
O NamedType
|
126
|
-
O ListType
|
127
|
-
O NonNullType
|
128
|
-
|
129
|
-
T NamedType
|
130
|
-
S Name name
|
131
|
-
|
132
|
-
T ListType
|
133
|
-
S Type type
|
134
|
-
|
135
|
-
T NonNullType
|
136
|
-
# JS version prohibits nesting nonnull in nonnull, we can't because we
|
137
|
-
# can't support multiple unions. Fix?
|
138
|
-
S Type type
|
139
|
-
|
140
|
-
T Name
|
141
|
-
S string value
|
142
|
-
|
143
|
-
T SchemaDefinition
|
144
|
-
P? Directive directives
|
145
|
-
P OperationTypeDefinition operationTypes
|
146
|
-
|
147
|
-
T OperationTypeDefinition
|
148
|
-
S OperationKind operation
|
149
|
-
S NamedType type
|
150
|
-
|
151
|
-
T ScalarTypeDefinition
|
152
|
-
S Name name
|
153
|
-
P? Directive directives
|
154
|
-
|
155
|
-
T ObjectTypeDefinition
|
156
|
-
S Name name
|
157
|
-
P? NamedType interfaces
|
158
|
-
P? Directive directives
|
159
|
-
P FieldDefinition fields
|
160
|
-
|
161
|
-
T FieldDefinition
|
162
|
-
S Name name
|
163
|
-
P? InputValueDefinition arguments
|
164
|
-
S Type type
|
165
|
-
P? Directive directives
|
166
|
-
|
167
|
-
T InputValueDefinition
|
168
|
-
S Name name
|
169
|
-
S Type type
|
170
|
-
S? Value defaultValue
|
171
|
-
P? Directive directives
|
172
|
-
|
173
|
-
T InterfaceTypeDefinition
|
174
|
-
S Name name
|
175
|
-
P? Directive directives
|
176
|
-
P FieldDefinition fields
|
177
|
-
|
178
|
-
T UnionTypeDefinition
|
179
|
-
S Name name
|
180
|
-
P? Directive directives
|
181
|
-
P NamedType types
|
182
|
-
|
183
|
-
T EnumTypeDefinition
|
184
|
-
S Name name
|
185
|
-
P? Directive directives
|
186
|
-
P EnumValueDefinition values
|
187
|
-
|
188
|
-
T EnumValueDefinition
|
189
|
-
S Name name
|
190
|
-
P? Directive directives
|
191
|
-
|
192
|
-
T InputObjectTypeDefinition
|
193
|
-
S Name name
|
194
|
-
P? Directive directives
|
195
|
-
P InputValueDefinition fields
|
196
|
-
|
197
|
-
T TypeExtensionDefinition
|
198
|
-
S ObjectTypeDefinition definition
|
199
|
-
|
200
|
-
T DirectiveDefinition
|
201
|
-
S Name name
|
202
|
-
P? InputValueDefinition arguments
|
203
|
-
P Name locations
|
@@ -1,61 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python
|
2
|
-
# Copyright 2019-present, GraphQL Foundation
|
3
|
-
#
|
4
|
-
# This source code is licensed under the MIT license found in the
|
5
|
-
# LICENSE file in the root directory of this source tree.
|
6
|
-
|
7
|
-
from importlib import import_module
|
8
|
-
|
9
|
-
def load_lang(lang):
|
10
|
-
return import_module(lang).Printer()
|
11
|
-
|
12
|
-
|
13
|
-
def print_ast(lang_module, input_file):
|
14
|
-
lang_module.start_file()
|
15
|
-
line = input_file.readline()
|
16
|
-
while line:
|
17
|
-
line = line.strip()
|
18
|
-
if line.startswith('#') or not line:
|
19
|
-
line = input_file.readline()
|
20
|
-
continue
|
21
|
-
|
22
|
-
code, rest = line.split(None, 1)
|
23
|
-
if code[0] == 'T':
|
24
|
-
lang_module.start_type(rest)
|
25
|
-
field_line = input_file.readline().strip()
|
26
|
-
while field_line:
|
27
|
-
if field_line.startswith('#'):
|
28
|
-
field_line = input_file.readline().strip()
|
29
|
-
continue
|
30
|
-
field_kind, field_type, field_name = field_line.split()
|
31
|
-
nullable = len(field_kind) > 1 and field_kind[1] == '?'
|
32
|
-
if field_kind[0] == 'S':
|
33
|
-
plural = False
|
34
|
-
elif field_kind[0] == 'P':
|
35
|
-
plural = True
|
36
|
-
else:
|
37
|
-
raise Error('Unknown field kind: ' + field_kind)
|
38
|
-
lang_module.field(field_type, field_name, nullable, plural)
|
39
|
-
field_line = input_file.readline().strip()
|
40
|
-
lang_module.end_type(rest)
|
41
|
-
elif code[0] == 'U':
|
42
|
-
lang_module.start_union(rest)
|
43
|
-
field_line = input_file.readline().strip()
|
44
|
-
while field_line:
|
45
|
-
option_code, option_type = field_line.split()
|
46
|
-
if option_code != 'O':
|
47
|
-
raise Error('Unknown code in union: ' + option_code)
|
48
|
-
lang_module.union_option(option_type)
|
49
|
-
field_line = input_file.readline().strip()
|
50
|
-
lang_module.end_union(rest)
|
51
|
-
line = input_file.readline()
|
52
|
-
|
53
|
-
lang_module.end_file()
|
54
|
-
if __name__ == '__main__':
|
55
|
-
import sys
|
56
|
-
lang = sys.argv[1]
|
57
|
-
filename = sys.argv[2]
|
58
|
-
|
59
|
-
lang_module = load_lang(lang)
|
60
|
-
|
61
|
-
print_ast(lang_module, open(filename, 'r'))
|