@@ -298,9 +298,12 @@ def parse_document(self) -> DocumentNode:
298298 "directive" : "directive_definition" ,
299299 }
300300
301- _parse_other_definition_method_names : Mapping [str , str ] = {
301+ _parse_executable_definition_method_names : Mapping [str , str ] = {
302302 ** dict .fromkeys (("query" , "mutation" , "subscription" ), "operation_definition" ),
303303 "fragment" : "fragment_definition" ,
304+ }
305+
306+ _parse_other_definition_method_names : Mapping [str , str ] = {
304307 "extend" : "type_system_extension" ,
305308 }
306309
@@ -324,6 +327,14 @@ def parse_definition(self) -> DefinitionNode:
324327 self ._lexer .lookahead () if has_description else self ._lexer .token
325328 )
326329
330+ if has_description and keyword_token .kind is TokenKind .BRACE_L :
331+ raise GraphQLSyntaxError (
332+ self ._lexer .source ,
333+ self ._lexer .token .start ,
334+ "Unexpected description,"
335+ " descriptions are not supported on shorthand queries." ,
336+ )
337+
327338 if keyword_token .kind is TokenKind .NAME :
328339 token_name = cast ("str" , keyword_token .value )
329340 method_name = self ._parse_type_system_definition_method_names .get (
@@ -332,12 +343,16 @@ def parse_definition(self) -> DefinitionNode:
332343 if method_name :
333344 return getattr (self , f"parse_{ method_name } " )()
334345
346+ method_name = self ._parse_executable_definition_method_names .get (token_name )
347+ if method_name :
348+ return getattr (self , f"parse_{ method_name } " )()
349+
335350 if has_description :
336351 raise GraphQLSyntaxError (
337352 self ._lexer .source ,
338353 self ._lexer .token .start ,
339354 "Unexpected description,"
340- " descriptions are supported only on type definitions." ,
355+ " only GraphQL definitions support descriptions ." ,
341356 )
342357
343358 method_name = self ._parse_other_definition_method_names .get (token_name )
@@ -354,16 +369,19 @@ def parse_operation_definition(self) -> OperationDefinitionNode:
354369 if self .peek (TokenKind .BRACE_L ):
355370 return OperationDefinitionNode (
356371 operation = OperationType .QUERY ,
372+ description = None ,
357373 name = None ,
358374 variable_definitions = (),
359375 directives = (),
360376 selection_set = self .parse_selection_set (),
361377 loc = self .loc (start ),
362378 )
379+ description = self .parse_description ()
363380 operation = self .parse_operation_type ()
364381 name = self .parse_name () if self .peek (TokenKind .NAME ) else None
365382 return OperationDefinitionNode (
366383 operation = operation ,
384+ description = description ,
367385 name = name ,
368386 variable_definitions = self .parse_variable_definitions (),
369387 directives = self .parse_directives (False ),
@@ -388,10 +406,12 @@ def parse_variable_definitions(self) -> tuple[VariableDefinitionNode, ...]:
388406 def parse_variable_definition (self ) -> VariableDefinitionNode :
389407 """VariableDefinition: Variable: Type DefaultValue? Directives[Const]?"""
390408 start = self ._lexer .token
409+ description = self .parse_description ()
391410 variable = self .parse_variable ()
392411 self .expect_token (TokenKind .COLON )
393412 type_ = self .parse_type_reference ()
394413 return VariableDefinitionNode (
414+ description = description ,
395415 variable = variable ,
396416 type = type_ ,
397417 default_value = self .parse_const_value_literal ()
@@ -528,11 +548,13 @@ def parse_fragment(self) -> FragmentSpreadNode | InlineFragmentNode:
528548 def parse_fragment_definition (self ) -> FragmentDefinitionNode :
529549 """FragmentDefinition"""
530550 start = self ._lexer .token
551+ description = self .parse_description ()
531552 self .expect_keyword ("fragment" )
532553 # Legacy support for defining variables within fragments changes
533554 # the grammar of FragmentDefinition
534555 if self ._allow_legacy_fragment_variables :
535556 return FragmentDefinitionNode (
557+ description = description ,
536558 name = self .parse_fragment_name (),
537559 variable_definitions = self .parse_variable_definitions (),
538560 type_condition = self .parse_type_condition (),
@@ -541,6 +563,7 @@ def parse_fragment_definition(self) -> FragmentDefinitionNode:
541563 loc = self .loc (start ),
542564 )
543565 return FragmentDefinitionNode (
566+ description = description ,
544567 name = self .parse_fragment_name (),
545568 variable_definitions = (),
546569 type_condition = self .parse_type_condition (),
0 commit comments