From c6ecd527ac979e4f2e06d2abdfcafd7b3854119a Mon Sep 17 00:00:00 2001 From: Steven Chaitoff Date: Fri, 22 Apr 2022 14:58:29 -0700 Subject: [PATCH] Print fragment variables Reviewed By: mjmahone Differential Revision: D35746920 fbshipit-source-id: 2f4573c2afa1bfa3536572e7dd4ce6f47fae4664 --- .../graphql-text-printer/src/print_to_text.rs | 20 ++++++++------ .../fixtures/fragment_variables.expected | 27 +++++++++++++++++++ .../print/fixtures/fragment_variables.graphql | 11 ++++++++ .../graphql-text-printer/tests/print/mod.rs | 11 ++++++-- .../graphql-text-printer/tests/print_test.rs | 9 ++++++- 5 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 compiler/crates/graphql-text-printer/tests/print/fixtures/fragment_variables.expected create mode 100644 compiler/crates/graphql-text-printer/tests/print/fixtures/fragment_variables.graphql diff --git a/compiler/crates/graphql-text-printer/src/print_to_text.rs b/compiler/crates/graphql-text-printer/src/print_to_text.rs index ad0b772bba2f8..a1c5afd8564be 100644 --- a/compiler/crates/graphql-text-printer/src/print_to_text.rs +++ b/compiler/crates/graphql-text-printer/src/print_to_text.rs @@ -5,14 +5,14 @@ * LICENSE file in the root directory of this source tree. */ -use common::{Named, WithLocation}; +use common::{Named, NamedItem, WithLocation}; use graphql_ir::{ Argument, Condition, ConditionValue, ConstantValue, Directive, ExecutableDefinition, FragmentDefinition, FragmentSpread, InlineFragment, LinkedField, OperationDefinition, ScalarField, Selection, Value, VariableDefinition, }; use graphql_syntax::OperationKind; -use intern::string_key::StringKey; +use intern::string_key::{Intern, StringKey}; use schema::{SDLSchema, Schema}; use std::fmt::{Result as FmtResult, Write}; @@ -187,12 +187,16 @@ impl<'schema, 'writer, W: Write> Printer<'schema, 'writer, W> { fn print_fragment(mut self, fragment: &FragmentDefinition) -> FmtResult { let fragment_name = fragment.name.item; let type_condition_name = self.schema.get_type_name(fragment.type_condition); - write!( - self.writer, - "fragment {} on {}", - fragment_name, type_condition_name - ) - .unwrap(); + write!(self.writer, "fragment {}", fragment_name)?; + if fragment + .directives + .named("argumentDefinitions".intern()) + .is_none() + { + self.print_variable_definitions(&fragment.variable_definitions)?; + } + write!(self.writer, " on {}", type_condition_name)?; + self.print_directives( &fragment.directives, None, diff --git a/compiler/crates/graphql-text-printer/tests/print/fixtures/fragment_variables.expected b/compiler/crates/graphql-text-printer/tests/print/fixtures/fragment_variables.expected new file mode 100644 index 0000000000000..1b49cb78ec32b --- /dev/null +++ b/compiler/crates/graphql-text-printer/tests/print/fixtures/fragment_variables.expected @@ -0,0 +1,27 @@ +==================================== INPUT ==================================== +fragment MyFragment($some_arg: String, $another_arg: [Int]!) on Query { + my_alias: node(id: $id) { + id + ... on User { + name + likers(first: $count) { + count + } + } + } +} +==================================== OUTPUT =================================== +fragment MyFragment( + $some_arg: String + $another_arg: [Int]! +) on Query { + my_alias: node(id: $id) { + id + ... on User { + name + likers(first: $count) { + count + } + } + } +} diff --git a/compiler/crates/graphql-text-printer/tests/print/fixtures/fragment_variables.graphql b/compiler/crates/graphql-text-printer/tests/print/fixtures/fragment_variables.graphql new file mode 100644 index 0000000000000..17c4062af981f --- /dev/null +++ b/compiler/crates/graphql-text-printer/tests/print/fixtures/fragment_variables.graphql @@ -0,0 +1,11 @@ +fragment MyFragment($some_arg: String, $another_arg: [Int]!) on Query { + my_alias: node(id: $id) { + id + ... on User { + name + likers(first: $count) { + count + } + } + } +} diff --git a/compiler/crates/graphql-text-printer/tests/print/mod.rs b/compiler/crates/graphql-text-printer/tests/print/mod.rs index d87d99fa78847..519bf761686d9 100644 --- a/compiler/crates/graphql-text-printer/tests/print/mod.rs +++ b/compiler/crates/graphql-text-printer/tests/print/mod.rs @@ -8,13 +8,20 @@ use common::SourceLocationKey; use fixture_tests::Fixture; use graphql_ir::build; -use graphql_syntax::parse_executable; +use graphql_syntax::{parse_executable_with_features, ParserFeatures}; use graphql_text_printer::print_ir; use relay_test_schema::TEST_SCHEMA; pub fn transform_fixture(fixture: &Fixture<'_>) -> Result { let source_location = SourceLocationKey::standalone(fixture.file_name); - let ast = parse_executable(fixture.content, source_location).unwrap(); + let ast = parse_executable_with_features( + fixture.content, + source_location, + ParserFeatures { + enable_variable_definitions: true, + }, + ) + .unwrap(); build(&TEST_SCHEMA, &ast.definitions) .map(|definitions| print_ir(&TEST_SCHEMA, &definitions).join("\n\n")) .map_err(|errors| { diff --git a/compiler/crates/graphql-text-printer/tests/print_test.rs b/compiler/crates/graphql-text-printer/tests/print_test.rs index 878a60f7a3971..85e7f6f5dda39 100644 --- a/compiler/crates/graphql-text-printer/tests/print_test.rs +++ b/compiler/crates/graphql-text-printer/tests/print_test.rs @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ mod print; @@ -75,6 +75,13 @@ fn empty_args() { test_fixture(transform_fixture, "empty_args.graphql", "print/fixtures/empty_args.expected", input, expected); } +#[test] +fn fragment_variables() { + let input = include_str!("print/fixtures/fragment_variables.graphql"); + let expected = include_str!("print/fixtures/fragment_variables.expected"); + test_fixture(transform_fixture, "fragment_variables.graphql", "print/fixtures/fragment_variables.expected", input, expected); +} + #[test] fn kitchen_sink() { let input = include_str!("print/fixtures/kitchen-sink.graphql");