Skip to content

Commit 092328b

Browse files
authored
multi line strings support (graphql-java#706)
* First commit of multi line strings. It doesn't have multi line comments yet * End to end test * Added description concept to the type definitions * Schema Generator now supports docstring syntax as a preference * Refactored out the StringValue parsing into its own class * SchemaPrinter now has AST description support * whitespace if defined as ' ' and '\t' in graphql * Fix ups after merging master
1 parent 1741b0f commit 092328b

22 files changed

Lines changed: 834 additions & 163 deletions

‎src/main/antlr/Graphql.g4‎

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,27 +62,35 @@ typeCondition : 'on' typeName;
6262
name: NAME | FRAGMENT | QUERY | MUTATION | SUBSCRIPTION | SCHEMA | SCALAR | TYPE | INTERFACE | IMPLEMENTS | ENUM | UNION | INPUT | EXTEND | DIRECTIVE;
6363

6464
value :
65+
stringValue |
6566
IntValue |
6667
FloatValue |
67-
StringValue |
6868
BooleanValue |
6969
NullValue |
7070
enumValue |
7171
arrayValue |
7272
objectValue;
7373

74+
7475
valueWithVariable :
7576
variable |
77+
stringValue |
7678
IntValue |
7779
FloatValue |
78-
StringValue |
7980
BooleanValue |
8081
NullValue |
8182
enumValue |
8283
arrayValueWithVariable |
8384
objectValueWithVariable;
8485

8586

87+
stringValue
88+
: TripleQuotedStringValue
89+
| StringValue
90+
;
91+
92+
description : stringValue;
93+
8694
enumValue : name ;
8795

8896
// Array Value
@@ -115,16 +123,16 @@ nonNullType: typeName '!' | listType '!';
115123

116124

117125
// Type System
118-
typeSystemDefinition:
126+
typeSystemDefinition: description?
119127
schemaDefinition |
120128
typeDefinition |
121129
typeExtensionDefinition |
122130
directiveDefinition
123131
;
124132

125-
schemaDefinition : SCHEMA directives? '{' operationTypeDefinition+ '}';
133+
schemaDefinition : description? SCHEMA directives? '{' operationTypeDefinition+ '}';
126134

127-
operationTypeDefinition : operationType ':' typeName;
135+
operationTypeDefinition : description? operationType ':' typeName;
128136

129137
typeDefinition:
130138
scalarTypeDefinition |
@@ -135,36 +143,40 @@ enumTypeDefinition |
135143
inputObjectTypeDefinition
136144
;
137145

138-
scalarTypeDefinition : SCALAR name directives?;
146+
scalarTypeDefinition : description? SCALAR name directives?;
139147

140-
objectTypeDefinition : TYPE name implementsInterfaces? directives? '{' fieldDefinition+ '}';
148+
objectTypeDefinition : description? TYPE name implementsInterfaces? directives? '{' fieldDefinition+ '}';
141149

142150
implementsInterfaces : IMPLEMENTS typeName+;
143151

144-
fieldDefinition : name argumentsDefinition? ':' type directives?;
152+
fieldDefinition : description? name argumentsDefinition? ':' type directives?;
145153

146154
argumentsDefinition : '(' inputValueDefinition+ ')';
147155

148-
inputValueDefinition : name ':' type defaultValue? directives?;
156+
inputValueDefinition : description? name ':' type defaultValue? directives?;
149157

150-
interfaceTypeDefinition : INTERFACE name directives? '{' fieldDefinition+ '}';
158+
interfaceTypeDefinition : description? INTERFACE name directives? '{' fieldDefinition+ '}';
151159

152-
unionTypeDefinition : UNION name directives? '=' unionMembers;
160+
unionTypeDefinition : description? UNION name directives? '=' unionMembers;
153161

154162
unionMembers:
155163
typeName |
156164
unionMembers '|' typeName
157165
;
158166

159-
enumTypeDefinition : ENUM name directives? '{' enumValueDefinition+ '}';
167+
enumTypeDefinition : description? ENUM name directives? '{' enumValueDefinition+ '}';
160168

161-
enumValueDefinition : enumValue directives?;
169+
enumValueDefinition : description? enumValue directives?;
162170

163-
inputObjectTypeDefinition : INPUT name directives? '{' inputValueDefinition+ '}';
171+
inputObjectTypeDefinition : description? INPUT name directives? '{' inputValueDefinition+ '}';
164172

173+
//
174+
// type extensions dont get "description" strings according to reference implementation
175+
// https://github.com/graphql/graphql-js/pull/927/files#diff-b9370666fe8cd9ff4dd53e89e60d26afR182
176+
//
165177
typeExtensionDefinition : EXTEND objectTypeDefinition;
166178

167-
directiveDefinition : DIRECTIVE '@' name argumentsDefinition? 'on' directiveLocations;
179+
directiveDefinition : description? DIRECTIVE '@' name argumentsDefinition? 'on' directiveLocations;
168180

169181
directiveLocation : name;
170182

@@ -212,7 +224,19 @@ ExponentPart : ('e'|'E') Sign? Digit+;
212224
Digit : '0'..'9';
213225

214226

215-
StringValue: '"' (~(["\\\n\r\u2028\u2029])|EscapedChar)* '"';
227+
StringValue
228+
: '"' ( ~["\\\n\r\u2028\u2029] | EscapedChar )* '"'
229+
;
230+
231+
TripleQuotedStringValue
232+
: '"""' TripleQuotedStringPart? '"""'
233+
;
234+
235+
236+
// Fragments never become a token of their own: they are only used inside other lexer rules
237+
fragment TripleQuotedStringPart : ( EscapedTripleQuote | SourceCharacter )+?;
238+
fragment EscapedTripleQuote : '\\"""';
239+
fragment SourceCharacter :[\u0009\u000A\u000D\u0020-\uFFFF];
216240
217241
Comment: '#' ~[\n\r\u2028\u2029]* -> channel(2);
218242
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package graphql.language;
2+
3+
public class Description {
4+
public final String content;
5+
public final SourceLocation sourceLocation;
6+
public final boolean multiLine;
7+
8+
public Description(String content, SourceLocation sourceLocation, boolean multiLine) {
9+
this.content = content;
10+
this.sourceLocation = sourceLocation;
11+
this.multiLine = multiLine;
12+
}
13+
14+
public String getContent() {
15+
return content;
16+
}
17+
18+
public SourceLocation getSourceLocation() {
19+
return sourceLocation;
20+
}
21+
22+
public boolean isMultiLine() {
23+
return multiLine;
24+
}
25+
}

‎src/main/java/graphql/language/DirectiveDefinition.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
public class DirectiveDefinition extends AbstractNode<DirectiveDefinition> implements Definition<DirectiveDefinition> {
88
private final String name;
9+
private Description description;
910
private final List<InputValueDefinition> inputValueDefinitions;
1011
private final List<DirectiveLocation> directiveLocations;
1112

@@ -23,6 +24,14 @@ public String getName() {
2324
return name;
2425
}
2526

27+
public Description getDescription() {
28+
return description;
29+
}
30+
31+
public void setDescription(Description description) {
32+
this.description = description;
33+
}
34+
2635
public List<InputValueDefinition> getInputValueDefinitions() {
2736
return inputValueDefinitions;
2837
}

‎src/main/java/graphql/language/EnumTypeDefinition.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
public class EnumTypeDefinition extends AbstractNode<EnumTypeDefinition> implements TypeDefinition<EnumTypeDefinition> {
1010
private final String name;
11+
private Description description;
1112
private final List<EnumValueDefinition> enumValueDefinitions;
1213
private final List<Directive> directives;
1314

@@ -47,6 +48,14 @@ public String getName() {
4748
return name;
4849
}
4950

51+
public Description getDescription() {
52+
return description;
53+
}
54+
55+
public void setDescription(Description description) {
56+
this.description = description;
57+
}
58+
5059
@Override
5160
public List<Node> getChildren() {
5261
List<Node> result = new ArrayList<>();

‎src/main/java/graphql/language/EnumValueDefinition.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
public class EnumValueDefinition extends AbstractNode<EnumValueDefinition> {
99
private final String name;
10+
private Description description;
1011
private final List<Directive> directives;
1112

1213
public EnumValueDefinition(String name) {
@@ -22,6 +23,14 @@ public String getName() {
2223
return name;
2324
}
2425

26+
public Description getDescription() {
27+
return description;
28+
}
29+
30+
public void setDescription(Description description) {
31+
this.description = description;
32+
}
33+
2534
public List<Directive> getDirectives() {
2635
return directives;
2736
}

‎src/main/java/graphql/language/FieldDefinition.java‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
public class FieldDefinition extends AbstractNode<FieldDefinition> {
1111
private final String name;
1212
private Type type;
13+
private Description description;
1314
private final List<InputValueDefinition> inputValueDefinitions;
1415
private final List<Directive> directives;
1516

@@ -40,6 +41,14 @@ public String getName() {
4041
return name;
4142
}
4243

44+
public Description getDescription() {
45+
return description;
46+
}
47+
48+
public void setDescription(Description description) {
49+
this.description = description;
50+
}
51+
4352
public List<InputValueDefinition> getInputValueDefinitions() {
4453
return inputValueDefinitions;
4554
}
@@ -73,7 +82,7 @@ public boolean isEqualTo(Node o) {
7382

7483
FieldDefinition that = (FieldDefinition) o;
7584

76-
return NodeUtil.isEqualTo(this.name, that.name);
85+
return NodeUtil.isEqualTo(this.name,that.name) ;
7786
}
7887

7988
@Override

‎src/main/java/graphql/language/InputObjectTypeDefinition.java‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
public class InputObjectTypeDefinition extends AbstractNode<InputObjectTypeDefinition> implements TypeDefinition<InputObjectTypeDefinition> {
1111
private final String name;
12+
private Description description;
1213
private final List<Directive> directives;
1314
private final List<InputValueDefinition> inputValueDefinitions;
1415

@@ -43,6 +44,14 @@ public String getName() {
4344
return name;
4445
}
4546

47+
public Description getDescription() {
48+
return description;
49+
}
50+
51+
public void setDescription(Description description) {
52+
this.description = description;
53+
}
54+
4655
@Override
4756
public List<Node> getChildren() {
4857
List<Node> result = new ArrayList<>();
@@ -58,8 +67,8 @@ public boolean isEqualTo(Node o) {
5867

5968
InputObjectTypeDefinition that = (InputObjectTypeDefinition) o;
6069

61-
return NodeUtil.isEqualTo(this.name, that.name);
62-
}
70+
return NodeUtil.isEqualTo(this.name,that.name) ;
71+
}
6372

6473
@Override
6574
public InputObjectTypeDefinition deepCopy() {

‎src/main/java/graphql/language/InputValueDefinition.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class InputValueDefinition extends AbstractNode<InputValueDefinition> {
1111
private final String name;
1212
private Type type;
1313
private Value defaultValue;
14+
private Description description;
1415
private final List<Directive> directives;
1516

1617
public InputValueDefinition(String name) {
@@ -44,6 +45,14 @@ public String getName() {
4445
return name;
4546
}
4647

48+
public Description getDescription() {
49+
return description;
50+
}
51+
52+
public void setDescription(Description description) {
53+
this.description = description;
54+
}
55+
4756
public Value getDefaultValue() {
4857
return defaultValue;
4958
}

‎src/main/java/graphql/language/InterfaceTypeDefinition.java‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
public class InterfaceTypeDefinition extends AbstractNode<InterfaceTypeDefinition> implements TypeDefinition<InterfaceTypeDefinition> {
1111
private final String name;
12+
private Description description;
1213
private final List<FieldDefinition> definitions;
1314
private final List<Directive> directives;
1415

@@ -43,6 +44,14 @@ public String getName() {
4344
return name;
4445
}
4546

47+
public Description getDescription() {
48+
return description;
49+
}
50+
51+
public void setDescription(Description description) {
52+
this.description = description;
53+
}
54+
4655
@Override
4756
public List<Node> getChildren() {
4857
List<Node> result = new ArrayList<>();
@@ -58,7 +67,7 @@ public boolean isEqualTo(Node o) {
5867

5968
InterfaceTypeDefinition that = (InterfaceTypeDefinition) o;
6069

61-
return NodeUtil.isEqualTo(this.name, that.name);
70+
return NodeUtil.isEqualTo(this.name,that.name) ;
6271
}
6372

6473
@Override

‎src/main/java/graphql/language/ObjectTypeDefinition.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
public class ObjectTypeDefinition extends AbstractNode<ObjectTypeDefinition> implements TypeDefinition<ObjectTypeDefinition> {
1111
private String name;
12+
private Description description;
1213
private final List<Type> implementz;
1314
private final List<Directive> directives;
1415
private final List<FieldDefinition> fieldDefinitions;
@@ -53,6 +54,14 @@ public void setName(String name) {
5354
this.name = name;
5455
}
5556

57+
public Description getDescription() {
58+
return description;
59+
}
60+
61+
public void setDescription(Description description) {
62+
this.description = description;
63+
}
64+
5665
@Override
5766
public List<Node> getChildren() {
5867
List<Node> result = new ArrayList<>();

0 commit comments

Comments
 (0)