X Tutup
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions src/main/java/graphql/parser/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import graphql.Internal;
import graphql.PublicApi;
import graphql.language.Document;
import graphql.language.FieldDefinition;
import graphql.language.Node;
import graphql.language.SourceLocation;
import graphql.language.Type;
Expand Down Expand Up @@ -100,6 +101,19 @@ public static Value<?> parseValue(String input) throws InvalidSyntaxException {
return new Parser().parseValueImpl(input);
}

/**
* Parses a string input into a graphql AST {@link FieldDefinition}
*
* @param input the input to parse
*
* @return an AST {@link FieldDefinition}
*
* @throws InvalidSyntaxException if the input is not valid graphql syntax
*/
public static FieldDefinition parseFieldDefinition(String input) throws InvalidSyntaxException {
return new Parser().parseFieldDefinitionImpl(input);
}

/**
* Parses a string input into a graphql AST Type
*
Expand Down Expand Up @@ -201,6 +215,21 @@ private Type<?> parseTypeImpl(String input) throws InvalidSyntaxException {
return (Type<?>) parseImpl(parserEnvironment, nodeFunction);
}

private FieldDefinition parseFieldDefinitionImpl(String input) throws InvalidSyntaxException {
BiFunction<GraphqlParser, GraphqlAntlrToLanguage, Object[]> nodeFunction = (parser, toLanguage) -> {
final GraphqlParser.FieldDefinitionContext documentContext = parser.fieldDefinition();
FieldDefinition value = toLanguage.createFieldDefinition(documentContext);
return new Object[]{documentContext, value};
};
MultiSourceReader multiSourceReader = MultiSourceReader.newMultiSourceReader()
.string(input, null)
.trackData(true)
.build();

ParserEnvironment parserEnvironment = ParserEnvironment.newParserEnvironment().document(multiSourceReader).build();
return (FieldDefinition) parseImpl(parserEnvironment, nodeFunction);
}

private Node<?> parseImpl(ParserEnvironment environment, BiFunction<GraphqlParser, GraphqlAntlrToLanguage, Object[]> nodeFunction) throws InvalidSyntaxException {
// default in the parser options if they are not set
ParserOptions parserOptions = environment.getParserOptions();
Expand Down
39 changes: 26 additions & 13 deletions src/test/groovy/graphql/parser/ParserTest.groovy
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package graphql.parser


import graphql.language.Argument
import graphql.language.ArrayValue
import graphql.language.AstComparator
Expand Down Expand Up @@ -46,8 +45,6 @@ import spock.lang.Issue
import spock.lang.Specification
import spock.lang.Unroll

import static graphql.parser.ParserEnvironment.*

class ParserTest extends Specification {

def "parse anonymous simple query"() {
Expand Down Expand Up @@ -384,7 +381,7 @@ class ParserTest extends Specification {
.build()

when:
def parserEnvironment = newParserEnvironment().document(input).parserOptions(parserOptionsWithoutCaptureLineComments).build()
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).parserOptions(parserOptionsWithoutCaptureLineComments).build()
def document = new Parser().parseDocument(parserEnvironment)
Field helloField = (document.definitions[0] as OperationDefinition).selectionSet.selections[0] as Field

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

def parserEnvironment = newParserEnvironment().document(input).parserOptions(captureIgnoredCharsTRUE).build()
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).parserOptions(captureIgnoredCharsTRUE).build()

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

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

@Unroll
def 'parse ast field definition #valueLiteral'() {
expect:
def fieldDefinition = Parser.parseFieldDefinition(valueLiteral)
AstPrinter.printAstCompact(fieldDefinition) == valueLiteral

where:
valueLiteral | _
'foo: Foo' | _
'foo(a:String): Foo' | _
'foo(a:String!,b:Int!): Foo' | _
'foo(a:String! ="defaultValue",b:Int!): Foo' | _
'foo(a:String!,b:Int!): Foo @directive(someValue:String)' | _
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about the failure case - what happens when it fails to parse? Will it throw and exception and if so lets lock that in with a test



@Unroll
def 'parse ast literals #valueLiteral'() {
expect:
Expand Down Expand Up @@ -1026,7 +1039,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""
def captureIgnoredCharsTRUE = ParserOptions.newParserOptions().captureIgnoredChars(true).build()

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

when: "explicitly on"

parserEnvironment = newParserEnvironment().document(s).parserOptions(captureIgnoredCharsTRUE).build()
parserEnvironment = ParserEnvironment.newParserEnvironment().document(s).parserOptions(captureIgnoredCharsTRUE).build()
doc = new Parser().parseDocument(parserEnvironment)
type = doc.getDefinitionsOfType(ObjectTypeDefinition)[0]

Expand Down Expand Up @@ -1143,7 +1156,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""

when:
options = ParserOptions.newParserOptions().captureSourceLocation(false).build()
def parserEnvironment = newParserEnvironment().document("{ f }").parserOptions(options).build()
def parserEnvironment = ParserEnvironment.newParserEnvironment().document("{ f }").parserOptions(options).build()
document = new Parser().parseDocument(parserEnvironment)

then:
Expand All @@ -1154,7 +1167,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""

def "escape characters correctly printed when printing AST"() {
given:
def env = newParserEnvironment()
def env = ParserEnvironment.newParserEnvironment()
.document(src)
.parserOptions(
ParserOptions.newParserOptions()
Expand Down Expand Up @@ -1201,7 +1214,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""

when: // Enable redacted parser error messages
def redactParserErrorMessages = ParserOptions.newParserOptions().redactTokenParserErrorMessages(true).build()
def parserEnvironment = newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
new Parser().parseDocument(parserEnvironment)

then:
Expand All @@ -1225,7 +1238,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""

when: // Enable redacted parser error messages
def redactParserErrorMessages = ParserOptions.newParserOptions().redactTokenParserErrorMessages(true).build()
def parserEnvironment = newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
new Parser().parseDocument(parserEnvironment)

then:
Expand All @@ -1247,7 +1260,7 @@ triple3 : """edge cases \\""" "" " \\"" \\" edge cases"""

when: // Enable redacted parser error messages
def redactParserErrorMessages = ParserOptions.newParserOptions().redactTokenParserErrorMessages(true).build()
def parserEnvironment = newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
def parserEnvironment = ParserEnvironment.newParserEnvironment().document(input).parserOptions(redactParserErrorMessages).build()
new Parser().parseDocument(parserEnvironment)

then:
Expand Down
X Tutup