@@ -261,9 +261,12 @@ def parse_document(self) -> DocumentNode:
261261 "directive" : "directive_definition" ,
262262 }
263263
264- _parse_other_definition_method_names : Dict [str , str ] = {
264+ _parse_executable_definition_method_names : Dict [str , str ] = {
265265 ** dict .fromkeys (("query" , "mutation" , "subscription" ), "operation_definition" ),
266266 "fragment" : "fragment_definition" ,
267+ }
268+
269+ _parse_other_definition_method_names : Dict [str , str ] = {
267270 "extend" : "type_system_extension" ,
268271 }
269272
@@ -287,6 +290,14 @@ def parse_definition(self) -> DefinitionNode:
287290 self ._lexer .lookahead () if has_description else self ._lexer .token
288291 )
289292
293+ if has_description and keyword_token .kind is TokenKind .BRACE_L :
294+ raise GraphQLSyntaxError (
295+ self ._lexer .source ,
296+ self ._lexer .token .start ,
297+ "Unexpected description,"
298+ " descriptions are not supported on shorthand queries." ,
299+ )
300+
290301 if keyword_token .kind is TokenKind .NAME :
291302 token_name = cast (str , keyword_token .value )
292303 method_name = self ._parse_type_system_definition_method_names .get (
@@ -295,12 +306,16 @@ def parse_definition(self) -> DefinitionNode:
295306 if method_name :
296307 return getattr (self , f"parse_{ method_name } " )()
297308
309+ method_name = self ._parse_executable_definition_method_names .get (token_name )
310+ if method_name :
311+ return getattr (self , f"parse_{ method_name } " )()
312+
298313 if has_description :
299314 raise GraphQLSyntaxError (
300315 self ._lexer .source ,
301316 self ._lexer .token .start ,
302317 "Unexpected description,"
303- " descriptions are supported only on type definitions." ,
318+ " only GraphQL definitions support descriptions ." ,
304319 )
305320
306321 method_name = self ._parse_other_definition_method_names .get (token_name )
@@ -317,16 +332,19 @@ def parse_operation_definition(self) -> OperationDefinitionNode:
317332 if self .peek (TokenKind .BRACE_L ):
318333 return OperationDefinitionNode (
319334 operation = OperationType .QUERY ,
335+ description = None ,
320336 name = None ,
321337 variable_definitions = [],
322338 directives = [],
323339 selection_set = self .parse_selection_set (),
324340 loc = self .loc (start ),
325341 )
342+ description = self .parse_description ()
326343 operation = self .parse_operation_type ()
327344 name = self .parse_name () if self .peek (TokenKind .NAME ) else None
328345 return OperationDefinitionNode (
329346 operation = operation ,
347+ description = description ,
330348 name = name ,
331349 variable_definitions = self .parse_variable_definitions (),
332350 directives = self .parse_directives (False ),
@@ -352,6 +370,7 @@ def parse_variable_definition(self) -> VariableDefinitionNode:
352370 """VariableDefinition: Variable: Type DefaultValue? Directives[Const]?"""
353371 start = self ._lexer .token
354372 return VariableDefinitionNode (
373+ description = self .parse_description (),
355374 variable = self .parse_variable (),
356375 type = self .expect_token (TokenKind .COLON ) and self .parse_type_reference (),
357376 default_value = (
@@ -455,11 +474,13 @@ def parse_fragment(self) -> Union[FragmentSpreadNode, InlineFragmentNode]:
455474 def parse_fragment_definition (self ) -> FragmentDefinitionNode :
456475 """FragmentDefinition"""
457476 start = self ._lexer .token
477+ description = self .parse_description ()
458478 self .expect_keyword ("fragment" )
459479 # Legacy support for defining variables within fragments changes
460480 # the grammar of FragmentDefinition
461481 if self ._allow_legacy_fragment_variables :
462482 return FragmentDefinitionNode (
483+ description = description ,
463484 name = self .parse_fragment_name (),
464485 variable_definitions = self .parse_variable_definitions (),
465486 type_condition = self .parse_type_condition (),
@@ -468,6 +489,7 @@ def parse_fragment_definition(self) -> FragmentDefinitionNode:
468489 loc = self .loc (start ),
469490 )
470491 return FragmentDefinitionNode (
492+ description = description ,
471493 name = self .parse_fragment_name (),
472494 type_condition = self .parse_type_condition (),
473495 directives = self .parse_directives (False ),
0 commit comments