Skip to content

Commit cfd210b

Browse files
authored
Merge pull request graphql-java#1774 from Sajan-99/introspection-result-to-schema-handle-descriptions
Use descriptions instead of comments for AstPrinter and IntrospectionResultToSchema
2 parents e33c252 + 848f19b commit cfd210b

16 files changed

Lines changed: 124 additions & 190 deletions

src/main/java/graphql/introspection/IntrospectionResultToSchema.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import graphql.PublicApi;
55
import graphql.language.Argument;
66
import graphql.language.AstValueHelper;
7-
import graphql.language.Comment;
7+
import graphql.language.Description;
88
import graphql.language.Directive;
99
import graphql.language.Document;
1010
import graphql.language.EnumTypeDefinition;
@@ -145,7 +145,7 @@ UnionTypeDefinition createUnion(Map<String, Object> input) {
145145

146146
UnionTypeDefinition.Builder unionTypeDefinition = UnionTypeDefinition.newUnionTypeDefinition();
147147
unionTypeDefinition.name((String) input.get("name"));
148-
unionTypeDefinition.comments(toComment((String) input.get("description")));
148+
unionTypeDefinition.description(toDescription(input));
149149

150150
List<Map<String, Object>> possibleTypes = (List<Map<String, Object>>) input.get("possibleTypes");
151151

@@ -162,14 +162,14 @@ EnumTypeDefinition createEnum(Map<String, Object> input) {
162162
assertTrue(input.get("kind").equals("ENUM"), "wrong input");
163163

164164
EnumTypeDefinition.Builder enumTypeDefinition = EnumTypeDefinition.newEnumTypeDefinition().name((String) input.get("name"));
165-
enumTypeDefinition.comments(toComment((String) input.get("description")));
165+
enumTypeDefinition.description(toDescription(input));
166166

167167
List<Map<String, Object>> enumValues = (List<Map<String, Object>>) input.get("enumValues");
168168

169169
for (Map<String, Object> enumValue : enumValues) {
170170

171171
EnumValueDefinition.Builder enumValueDefinition = EnumValueDefinition.newEnumValueDefinition().name((String) enumValue.get("name"));
172-
enumValueDefinition.comments(toComment((String) enumValue.get("description")));
172+
enumTypeDefinition.description(toDescription(input));
173173

174174
createDeprecatedDirective(enumValue, enumValueDefinition);
175175

@@ -184,7 +184,7 @@ InterfaceTypeDefinition createInterface(Map<String, Object> input) {
184184
assertTrue(input.get("kind").equals("INTERFACE"), "wrong input");
185185

186186
InterfaceTypeDefinition.Builder interfaceTypeDefinition = InterfaceTypeDefinition.newInterfaceTypeDefinition().name((String) input.get("name"));
187-
interfaceTypeDefinition.comments(toComment((String) input.get("description")));
187+
interfaceTypeDefinition.description(toDescription(input));
188188
List<Map<String, Object>> fields = (List<Map<String, Object>>) input.get("fields");
189189
interfaceTypeDefinition.definitions(createFields(fields));
190190

@@ -198,7 +198,7 @@ InputObjectTypeDefinition createInputObject(Map<String, Object> input) {
198198

199199
InputObjectTypeDefinition.Builder inputObjectTypeDefinition = InputObjectTypeDefinition.newInputObjectDefinition()
200200
.name((String) input.get("name"))
201-
.comments(toComment((String) input.get("description")));
201+
.description(toDescription(input));
202202

203203
List<Map<String, Object>> fields = (List<Map<String, Object>>) input.get("inputFields");
204204
List<InputValueDefinition> inputValueDefinitions = createInputValueDefinitions(fields);
@@ -212,7 +212,7 @@ ObjectTypeDefinition createObject(Map<String, Object> input) {
212212
assertTrue(input.get("kind").equals("OBJECT"), "wrong input");
213213

214214
ObjectTypeDefinition.Builder objectTypeDefinition = ObjectTypeDefinition.newObjectTypeDefinition().name((String) input.get("name"));
215-
objectTypeDefinition.comments(toComment((String) input.get("description")));
215+
objectTypeDefinition.description(toDescription(input));
216216
if (input.containsKey("interfaces")) {
217217
objectTypeDefinition.implementz(
218218
((List<Map<String, Object>>) input.get("interfaces")).stream()
@@ -231,7 +231,7 @@ private List<FieldDefinition> createFields(List<Map<String, Object>> fields) {
231231
List<FieldDefinition> result = new ArrayList<>();
232232
for (Map<String, Object> field : fields) {
233233
FieldDefinition.Builder fieldDefinition = FieldDefinition.newFieldDefinition().name((String) field.get("name"));
234-
fieldDefinition.comments(toComment((String) field.get("description")));
234+
fieldDefinition.description(toDescription(field));
235235
fieldDefinition.type(createTypeIndirection((Map<String, Object>) field.get("type")));
236236

237237
createDeprecatedDirective(field, fieldDefinition);
@@ -264,7 +264,7 @@ private List<InputValueDefinition> createInputValueDefinitions(List<Map<String,
264264
for (Map<String, Object> arg : args) {
265265
Type argType = createTypeIndirection((Map<String, Object>) arg.get("type"));
266266
InputValueDefinition.Builder inputValueDefinition = InputValueDefinition.newInputValueDefinition().name((String) arg.get("name")).type(argType);
267-
inputValueDefinition.comments(toComment((String) arg.get("description")));
267+
inputValueDefinition.description(toDescription(arg));
268268

269269
String valueLiteral = (String) arg.get("defaultValue");
270270
if (valueLiteral != null) {
@@ -296,18 +296,18 @@ private Type createTypeIndirection(Map<String, Object> type) {
296296
}
297297
}
298298

299-
private List<Comment> toComment(String description) {
299+
private Description toDescription(Map<String, Object> input) {
300+
String description = (String) input.get("description");
300301
if (description == null) {
301-
return Collections.emptyList();
302+
return null;
302303
}
303-
List<Comment> comments = new ArrayList<>();
304+
304305
String[] lines = description.split("\n");
305-
int lineNumber = 0;
306-
for (String line : lines) {
307-
Comment comment = new Comment(line, new SourceLocation(++lineNumber, 1));
308-
comments.add(comment);
306+
if (lines.length > 1) {
307+
return new Description(description, null, true);
308+
} else {
309+
return new Description(description, null, false);
309310
}
310-
return comments;
311311
}
312312

313313
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package graphql.language;
2+
3+
import graphql.PublicApi;
4+
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
@PublicApi
9+
public abstract class AbstractDescribedNode<T extends Node> extends AbstractNode<T> implements DescribedNode<T> {
10+
11+
protected Description description;
12+
13+
public AbstractDescribedNode(SourceLocation sourceLocation, List<Comment> comments, IgnoredChars ignoredChars, Map<String, String> additionalData, Description description) {
14+
super(sourceLocation, comments, ignoredChars, additionalData);
15+
this.description = description;
16+
}
17+
18+
@Override
19+
public Description getDescription() {
20+
return description;
21+
}
22+
}

src/main/java/graphql/language/AstPrinter.java

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private NodePrinter<DirectiveLocation> directiveLocation() {
110110

111111
private NodePrinter<EnumTypeDefinition> enumTypeDefinition() {
112112
return (out, node) -> {
113-
out.printf("%s", comments(node));
113+
out.printf("%s", description(node));
114114
out.printf("%s",
115115
spaced(
116116
"enum",
@@ -127,7 +127,7 @@ private NodePrinter<EnumValue> enumValue() {
127127

128128
private NodePrinter<EnumValueDefinition> enumValueDefinition() {
129129
return (out, node) -> {
130-
out.printf("%s", comments(node));
130+
out.printf("%s", description(node));
131131
out.printf("%s",
132132
spaced(
133133
node.getName(),
@@ -158,12 +158,12 @@ private NodePrinter<Field> field() {
158158
private NodePrinter<FieldDefinition> fieldDefinition() {
159159
final String argSep = compactMode ? "," : ", ";
160160
return (out, node) -> {
161-
out.printf("%s", comments(node));
162161
String args;
163-
if (hasComments(node.getInputValueDefinitions()) && !compactMode) {
162+
if (hasDescription(node.getInputValueDefinitions()) && !compactMode) {
163+
out.printf("%s", description(node));
164164
args = join(node.getInputValueDefinitions(), "\n");
165165
out.printf("%s", node.getName() +
166-
wrap("(\n", args, "\n)") +
166+
wrap("(\n", args, ")") +
167167
": " +
168168
spaced(
169169
type(node.getType()),
@@ -173,7 +173,7 @@ private NodePrinter<FieldDefinition> fieldDefinition() {
173173
} else {
174174
args = join(node.getInputValueDefinitions(), argSep);
175175
out.printf("%s", node.getName() +
176-
wrap("(", args, ")") +
176+
wrap( "(", args, ")") +
177177
": " +
178178
spaced(
179179
type(node.getType()),
@@ -184,8 +184,8 @@ private NodePrinter<FieldDefinition> fieldDefinition() {
184184
};
185185
}
186186

187-
private boolean hasComments(List<? extends Node> nodes) {
188-
return nodes.stream().anyMatch(it -> it.getComments().size() > 0);
187+
private boolean hasDescription(List<? extends Node> nodes) {
188+
return nodes.stream().filter(it -> it instanceof AbstractDescribedNode).anyMatch(it -> ((AbstractDescribedNode) it).getDescription() != null);
189189
}
190190

191191
private NodePrinter<FragmentDefinition> fragmentDefinition() {
@@ -217,7 +217,6 @@ private NodePrinter<InlineFragment> inlineFragment() {
217217
String directives = directives(node.getDirectives());
218218
String selectionSet = node(node.getSelectionSet());
219219

220-
out.printf("%s", comments(node));
221220
out.printf("%s", spaced(
222221
"...",
223222
typeCondition,
@@ -229,7 +228,7 @@ private NodePrinter<InlineFragment> inlineFragment() {
229228

230229
private NodePrinter<InputObjectTypeDefinition> inputObjectTypeDefinition() {
231230
return (out, node) -> {
232-
out.printf("%s", comments(node));
231+
out.printf("%s", description(node));
233232
out.printf("%s", spaced(
234233
"input",
235234
node.getName(),
@@ -245,7 +244,7 @@ private NodePrinter<InputValueDefinition> inputValueDefinition() {
245244
String defaultValueEquals = compactMode ? "=" : "= ";
246245
return (out, node) -> {
247246
Value defaultValue = node.getDefaultValue();
248-
out.printf("%s", comments(node));
247+
out.printf("%s", description(node));
249248
out.printf("%s", spaced(
250249
node.getName() + nameTypeSep + type(node.getType()),
251250
wrap(defaultValueEquals, defaultValue, ""),
@@ -257,7 +256,7 @@ private NodePrinter<InputValueDefinition> inputValueDefinition() {
257256

258257
private NodePrinter<InterfaceTypeDefinition> interfaceTypeDefinition() {
259258
return (out, node) -> {
260-
out.printf("%s", comments(node));
259+
out.printf("%s", description(node));
261260
out.printf("%s", spaced(
262261
"interface",
263262
node.getName(),
@@ -300,7 +299,7 @@ private NodePrinter<OperationTypeDefinition> operationTypeDefinition() {
300299

301300
private NodePrinter<ObjectTypeDefinition> objectTypeDefinition() {
302301
return (out, node) -> {
303-
out.printf("%s", comments(node));
302+
out.printf("%s", description(node));
304303
out.printf("%s", spaced(
305304
"type",
306305
node.getName(),
@@ -313,14 +312,13 @@ private NodePrinter<ObjectTypeDefinition> objectTypeDefinition() {
313312

314313
private NodePrinter<SelectionSet> selectionSet() {
315314
return (out, node) -> {
316-
out.printf("%s", comments(node));
317315
out.printf("%s", block(node.getSelections()));
318316
};
319317
}
320318

321319
private NodePrinter<ScalarTypeDefinition> scalarTypeDefinition() {
322320
return (out, node) -> {
323-
out.printf("%s", comments(node));
321+
out.printf("%s", description(node));
324322
out.printf("%s", spaced(
325323
"scalar",
326324
node.getName(),
@@ -331,7 +329,6 @@ private NodePrinter<ScalarTypeDefinition> scalarTypeDefinition() {
331329

332330
private NodePrinter<SchemaDefinition> schemaDefinition() {
333331
return (out, node) -> {
334-
out.printf("%s", comments(node));
335332
out.printf("%s", spaced(
336333
"schema",
337334
directives(node.getDirectives()),
@@ -387,7 +384,7 @@ private NodePrinter<UnionTypeDefinition> unionTypeDefinition() {
387384
String barSep = compactMode ? "|" : " | ";
388385
String equals = compactMode ? "=" : "= ";
389386
return (out, node) -> {
390-
out.printf("%s", comments(node));
387+
out.printf("%s", description(node));
391388
out.printf("%s", spaced(
392389
"union",
393390
node.getName(),
@@ -489,16 +486,21 @@ private String value(Value value) {
489486
return "";
490487
}
491488

492-
private String comments(Node<?> node) {
493-
List<Comment> comments = nvl(node.getComments());
494-
if (isEmpty(comments) || compactMode) {
489+
private String description(Node<?> node) {
490+
Description description = ((AbstractDescribedNode) node).getDescription();
491+
if (description == null || description.getContent() == null || compactMode) {
495492
return "";
496493
}
497-
String s = comments.stream().map(c -> "#" + c.getContent()).collect(joining("\n", "", "\n"));
494+
String s;
495+
boolean startNewLine = description.getContent().charAt(0) == '\n';
496+
if (description.isMultiLine()) {
497+
s = "\"\"\"" + (startNewLine ? "" : "\n") + description.getContent() + "\n\"\"\"\n";
498+
} else {
499+
s = "\"" + description.getContent() + "\"\n";
500+
}
498501
return s;
499502
}
500503

501-
502504
private String directives(List<Directive> directives) {
503505
return join(nvl(directives), " ");
504506
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package graphql.language;
2+
3+
import graphql.PublicApi;
4+
5+
/**
6+
* Represents a node that can contain a description.
7+
*/
8+
@PublicApi
9+
public interface DescribedNode<T extends Node> extends Node<T> {
10+
11+
/**
12+
* @return the description of this node
13+
*/
14+
Description getDescription();
15+
16+
}

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@
1717
import static java.util.Collections.emptyMap;
1818

1919
@PublicApi
20-
public class DirectiveDefinition extends AbstractNode<DirectiveDefinition> implements SDLDefinition<DirectiveDefinition>, NamedNode<DirectiveDefinition> {
20+
public class DirectiveDefinition extends AbstractDescribedNode<DirectiveDefinition> implements SDLDefinition<DirectiveDefinition>, NamedNode<DirectiveDefinition> {
2121
private final String name;
22-
private final Description description;
2322
private final List<InputValueDefinition> inputValueDefinitions;
2423
private final List<DirectiveLocation> directiveLocations;
2524

@@ -35,9 +34,8 @@ protected DirectiveDefinition(String name,
3534
List<Comment> comments,
3635
IgnoredChars ignoredChars,
3736
Map<String, String> additionalData) {
38-
super(sourceLocation, comments, ignoredChars, additionalData);
37+
super(sourceLocation, comments, ignoredChars, additionalData, description);
3938
this.name = name;
40-
this.description = description;
4139
this.inputValueDefinitions = inputValueDefinitions;
4240
this.directiveLocations = directiveLocations;
4341
}
@@ -56,10 +54,6 @@ public String getName() {
5654
return name;
5755
}
5856

59-
public Description getDescription() {
60-
return description;
61-
}
62-
6357
public List<InputValueDefinition> getInputValueDefinitions() {
6458
return new ArrayList<>(inputValueDefinitions);
6559
}

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616
import static java.util.Collections.emptyMap;
1717

1818
@PublicApi
19-
public class EnumTypeDefinition extends AbstractNode<EnumTypeDefinition> implements TypeDefinition<EnumTypeDefinition>, DirectivesContainer<EnumTypeDefinition>, NamedNode<EnumTypeDefinition> {
19+
public class EnumTypeDefinition extends AbstractDescribedNode<EnumTypeDefinition> implements TypeDefinition<EnumTypeDefinition>, DirectivesContainer<EnumTypeDefinition>, NamedNode<EnumTypeDefinition> {
2020
private final String name;
21-
private final Description description;
2221
private final List<EnumValueDefinition> enumValueDefinitions;
2322
private final List<Directive> directives;
2423

@@ -33,9 +32,8 @@ protected EnumTypeDefinition(String name,
3332
SourceLocation sourceLocation,
3433
List<Comment> comments,
3534
IgnoredChars ignoredChars, Map<String, String> additionalData) {
36-
super(sourceLocation, comments, ignoredChars, additionalData);
35+
super(sourceLocation, comments, ignoredChars, additionalData, description);
3736
this.name = name;
38-
this.description = description;
3937
this.directives = (null == directives) ? new ArrayList<>() : directives;
4038
this.enumValueDefinitions = enumValueDefinitions;
4139
}
@@ -63,10 +61,6 @@ public String getName() {
6361
return name;
6462
}
6563

66-
public Description getDescription() {
67-
return description;
68-
}
69-
7064
@Override
7165
public List<Node> getChildren() {
7266
List<Node> result = new ArrayList<>();

0 commit comments

Comments
 (0)