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,55 +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 "c/GraphQLAstVisitor.h"
|
9
|
-
#include "AstVisitor.h"
|
10
|
-
|
11
|
-
using namespace facebook::graphql::ast; // NOLINT
|
12
|
-
|
13
|
-
#include "c/GraphQLAstForEachConcreteType.h"
|
14
|
-
|
15
|
-
#define DECLARE_VISIT(type, snake_type) \
|
16
|
-
bool visit##type(const type &node) override; \
|
17
|
-
void endVisit##type(const type &node) override;
|
18
|
-
|
19
|
-
class CVisitorBridge : public visitor::AstVisitor {
|
20
|
-
const struct GraphQLAstVisitorCallbacks *callbacks_;
|
21
|
-
void *userData_;
|
22
|
-
public:
|
23
|
-
explicit CVisitorBridge(const struct GraphQLAstVisitorCallbacks *callbacks,
|
24
|
-
void *userData)
|
25
|
-
: callbacks_(callbacks), userData_(userData) {}
|
26
|
-
|
27
|
-
FOR_EACH_CONCRETE_TYPE(DECLARE_VISIT)
|
28
|
-
};
|
29
|
-
|
30
|
-
#define IMPLEMENT_VISIT(type, snake_type) \
|
31
|
-
bool CVisitorBridge::visit##type(const type &node) { \
|
32
|
-
if (callbacks_->visit_##snake_type) { \
|
33
|
-
return callbacks_->visit_##snake_type( \
|
34
|
-
(const struct GraphQLAst##type *)&node, userData_); \
|
35
|
-
} \
|
36
|
-
return true; \
|
37
|
-
} \
|
38
|
-
void CVisitorBridge::endVisit##type(const type &node) { \
|
39
|
-
if (callbacks_->end_visit_##snake_type) { \
|
40
|
-
callbacks_->end_visit_##snake_type( \
|
41
|
-
(const struct GraphQLAst##type *)&node, userData_); \
|
42
|
-
} \
|
43
|
-
}
|
44
|
-
|
45
|
-
FOR_EACH_CONCRETE_TYPE(IMPLEMENT_VISIT)
|
46
|
-
|
47
|
-
void graphql_node_visit(const struct GraphQLAstNode *node,
|
48
|
-
const struct GraphQLAstVisitorCallbacks *callbacks,
|
49
|
-
void *userData)
|
50
|
-
{
|
51
|
-
CVisitorBridge visitor(callbacks, userData);
|
52
|
-
if (node) {
|
53
|
-
reinterpret_cast<const facebook::graphql::ast::Node *>(node)->accept(&visitor);
|
54
|
-
}
|
55
|
-
}
|
@@ -1,53 +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 "c/GraphQLAst.h"
|
11
|
-
#include "c/GraphQLAstForEachConcreteType.h"
|
12
|
-
|
13
|
-
#ifdef __cplusplus
|
14
|
-
extern "C" {
|
15
|
-
#endif
|
16
|
-
|
17
|
-
#define TYPEDEFS(type, snake_type) \
|
18
|
-
typedef int (*visit_##snake_type##_func)(const struct GraphQLAst##type *snake_type, void *user_data); \
|
19
|
-
typedef void (*end_visit_##snake_type##_func)(const struct GraphQLAst##type *snake_type, void *user_data);
|
20
|
-
|
21
|
-
FOR_EACH_CONCRETE_TYPE(TYPEDEFS)
|
22
|
-
|
23
|
-
#define FUNC_MEMBER(type, snake_type) \
|
24
|
-
visit_##snake_type##_func visit_##snake_type; \
|
25
|
-
end_visit_##snake_type##_func end_visit_##snake_type;
|
26
|
-
/**
|
27
|
-
* Functions to be called when particular AST nodes are encountered.
|
28
|
-
* visit_* functions are called in pre-order, and may return non-zero to
|
29
|
-
* continue recursing into children (if any), or zero to skip them. end_visit_*
|
30
|
-
* functions are called in post-order. Any particular function may be set to
|
31
|
-
* NULL to indicate that the caller is not interested in the corresponding type
|
32
|
-
* of AST node. (NULL visit_* functions act as though they simply returned
|
33
|
-
* non-zero.)
|
34
|
-
*/
|
35
|
-
struct GraphQLAstVisitorCallbacks {
|
36
|
-
FOR_EACH_CONCRETE_TYPE(FUNC_MEMBER)
|
37
|
-
};
|
38
|
-
|
39
|
-
struct GraphQLAstNode;
|
40
|
-
|
41
|
-
/**
|
42
|
-
* Walk the AST rooted at the given node, issuing callbacks from the given
|
43
|
-
* callbacks struct as appropriate. userData will be passed as the userData
|
44
|
-
* argument to each callback.
|
45
|
-
*/
|
46
|
-
void graphql_node_visit(const struct GraphQLAstNode *node,
|
47
|
-
const struct GraphQLAstVisitorCallbacks *callbacks,
|
48
|
-
void *userData);
|
49
|
-
|
50
|
-
#ifdef __cplusplus
|
51
|
-
}
|
52
|
-
#endif
|
53
|
-
|
@@ -1,35 +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 "GraphQLParser.h"
|
9
|
-
#include "../GraphQLParser.h"
|
10
|
-
#include "../AstNode.h"
|
11
|
-
|
12
|
-
#include <cstdlib>
|
13
|
-
|
14
|
-
struct GraphQLAstNode *graphql_parse_string(const char *text, const char **error) {
|
15
|
-
return reinterpret_cast<struct GraphQLAstNode *>(facebook::graphql::parseString(text, error).release());
|
16
|
-
}
|
17
|
-
|
18
|
-
struct GraphQLAstNode *graphql_parse_string_with_experimental_schema_support(
|
19
|
-
const char *text, const char **error) {
|
20
|
-
return reinterpret_cast<struct GraphQLAstNode *>(facebook::graphql::parseStringWithExperimentalSchemaSupport(
|
21
|
-
text, error).release());
|
22
|
-
}
|
23
|
-
|
24
|
-
struct GraphQLAstNode *graphql_parse_file(FILE *file, const char **error) {
|
25
|
-
return reinterpret_cast<struct GraphQLAstNode *>(facebook::graphql::parseFile(file, error).release());
|
26
|
-
}
|
27
|
-
|
28
|
-
struct GraphQLAstNode *graphql_parse_file_with_experimental_schema_support(
|
29
|
-
FILE *file, const char **error) {
|
30
|
-
return reinterpret_cast<struct GraphQLAstNode *>(facebook::graphql::parseFileWithExperimentalSchemaSupport(file, error).release());
|
31
|
-
}
|
32
|
-
|
33
|
-
void graphql_error_free(const char *error) {
|
34
|
-
std::free((void *)(error)); // NOLINT
|
35
|
-
}
|
@@ -1,54 +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 <stdio.h>
|
11
|
-
|
12
|
-
#ifdef __cplusplus
|
13
|
-
extern "C" {
|
14
|
-
#endif
|
15
|
-
|
16
|
-
/**
|
17
|
-
* This file provides C wrappers for ../GraphQLParser.h.
|
18
|
-
*/
|
19
|
-
|
20
|
-
struct GraphQLAstNode;
|
21
|
-
|
22
|
-
/**
|
23
|
-
* Parse the given GraphQL source string, returning an AST. Returns
|
24
|
-
* NULL on error. Return value must be freed with
|
25
|
-
* graphql_node_free(). If NULL is returned and error is not NULL, an
|
26
|
-
* error message is placed in error and must be freed with
|
27
|
-
* graphql_error_free().
|
28
|
-
*/
|
29
|
-
struct GraphQLAstNode *graphql_parse_string(
|
30
|
-
const char *text, const char **error);
|
31
|
-
|
32
|
-
struct GraphQLAstNode *graphql_parse_string_with_experimental_schema_support(
|
33
|
-
const char *text, const char **error);
|
34
|
-
|
35
|
-
/**
|
36
|
-
* Read and parse GraphQL source from the given file, returning an
|
37
|
-
* AST. Returns nullptr on error. Return value must be freed with
|
38
|
-
* graphql_node_free(). If NULL is returned and error is not NULL, an
|
39
|
-
* error message is placed in error and must be freed with
|
40
|
-
* graphql_error_free().
|
41
|
-
*/
|
42
|
-
struct GraphQLAstNode *graphql_parse_file(FILE *file, const char **error);
|
43
|
-
|
44
|
-
struct GraphQLAstNode *graphql_parse_file_with_experimental_schema_support(
|
45
|
-
FILE *file, const char **error);
|
46
|
-
|
47
|
-
/**
|
48
|
-
* Frees an error.
|
49
|
-
*/
|
50
|
-
void graphql_error_free(const char *error);
|
51
|
-
|
52
|
-
#ifdef __cplusplus
|
53
|
-
}
|
54
|
-
#endif
|
@@ -1,48 +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 "AstNode.h"
|
9
|
-
#include "GraphQLParser.h"
|
10
|
-
#include "c/GraphQLAstToJSON.h"
|
11
|
-
|
12
|
-
#include <cstdio>
|
13
|
-
#include <cstdlib>
|
14
|
-
#include <iostream>
|
15
|
-
|
16
|
-
|
17
|
-
using std::cout;
|
18
|
-
using std::cerr;
|
19
|
-
using std::endl;
|
20
|
-
using std::fopen;
|
21
|
-
using std::fclose;
|
22
|
-
using std::free;
|
23
|
-
|
24
|
-
|
25
|
-
int main(int argc, char **argv) {
|
26
|
-
const char *error;
|
27
|
-
FILE * in;
|
28
|
-
if (argc > 1) {
|
29
|
-
in = fopen(argv[1], "r"); // NOLINT
|
30
|
-
} else {
|
31
|
-
in = stdin;
|
32
|
-
}
|
33
|
-
auto AST = facebook::graphql::parseFile(in, &error);
|
34
|
-
if (argc > 1) {
|
35
|
-
fclose(in);
|
36
|
-
}
|
37
|
-
if (!AST) {
|
38
|
-
cerr << "Parser failed with error: " << error << endl;
|
39
|
-
free((void *)error); // NOLINT
|
40
|
-
return 1;
|
41
|
-
}
|
42
|
-
|
43
|
-
const char *json = graphql_ast_to_json(reinterpret_cast<const struct GraphQLAstNode *>(AST.get()));
|
44
|
-
puts(json);
|
45
|
-
free((void *)json); // NOLINT
|
46
|
-
|
47
|
-
return 0;
|
48
|
-
}
|
data/ext/graphqlparser/lexer.lpp
DELETED
@@ -1,324 +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
|
-
%{
|
9
|
-
#include <algorithm>
|
10
|
-
#include <cassert>
|
11
|
-
#include <cctype>
|
12
|
-
#include <climits>
|
13
|
-
#include <cstdio>
|
14
|
-
#include <string>
|
15
|
-
#include <vector>
|
16
|
-
#include "location.hh"
|
17
|
-
#include "position.hh"
|
18
|
-
#include "parser.tab.hpp"
|
19
|
-
#include "syntaxdefs.h"
|
20
|
-
|
21
|
-
// Keep track of token lengths.
|
22
|
-
#define YY_USER_ACTION yyextra->loc.columns(yyleng);
|
23
|
-
|
24
|
-
static void escape(char c, char *buf);
|
25
|
-
|
26
|
-
static std::string clean_up_block_string(const std::string &str);
|
27
|
-
|
28
|
-
%}
|
29
|
-
|
30
|
-
%option bison-bridge bison-locations
|
31
|
-
%option noyywrap batch noinput nounput
|
32
|
-
%option reentrant
|
33
|
-
%option extra-type="struct LexerExtra *"
|
34
|
-
|
35
|
-
%x STRING_STATE
|
36
|
-
%x BLOCK_STRING_STATE
|
37
|
-
%x C_COMMENT_STATE
|
38
|
-
%x LINE_COMMENT_STATE
|
39
|
-
|
40
|
-
FLOAT -?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?
|
41
|
-
INTEGER -?(0|[1-9][0-9]*)
|
42
|
-
IDENTIFIER [_A-Za-z][_0-9A-Za-z]*
|
43
|
-
VARIABLE $[_0-9A-Za-z]+
|
44
|
-
BOM \xef\xbb\xbf
|
45
|
-
CRLF \r\n
|
46
|
-
BADCHAR [\x00-\x08\x0b\x0c\x0e-\x1f]
|
47
|
-
GOODCHAR [^\x00-\x08\x0b\x0c\x0e-\x1f]
|
48
|
-
STRINGCHAR [^\x00-\x1f\\\x22]
|
49
|
-
|
50
|
-
blank [ \t,]
|
51
|
-
newline [\n\r]
|
52
|
-
notnewline [^\n\r]
|
53
|
-
|
54
|
-
%%
|
55
|
-
|
56
|
-
%{
|
57
|
-
yyextra->loc.step();
|
58
|
-
%}
|
59
|
-
|
60
|
-
<STRING_STATE>{
|
61
|
-
\" {
|
62
|
-
BEGIN(INITIAL);
|
63
|
-
yylval->str = yyextra->str.c_str();
|
64
|
-
*yylloc = yyextra->loc;
|
65
|
-
return yy::GraphQLParserImpl::token::TOK_STRING;
|
66
|
-
}
|
67
|
-
|
68
|
-
{newline} {
|
69
|
-
throw make_error(yyextra->loc, "Unterminated string");
|
70
|
-
}
|
71
|
-
|
72
|
-
<<EOF>> {
|
73
|
-
throw make_error(yyextra->loc, "Unterminated string at EOF");
|
74
|
-
}
|
75
|
-
|
76
|
-
{STRINGCHAR}+ {
|
77
|
-
char *p = yytext;
|
78
|
-
while (*p) {
|
79
|
-
yyextra->str.push_back(*p++);
|
80
|
-
}
|
81
|
-
}
|
82
|
-
|
83
|
-
\\\" { yyextra->str.push_back('"'); }
|
84
|
-
\\\\ { yyextra->str.push_back('\\'); }
|
85
|
-
\\\/ { yyextra->str.push_back('/'); }
|
86
|
-
\\n { yyextra->str.push_back('\n'); }
|
87
|
-
\\t { yyextra->str.push_back('\t'); }
|
88
|
-
\\r { yyextra->str.push_back('\r'); }
|
89
|
-
\\b { yyextra->str.push_back('\b'); }
|
90
|
-
\\f { yyextra->str.push_back('\f'); }
|
91
|
-
|
92
|
-
\\u[0-9A-Fa-f]{4} {
|
93
|
-
int ch;
|
94
|
-
sscanf(yytext + 2, "%x", &ch);
|
95
|
-
yyextra->str.push_back(ch);
|
96
|
-
}
|
97
|
-
|
98
|
-
\\u { throw make_error(yyextra->loc, "bad Unicode escape sequence"); }
|
99
|
-
\\. { throw make_error(yyextra->loc, std::string("bad escape sequence \\") + yytext[1]); }
|
100
|
-
|
101
|
-
}
|
102
|
-
|
103
|
-
<BLOCK_STRING_STATE>{
|
104
|
-
<<EOF>> {
|
105
|
-
throw make_error(yyextra->loc, "Unterminated block string at EOF");
|
106
|
-
}
|
107
|
-
|
108
|
-
{BADCHAR} {
|
109
|
-
throw make_error(yyextra->loc, std::string("Invalid character ") + yytext[0]);
|
110
|
-
}
|
111
|
-
|
112
|
-
{GOODCHAR} {
|
113
|
-
/* Can't use {GOODCHAR}+ because that would be a better match for
|
114
|
-
""" than the explicit rule! */
|
115
|
-
yyextra->str.push_back(*yytext);
|
116
|
-
}
|
117
|
-
|
118
|
-
\\\"\"\" {
|
119
|
-
yyextra->str.append(3, '"');
|
120
|
-
}
|
121
|
-
|
122
|
-
\"\"\" {
|
123
|
-
BEGIN(INITIAL);
|
124
|
-
yyextra->str = clean_up_block_string(yyextra->str);
|
125
|
-
yylval->str = yyextra->str.c_str();
|
126
|
-
*yylloc = yyextra->loc;
|
127
|
-
return yy::GraphQLParserImpl::token::TOK_STRING;
|
128
|
-
}
|
129
|
-
}
|
130
|
-
|
131
|
-
<LINE_COMMENT_STATE>{
|
132
|
-
{CRLF} { yyextra->loc.lines(yyleng / 2); yyextra->loc.step(); BEGIN(INITIAL); }
|
133
|
-
{newline} { yyextra->loc.lines(yyleng); yyextra->loc.step(); BEGIN(INITIAL); }
|
134
|
-
{notnewline}+ /* eat comment character */
|
135
|
-
}
|
136
|
-
|
137
|
-
<INITIAL>{
|
138
|
-
{blank}+ { yyextra->loc.step(); }
|
139
|
-
{BOM}+ { yyextra->loc.step(); yyextra->loc.step(); yyextra->loc.step(); }
|
140
|
-
{CRLF}+ { yyextra->loc.lines(yyleng / 2); yyextra->loc.step(); }
|
141
|
-
{newline}+ { yyextra->loc.lines(yyleng); yyextra->loc.step(); }
|
142
|
-
|
143
|
-
# {yyextra->loc.step(); BEGIN(LINE_COMMENT_STATE); }
|
144
|
-
|
145
|
-
directive { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_DIRECTIVE; }
|
146
|
-
enum { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_ENUM; }
|
147
|
-
extend { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_EXTEND; }
|
148
|
-
false { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_FALSE; }
|
149
|
-
fragment { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_FRAGMENT; }
|
150
|
-
implements { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_IMPLEMENTS; }
|
151
|
-
input { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_INPUT; }
|
152
|
-
interface { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_INTERFACE; }
|
153
|
-
mutation { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_MUTATION; }
|
154
|
-
null { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_NULL; }
|
155
|
-
on { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_ON; }
|
156
|
-
query { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_QUERY; }
|
157
|
-
scalar { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_SCALAR; }
|
158
|
-
schema { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_SCHEMA; }
|
159
|
-
subscription { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_SUBSCRIPTION; }
|
160
|
-
true { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_TRUE; }
|
161
|
-
type { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_TYPE; }
|
162
|
-
union { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_UNION; }
|
163
|
-
|
164
|
-
{INTEGER} { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_INTEGER; }
|
165
|
-
{FLOAT} { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_FLOAT; }
|
166
|
-
{IDENTIFIER} { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_IDENTIFIER; }
|
167
|
-
{VARIABLE} { yylval->str = yytext + 1; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_VARIABLE; }
|
168
|
-
|
169
|
-
"!" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_BANG; }
|
170
|
-
"(" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_LPAREN; }
|
171
|
-
")" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_RPAREN; }
|
172
|
-
"..." { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_ELLIPSIS; }
|
173
|
-
":" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_COLON; }
|
174
|
-
"=" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_EQUAL; }
|
175
|
-
"@" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_AT; }
|
176
|
-
"[" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_LBRACKET; }
|
177
|
-
"]" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_RBRACKET; }
|
178
|
-
"{" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_LBRACE; }
|
179
|
-
"|" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_PIPE; }
|
180
|
-
"}" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_RBRACE; }
|
181
|
-
|
182
|
-
|
183
|
-
<<EOF>> { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_EOF; }
|
184
|
-
|
185
|
-
\"\"\" {
|
186
|
-
BEGIN(BLOCK_STRING_STATE);
|
187
|
-
yyextra->str.clear();
|
188
|
-
}
|
189
|
-
|
190
|
-
\" {
|
191
|
-
BEGIN(STRING_STATE);
|
192
|
-
yyextra->str.clear();
|
193
|
-
}
|
194
|
-
}
|
195
|
-
|
196
|
-
<INITIAL,STRING_STATE,LINE_COMMENT_STATE>. {
|
197
|
-
char buf[6];
|
198
|
-
escape(yytext[0], buf);
|
199
|
-
throw make_error(
|
200
|
-
yyextra->loc,
|
201
|
-
std::string("unrecognized character ") + buf);
|
202
|
-
}
|
203
|
-
|
204
|
-
%%
|
205
|
-
|
206
|
-
static void escape(char c, char *buf) {
|
207
|
-
if (std::isgraph(c)) {
|
208
|
-
*buf = c;
|
209
|
-
buf[1] = '\0';
|
210
|
-
} else {
|
211
|
-
buf[0] = '\\';
|
212
|
-
buf[2] = '\0';
|
213
|
-
switch (c) {
|
214
|
-
case '\a':
|
215
|
-
buf[1] = 'a';
|
216
|
-
break;
|
217
|
-
case '\b':
|
218
|
-
buf[1] = 'b';
|
219
|
-
break;
|
220
|
-
case '\f':
|
221
|
-
buf[1] = 'f';
|
222
|
-
break;
|
223
|
-
case '\n':
|
224
|
-
buf[1] = 'n';
|
225
|
-
break;
|
226
|
-
case '\r':
|
227
|
-
buf[1] = 'r';
|
228
|
-
break;
|
229
|
-
case '\t':
|
230
|
-
buf[1] = 't';
|
231
|
-
break;
|
232
|
-
case '\v':
|
233
|
-
buf[1] = 'v';
|
234
|
-
break;
|
235
|
-
default:
|
236
|
-
buf[1] = 'x';
|
237
|
-
std::snprintf(buf + 2, 3, "%x", ((int)c & 0xFF));
|
238
|
-
break;
|
239
|
-
}
|
240
|
-
}
|
241
|
-
}
|
242
|
-
|
243
|
-
static std::vector<std::string> splitLines(const std::string &str) {
|
244
|
-
std::vector<std::string> lines;
|
245
|
-
auto it = str.begin();
|
246
|
-
while (it != str.end()) {
|
247
|
-
static char terminators[2] = {'\r', '\n'};
|
248
|
-
auto nextIt = std::find_first_of(it, str.end(), terminators, terminators + sizeof(terminators));
|
249
|
-
lines.emplace_back(str.data() + (it - str.begin()), nextIt - it);
|
250
|
-
if (nextIt != str.end()) {
|
251
|
-
auto advancedIt = nextIt + 1;
|
252
|
-
if (advancedIt != str.end()) {
|
253
|
-
if (*nextIt == '\r' && *advancedIt == '\n') {
|
254
|
-
++advancedIt;
|
255
|
-
}
|
256
|
-
}
|
257
|
-
nextIt = std::move(advancedIt);
|
258
|
-
}
|
259
|
-
it = std::move(nextIt);
|
260
|
-
}
|
261
|
-
return lines;
|
262
|
-
}
|
263
|
-
|
264
|
-
static int count_leading_whitespace(const std::string &str) {
|
265
|
-
auto pos = str.find_first_not_of(" \t", 0, strlen(" \t"));
|
266
|
-
if (pos == std::string::npos) {
|
267
|
-
return str.length();
|
268
|
-
}
|
269
|
-
return pos;
|
270
|
-
}
|
271
|
-
|
272
|
-
static bool is_all_whitespace(const std::string &str) {
|
273
|
-
return count_leading_whitespace(str) == str.length();
|
274
|
-
}
|
275
|
-
|
276
|
-
static std::string clean_up_block_string(const std::string &str) {
|
277
|
-
auto lines = splitLines(str);
|
278
|
-
bool first = true;
|
279
|
-
int commonIndent = INT_MAX;
|
280
|
-
for (const auto &line : lines) {
|
281
|
-
if (first) {
|
282
|
-
first = false;
|
283
|
-
continue;
|
284
|
-
}
|
285
|
-
const auto indent = count_leading_whitespace(line);
|
286
|
-
if (indent < line.length()) {
|
287
|
-
if (indent < commonIndent) {
|
288
|
-
commonIndent = indent;
|
289
|
-
}
|
290
|
-
}
|
291
|
-
}
|
292
|
-
if (commonIndent != INT_MAX) {
|
293
|
-
first = true;
|
294
|
-
for (auto &line : lines) {
|
295
|
-
if (first) {
|
296
|
-
first = false;
|
297
|
-
continue;
|
298
|
-
}
|
299
|
-
line.erase(0, commonIndent);
|
300
|
-
}
|
301
|
-
}
|
302
|
-
|
303
|
-
const auto firstNonBlankIt = std::find_if(lines.begin(), lines.end(), [](const std::string &line) {
|
304
|
-
return !is_all_whitespace(line);
|
305
|
-
});
|
306
|
-
lines.erase(lines.begin(), firstNonBlankIt);
|
307
|
-
|
308
|
-
const auto firstNonBlankReverseIt = std::find_if(lines.rbegin(), lines.rend(), [](const std::string &line) {
|
309
|
-
return !is_all_whitespace(line);
|
310
|
-
});
|
311
|
-
lines.erase(lines.end() - (firstNonBlankReverseIt - lines.rbegin()), lines.end());
|
312
|
-
|
313
|
-
std::string formatted;
|
314
|
-
first = true;
|
315
|
-
for (const auto &line: lines) {
|
316
|
-
if (first) {
|
317
|
-
first = false;
|
318
|
-
} else {
|
319
|
-
formatted.push_back('\n');
|
320
|
-
}
|
321
|
-
formatted.append(line);
|
322
|
-
}
|
323
|
-
return formatted;
|
324
|
-
}
|