Skip to content

Commit c4c1b51

Browse files
committed
add method to parse field definition from Parser
1 parent a637b9b commit c4c1b51

File tree

2 files changed

+55
-13
lines changed

2 files changed

+55
-13
lines changed

src/main/java/graphql/parser/Parser.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import graphql.Internal;
55
import graphql.PublicApi;
66
import graphql.language.Document;
7+
import graphql.language.FieldDefinition;
78
import graphql.language.Node;
89
import graphql.language.SourceLocation;
910
import graphql.language.Type;
@@ -100,6 +101,19 @@ public static Value<?> parseValue(String input) throws InvalidSyntaxException {
100101
return new Parser().parseValueImpl(input);
101102
}
102103

104+
/**
105+
* Parses a string input into a graphql AST {@link FieldDefinition}
106+
*
107+
* @param input the input to parse
108+
*
109+
* @return an AST {@link FieldDefinition}
110+
*
111+
* @throws InvalidSyntaxException if the input is not valid graphql syntax
112+
*/
113+
public static FieldDefinition parseFieldDefinition(String input) throws InvalidSyntaxException {
114+
return new Parser().parseFieldDefinitionImpl(input);
115+
}
116+
103117
/**
104118
* Parses a string input into a graphql AST Type
105119
*
@@ -201,6 +215,21 @@ private Type<?> parseTypeImpl(String input) throws InvalidSyntaxException {
201215
return (Type<?>) parseImpl(parserEnvironment, nodeFunction);
202216
}
203217

218+
private FieldDefinition parseFieldDefinitionImpl(String input) throws InvalidSyntaxException {
219+
BiFunction<GraphqlParser, GraphqlAntlrToLanguage, Object[]> nodeFunction = (parser, toLanguage) -> {
220+
final GraphqlParser.FieldDefinitionContext documentContext = parser.fieldDefinition();
221+
FieldDefinition value = toLanguage.createFieldDefinition(documentContext);
222+
return new Object[]{documentContext, value};
223+
};
224+
MultiSourceReader multiSourceReader = MultiSourceReader.newMultiSourceReader()
225+
.string(input, null)
226+
.trackData(true)
227+
.build();
228+
229+
ParserEnvironment parserEnvironment = ParserEnvironment.newParserEnvironment().document(multiSourceReader).build();
230+
return (FieldDefinition) parseImpl(parserEnvironment, nodeFunction);
231+
}
232+
204233
private Node<?> parseImpl(ParserEnvironment environment, BiFunction<GraphqlParser, GraphqlAntlrToLanguage, Object[]> nodeFunction) throws InvalidSyntaxException {
205234
// default in the parser options if they are not set
206235
ParserOptions parserOptions = environment.getParserOptions();

src/test/groovy/graphql/parser/ParserTest.groovy

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package graphql.parser
22

3-
43
import graphql.language.Argument
54
import graphql.language.ArrayValue
65
import graphql.language.AstComparator
@@ -46,8 +45,6 @@ import spock.lang.Issue
4645
import spock.lang.Specification
4746
import spock.lang.Unroll
4847

49-
import static graphql.parser.ParserEnvironment.*
50-
5148
class ParserTest extends Specification {
5249

5350
def "parse anonymous simple query"() {
@@ -384,7 +381,7 @@ class ParserTest extends Specification {
384381
.build()
385382

386383
when:
387-
def parserEnvironment = newParserEnvironment().document(input).parserOptions(parserOptionsWithoutCaptureLineComments).build()
384+
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).parserOptions(parserOptionsWithoutCaptureLineComments).build()
388385
def document = new Parser().parseDocument(parserEnvironment)
389386
Field helloField = (document.definitions[0] as OperationDefinition).selectionSet.selections[0] as Field
390387

@@ -753,7 +750,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
753750
when:
754751
def captureIgnoredCharsTRUE = ParserOptions.newParserOptions().captureIgnoredChars(true).build()
755752

756-
def parserEnvironment = newParserEnvironment().document(input).parserOptions(captureIgnoredCharsTRUE).build()
753+
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).parserOptions(captureIgnoredCharsTRUE).build()
757754

758755
Document document = new Parser().parseDocument(parserEnvironment)
759756
def field = (document.definitions[0] as OperationDefinition).selectionSet.selections[0]
@@ -851,7 +848,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
851848
}
852849
'''
853850
when:
854-
def parserEnvironment = newParserEnvironment().document(input).build()
851+
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).build()
855852

856853
Document document = Parser.parse(parserEnvironment)
857854
OperationDefinition operationDefinition = (document.definitions[0] as OperationDefinition)
@@ -964,6 +961,22 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
964961
'1.2e3e' | _
965962
}
966963

964+
@Unroll
965+
def 'parse ast field definition #valueLiteral'() {
966+
expect:
967+
def fieldDefinition = Parser.parseFieldDefinition(valueLiteral)
968+
AstPrinter.printAstCompact(fieldDefinition) == valueLiteral
969+
970+
where:
971+
valueLiteral | _
972+
'foo: Foo' | _
973+
'foo(a:String): Foo' | _
974+
'foo(a:String!,b:Int!): Foo' | _
975+
'foo(a:String! ="defaultValue",b:Int!): Foo' | _
976+
'foo(a:String!,b:Int!): Foo @directive(someValue:String)' | _
977+
}
978+
979+
967980
@Unroll
968981
def 'parse ast literals #valueLiteral'() {
969982
expect:
@@ -1026,7 +1039,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
10261039
def captureIgnoredCharsTRUE = ParserOptions.newParserOptions().captureIgnoredChars(true).build()
10271040

10281041
when: "explicitly off"
1029-
def parserEnvironment = newParserEnvironment().document(s).parserOptions(captureIgnoredCharsFALSE).build()
1042+
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(s).parserOptions(captureIgnoredCharsFALSE).build()
10301043
def doc = new Parser().parseDocument(parserEnvironment)
10311044
def type = doc.getDefinitionsOfType(ObjectTypeDefinition)[0]
10321045
then:
@@ -1042,7 +1055,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
10421055

10431056
when: "explicitly on"
10441057

1045-
parserEnvironment = newParserEnvironment().document(s).parserOptions(captureIgnoredCharsTRUE).build()
1058+
parserEnvironment = ParserEnvironment.newParserEnvironment().document(s).parserOptions(captureIgnoredCharsTRUE).build()
10461059
doc = new Parser().parseDocument(parserEnvironment)
10471060
type = doc.getDefinitionsOfType(ObjectTypeDefinition)[0]
10481061

@@ -1143,7 +1156,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
11431156

11441157
when:
11451158
options = ParserOptions.newParserOptions().captureSourceLocation(false).build()
1146-
def parserEnvironment = newParserEnvironment().document("{ f }").parserOptions(options).build()
1159+
def parserEnvironment = ParserEnvironment.newParserEnvironment().document("{ f }").parserOptions(options).build()
11471160
document = new Parser().parseDocument(parserEnvironment)
11481161

11491162
then:
@@ -1154,7 +1167,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
11541167

11551168
def "escape characters correctly printed when printing AST"() {
11561169
given:
1157-
def env = newParserEnvironment()
1170+
def env = ParserEnvironment.newParserEnvironment()
11581171
.document(src)
11591172
.parserOptions(
11601173
ParserOptions.newParserOptions()
@@ -1201,7 +1214,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
12011214

12021215
when: // Enable redacted parser error messages
12031216
def redactParserErrorMessages = ParserOptions.newParserOptions().redactTokenParserErrorMessages(true).build()
1204-
def parserEnvironment = newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
1217+
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
12051218
new Parser().parseDocument(parserEnvironment)
12061219

12071220
then:
@@ -1225,7 +1238,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
12251238

12261239
when: // Enable redacted parser error messages
12271240
def redactParserErrorMessages = ParserOptions.newParserOptions().redactTokenParserErrorMessages(true).build()
1228-
def parserEnvironment = newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
1241+
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
12291242
new Parser().parseDocument(parserEnvironment)
12301243

12311244
then:
@@ -1247,7 +1260,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
12471260

12481261
when: // Enable redacted parser error messages
12491262
def redactParserErrorMessages = ParserOptions.newParserOptions().redactTokenParserErrorMessages(true).build()
1250-
def parserEnvironment = newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
1263+
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
12511264
new Parser().parseDocument(parserEnvironment)
12521265

12531266
then:

0 commit comments

Comments
 (0)