zf

zenflows testing
git clone https://s.sonu.ch/~srfsh/zf.git
Log | Files | Refs | Submodules | README | LICENSE

absinthe_parser.yrl (32061B)


      1 Nonterminals
      2   Document
      3   Definitions Definition OperationDefinition Fragment TypeDefinition
      4   ObjectTypeDefinition InterfaceTypeDefinition UnionTypeDefinition
      5   ScalarTypeDefinition EnumTypeDefinition InputObjectTypeDefinition TypeExtensionDefinition
      6   FieldDefinitionList FieldDefinition ImplementsInterfaces ArgumentsDefinition
      7   InputValueDefinitionList InputValueDefinition UnionMembers
      8   EnumValueDefinitionList EnumValueDefinition
      9   DirectiveDefinition DirectiveDefinitionLocations
     10   SelectionSet Selections Selection
     11   OperationType Name NameWithoutOn VariableDefinitions VariableDefinition DescriptionDefinition Directives Directive
     12   Field Alias Arguments ArgumentList Argument
     13   FragmentSpread FragmentName InlineFragment
     14   VariableDefinitionList Variable DefaultValue
     15   Type TypeCondition NamedTypeList NamedType ListType NonNullType
     16   Value EnumValue ListValue Values ObjectValue ObjectFields ObjectField SchemaDefinition.
     17 
     18 Terminals
     19   '{' '}' '(' ')' '[' ']' '!' ':' '@' '$' '=' '|' '...'
     20   'query' 'mutation' 'subscription' 'fragment' 'on' 'directive' 'repeatable'
     21   'type' 'implements' 'interface' 'union' 'scalar' 'enum' 'input' 'extend' 'schema'
     22   name int_value float_value string_value block_string_value boolean_value null.
     23 
     24 Rootsymbol Document.
     25 
     26 Document -> Definitions : build_ast_node('Document', #{'definitions' => '$1'}, extract_location('$1')).
     27 
     28 Definitions -> Definition : ['$1'].
     29 Definitions -> Definition Definitions : ['$1'|'$2'].
     30 
     31 Definition -> OperationDefinition : '$1'.
     32 Definition -> Fragment : '$1'.
     33 Definition -> TypeDefinition : '$1'.
     34 
     35 OperationType -> 'query' : '$1'.
     36 OperationType -> 'mutation' : '$1'.
     37 OperationType -> 'subscription' : '$1'.
     38 
     39 OperationDefinition -> SelectionSet : build_ast_node('OperationDefinition', #{'operation' => 'query', 'selection_set' => '$1', 'shorthand' => true}, extract_child_location('$1')).
     40 OperationDefinition -> OperationType SelectionSet : build_ast_node('OperationDefinition', #{'operation' => extract_atom('$1'), 'selection_set' => '$2'}, extract_location('$1')).
     41 OperationDefinition -> OperationType VariableDefinitions SelectionSet : build_ast_node('OperationDefinition', #{'operation' => extract_atom('$1'), 'variable_definitions' => '$2', 'selection_set' => '$3'}, extract_child_location('$1')).
     42 OperationDefinition -> OperationType VariableDefinitions Directives SelectionSet : build_ast_node('OperationDefinition', #{'operation' => extract_atom('$1'), 'variable_definitions' => '$2', 'directives' => '$3', 'selection_set' => '$4'}, extract_child_location('$1')).
     43 OperationDefinition -> OperationType Name SelectionSet : build_ast_node('OperationDefinition', #{'operation' => extract_atom('$1'), 'name' => extract_binary('$2'), 'selection_set' => '$3'}, extract_location('$1')).
     44 OperationDefinition -> OperationType Name VariableDefinitions SelectionSet : build_ast_node('OperationDefinition', #{'operation' => extract_atom('$1'), 'name' => extract_binary('$2'), 'variable_definitions' => '$3', 'selection_set' => '$4'}, extract_location('$1')).
     45 OperationDefinition -> OperationType Name Directives SelectionSet : build_ast_node('OperationDefinition', #{'operation' => extract_atom('$1'), 'name' => extract_binary('$2'), 'directives' => '$3', 'selection_set' => '$4'}, extract_location('$1')).
     46 OperationDefinition -> OperationType Name VariableDefinitions Directives SelectionSet : build_ast_node('OperationDefinition', #{'operation' => extract_atom('$1'), 'name' => extract_binary('$2'), 'variable_definitions' => '$3', 'directives' => '$4', 'selection_set' => '$5'}, extract_location('$1')).
     47 
     48 Fragment -> 'fragment' FragmentName 'on' TypeCondition SelectionSet : build_ast_node('Fragment', #{'name' => '$2', 'type_condition' => '$4', 'selection_set' => '$5'}, extract_location('$1')).
     49 Fragment -> 'fragment' FragmentName 'on' TypeCondition Directives SelectionSet : build_ast_node('Fragment', #{'name' => '$2', 'type_condition' => '$4', 'directives' => '$5', 'selection_set' => '$6'}, extract_location('$1')).
     50 
     51 TypeCondition -> NamedType : '$1'.
     52 
     53 VariableDefinitions -> '(' VariableDefinitionList ')' : '$2'.
     54 VariableDefinitionList -> VariableDefinition : ['$1'].
     55 VariableDefinitionList -> VariableDefinition VariableDefinitionList : ['$1'|'$2'].
     56 VariableDefinition -> Variable ':' Type : build_ast_node('VariableDefinition', #{'variable' => '$1', 'type' => '$3'}, extract_child_location('$1')).
     57 VariableDefinition -> Variable ':' Type DefaultValue : build_ast_node('VariableDefinition', #{'variable' => '$1', 'type' => '$3', 'default_value' => '$4'}, extract_child_location('$1')).
     58 VariableDefinition -> Variable ':' Type DefaultValue Directives : build_ast_node('VariableDefinition', #{'variable' => '$1', 'type' => '$3', 'default_value' => '$4', 'directives' => '$5'}, extract_child_location('$1')).
     59 Variable -> '$' NameWithoutOn : build_ast_node('Variable', #{'name' => extract_binary('$2')}, extract_location('$1')).
     60 Variable -> '$' 'on' : build_ast_node('Variable', #{'name' => extract_binary('$2')}, extract_location('$1')).
     61 
     62 DefaultValue -> '=' Value : '$2'.
     63 
     64 Type -> NamedType : '$1'.
     65 Type -> ListType : '$1'.
     66 Type -> NonNullType : '$1'.
     67 NamedType -> Name : build_ast_node('NamedType', #{'name' => extract_binary('$1')}, extract_location('$1')).
     68 ListType -> '[' Type ']' : build_ast_node('ListType', #{'type' => '$2'}, extract_location('$1')).
     69 NonNullType -> NamedType '!' : build_ast_node('NonNullType', #{'type' => '$1'}, extract_location('$1')).
     70 NonNullType -> ListType '!' : build_ast_node('NonNullType', #{'type' => '$1'}, extract_location('$1')).
     71 
     72 SelectionSet -> '{' Selections '}' : build_ast_node('SelectionSet', #{'selections' => '$2'}, extract_location('$1')).
     73 
     74 Selections -> Selection : ['$1'].
     75 Selections -> Selection Selections : ['$1'|'$2'].
     76 
     77 Selection -> Field : '$1'.
     78 Selection -> FragmentSpread : '$1'.
     79 Selection -> InlineFragment : '$1'.
     80 
     81 FragmentSpread -> '...' FragmentName : build_ast_node('FragmentSpread', #{'name' => '$2'}, extract_location('$1')).
     82 FragmentSpread -> '...' FragmentName Directives : build_ast_node('FragmentSpread', #{'name' => '$2', 'directives' => '$3'}, extract_location('$1')).
     83 
     84 InlineFragment -> '...' 'on' TypeCondition SelectionSet : build_ast_node('InlineFragment', #{'type_condition' => '$3', 'selection_set' => '$4'}, extract_location('$1')).
     85 InlineFragment -> '...' 'on' TypeCondition Directives SelectionSet : build_ast_node('InlineFragment', #{'type_condition' => '$3', 'directives' => '$4', 'selection_set' => '$5'}, extract_location('$1')).
     86 InlineFragment -> '...' Directives SelectionSet : build_ast_node('InlineFragment', #{'directives' => '$2', 'selection_set' => '$3'}, extract_location('$1')).
     87 InlineFragment -> '...' SelectionSet : build_ast_node('InlineFragment', #{'selection_set' => '$2'}, extract_location('$1')).
     88 
     89 FragmentName -> NameWithoutOn : extract_binary('$1').
     90 
     91 Field -> Name : build_ast_node('Field', #{'name' => extract_binary('$1')}, extract_location('$1')).
     92 Field -> Name Arguments : build_ast_node('Field', #{'name' => extract_binary('$1'), 'arguments' => '$2'}, extract_location('$1')).
     93 Field -> Name Directives : build_ast_node('Field', #{'name' => extract_binary('$1'), 'directives' => '$2'}, extract_location('$1')).
     94 Field -> Name SelectionSet : build_ast_node('Field', #{'name' => extract_binary('$1'), 'selection_set' => '$2'}, extract_location('$1')).
     95 Field -> Name Directives SelectionSet : build_ast_node('Field', #{'name' => extract_binary('$1'), 'directives' => '$2', 'selection_set' => '$3'}, extract_location('$1')).
     96 Field -> Name Arguments SelectionSet : build_ast_node('Field', #{'name' => extract_binary('$1'), 'arguments' => '$2', 'selection_set' => '$3'}, extract_location('$1')).
     97 Field -> Name Arguments Directives : build_ast_node('Field', #{'name' => extract_binary('$1'), 'arguments' => '$2', 'directives' => '$3'}, extract_location('$1')).
     98 Field -> Name Arguments Directives SelectionSet : build_ast_node('Field', #{'name' => extract_binary('$1'), 'arguments' => '$2', 'directives' => '$3', 'selection_set' => '$4'}, extract_location('$1')).
     99 Field -> Alias Name : build_ast_node('Field', #{'alias' => extract_binary('$1'), 'name' => extract_binary('$2')}, extract_location('$1')).
    100 Field -> Alias Name Arguments : build_ast_node('Field', #{'alias' => extract_binary('$1'), 'name' => extract_binary('$2'), 'arguments' => '$3'}, extract_location('$1')).
    101 Field -> Alias Name SelectionSet : build_ast_node('Field', #{'alias' => extract_binary('$1'), 'name' => extract_binary('$2'), 'selection_set' => '$3'}, extract_location('$1')).
    102 Field -> Alias Name Arguments SelectionSet : build_ast_node('Field', #{'alias' => extract_binary('$1'), 'name' => extract_binary('$2'), 'arguments' => '$3', 'selection_set' => '$4'}, extract_location('$1')).
    103 Field -> Alias Name Directives : build_ast_node('Field', #{'alias' => extract_binary('$1'), 'name' => extract_binary('$2'), 'directives' => '$3'}, extract_location('$1')).
    104 Field -> Alias Name Arguments Directives : build_ast_node('Field', #{'alias' => extract_binary('$1'), 'name' => extract_binary('$2'), 'arguments' => '$3', 'directives' => '$4'}, extract_location('$1')).
    105 Field -> Alias Name Directives SelectionSet : build_ast_node('Field', #{'alias' => extract_binary('$1'), 'name' => extract_binary('$2'), 'directives' => '$3', 'selection_set' => '$4'}, extract_location('$1')).
    106 Field -> Alias Name Arguments Directives SelectionSet : build_ast_node('Field', #{'alias' => extract_binary('$1'), 'name' => extract_binary('$2'), 'arguments' => '$3', 'directives' => '$4', 'selection_set' => '$5'}, extract_location('$1')).
    107 
    108 Alias -> Name ':' : '$1'.
    109 
    110 Arguments -> '(' ArgumentList ')' : '$2'.
    111 ArgumentList -> Argument : ['$1'].
    112 ArgumentList -> Argument ArgumentList : ['$1'|'$2'].
    113 Argument -> NameWithoutOn ':' Value : build_ast_node('Argument', #{name => extract_binary('$1'), value => '$3'}, extract_location('$1')).
    114 Argument -> 'on' ':' Value : build_ast_node('Argument', #{name => extract_binary('$1'), value => '$3'}, extract_location('$1')).
    115 
    116 Directives -> Directive : ['$1'].
    117 Directives -> Directive Directives : ['$1'|'$2'].
    118 Directive -> '@' NameWithoutOn : build_ast_node('Directive', #{name => extract_binary('$2')}, extract_location('$1')).
    119 Directive -> '@' NameWithoutOn Arguments : build_ast_node('Directive', #{name => extract_binary('$2'), 'arguments' => '$3'}, extract_location('$1')).
    120 Directive -> '@' 'on' : build_ast_node('Directive', #{name => extract_binary('$2')}, extract_location('$1')).
    121 Directive -> '@' 'on' Arguments : build_ast_node('Directive', #{name => extract_binary('$2'), 'arguments' => '$3'}, extract_location('$1')).
    122 
    123 NameWithoutOn -> 'name' : '$1'.
    124 NameWithoutOn -> 'query' : '$1'.
    125 NameWithoutOn -> 'mutation' : '$1'.
    126 NameWithoutOn -> 'subscription' : '$1'.
    127 NameWithoutOn -> 'fragment' : '$1'.
    128 NameWithoutOn -> 'type' : '$1'.
    129 NameWithoutOn -> 'implements' : '$1'.
    130 NameWithoutOn -> 'interface' : '$1'.
    131 NameWithoutOn -> 'union' : '$1'.
    132 NameWithoutOn -> 'scalar' : '$1'.
    133 NameWithoutOn -> 'schema' : '$1'.
    134 NameWithoutOn -> 'enum' : '$1'.
    135 NameWithoutOn -> 'input' : '$1'.
    136 NameWithoutOn -> 'extend' : '$1'.
    137 NameWithoutOn -> 'directive' : '$1'.
    138 
    139 Name -> NameWithoutOn : '$1'.
    140 Name -> 'on' : extract_binary('$1').
    141 
    142 Value -> Variable : '$1'.
    143 Value -> int_value :     build_ast_node('IntValue',     #{'value' => extract_integer('$1')},             extract_location('$1')).
    144 Value -> float_value :   build_ast_node('FloatValue',   #{'value' => extract_float('$1')},               extract_location('$1')).
    145 Value -> block_string_value :  build_ast_node('StringValue',  #{'value' => extract_quoted_block_string_token('$1')}, extract_location('$1')).
    146 Value -> string_value :  build_ast_node('StringValue',  #{'value' => extract_quoted_string_token('$1')}, extract_location('$1')).
    147 Value -> boolean_value : build_ast_node('BooleanValue', #{'value' => extract_boolean('$1')},             extract_location('$1')).
    148 Value -> null :          build_ast_node('NullValue',    #{},                 extract_location('$1')).
    149 Value -> EnumValue :     build_ast_node('EnumValue',    #{'value' => '$1'},  extract_location('$1')).
    150 Value -> ListValue :     build_ast_node('ListValue',    #{'values' => '$1'}, extract_child_location('$1')).
    151 Value -> ObjectValue :   build_ast_node('ObjectValue',  #{'fields' => '$1'}, extract_child_location('$1')).
    152 
    153 EnumValue -> Name : extract_binary('$1').
    154 
    155 ListValue -> '[' ']' : [].
    156 ListValue -> '[' Values ']' : '$2'.
    157 Values -> Value : ['$1'].
    158 Values -> Value Values : ['$1'|'$2'].
    159 
    160 ObjectValue -> '{' '}' : [].
    161 ObjectValue -> '{' ObjectFields '}' : '$2'.
    162 ObjectFields -> ObjectField : ['$1'].
    163 ObjectFields -> ObjectField ObjectFields : ['$1'|'$2'].
    164 ObjectField -> Name ':' Value : build_ast_node('ObjectField', #{'name' => extract_binary('$1'), 'value' => '$3'}, extract_location('$1')).
    165 
    166 DescriptionDefinition -> string_value : extract_quoted_string_token('$1').
    167 DescriptionDefinition -> block_string_value : extract_quoted_block_string_token('$1').
    168 
    169 TypeDefinition -> SchemaDefinition : '$1'.
    170 TypeDefinition -> ObjectTypeDefinition : '$1'.
    171 TypeDefinition -> InterfaceTypeDefinition : '$1'.
    172 TypeDefinition -> UnionTypeDefinition : '$1'.
    173 TypeDefinition -> ScalarTypeDefinition : '$1'.
    174 TypeDefinition -> EnumTypeDefinition : '$1'.
    175 TypeDefinition -> InputObjectTypeDefinition : '$1'.
    176 TypeDefinition -> TypeExtensionDefinition : '$1'.
    177 TypeDefinition -> DirectiveDefinition : '$1'.
    178 
    179 TypeDefinition -> DescriptionDefinition SchemaDefinition : put_description('$2', '$1').
    180 TypeDefinition -> DescriptionDefinition ObjectTypeDefinition : put_description('$2', '$1').
    181 TypeDefinition -> DescriptionDefinition InterfaceTypeDefinition : put_description('$2', '$1').
    182 TypeDefinition -> DescriptionDefinition UnionTypeDefinition : put_description('$2', '$1').
    183 TypeDefinition -> DescriptionDefinition ScalarTypeDefinition : put_description('$2', '$1').
    184 TypeDefinition -> DescriptionDefinition EnumTypeDefinition : put_description('$2', '$1').
    185 TypeDefinition -> DescriptionDefinition InputObjectTypeDefinition : put_description('$2', '$1').
    186 TypeDefinition -> DescriptionDefinition DirectiveDefinition : put_description('$2', '$1').
    187 
    188 DirectiveDefinition -> 'directive' '@' Name 'on' DirectiveDefinitionLocations :
    189   build_ast_node('DirectiveDefinition', #{'name' => extract_binary('$3'), 'locations' => extract_directive_locations('$5')}, extract_location('$1')).
    190 DirectiveDefinition -> 'directive' '@' Name ArgumentsDefinition 'on' DirectiveDefinitionLocations :
    191   build_ast_node('DirectiveDefinition', #{'name' => extract_binary('$3'), 'arguments' => '$4', 'locations' => extract_directive_locations('$6')}, extract_location('$1')).
    192 
    193 DirectiveDefinition -> 'directive' '@' Name 'on' DirectiveDefinitionLocations Directives :
    194   build_ast_node('DirectiveDefinition', #{'name' => extract_binary('$3'), 'directives' => '$6', 'locations' => extract_directive_locations('$5')}, extract_location('$1')).
    195 DirectiveDefinition -> 'directive' '@' Name ArgumentsDefinition 'on' DirectiveDefinitionLocations Directives :
    196   build_ast_node('DirectiveDefinition', #{'name' => extract_binary('$3'), 'arguments' => '$4', 'directives' => '$7', 'locations' => extract_directive_locations('$6')}, extract_location('$1')).
    197 
    198 DirectiveDefinition -> 'directive' '@' Name 'repeatable' 'on' DirectiveDefinitionLocations :
    199   build_ast_node('DirectiveDefinition', #{'name' => extract_binary('$3'), 'locations' => extract_directive_locations('$6'), 'repeatable' => true}, extract_location('$1')).
    200 DirectiveDefinition -> 'directive' '@' Name ArgumentsDefinition 'repeatable' 'on' DirectiveDefinitionLocations :
    201   build_ast_node('DirectiveDefinition', #{'name' => extract_binary('$3'), 'arguments' => '$4', 'locations' => extract_directive_locations('$7'), 'repeatable' => true}, extract_location('$1')).
    202 
    203 DirectiveDefinition -> 'directive' '@' Name 'repeatable' 'on' DirectiveDefinitionLocations Directives :
    204   build_ast_node('DirectiveDefinition', #{'name' => extract_binary('$3'), 'directives' => '$7', 'locations' => extract_directive_locations('$6'), 'repeatable' => true}, extract_location('$1')).
    205 DirectiveDefinition -> 'directive' '@' Name ArgumentsDefinition 'repeatable' 'on' DirectiveDefinitionLocations Directives :
    206   build_ast_node('DirectiveDefinition', #{'name' => extract_binary('$3'), 'arguments' => '$4', 'directives' => '$8', 'locations' => extract_directive_locations('$7'), 'repeatable' => true}, extract_location('$1')).
    207 
    208 
    209 
    210 SchemaDefinition -> 'schema' : build_ast_node('SchemaDeclaration', #{}, extract_location('$1')).
    211 SchemaDefinition -> 'schema' Directives : build_ast_node('SchemaDeclaration', #{'directives' => '$2'}, extract_location('$1')).
    212 SchemaDefinition -> 'schema' '{' FieldDefinitionList '}' : build_ast_node('SchemaDeclaration', #{'fields' => '$3'}, extract_location('$1')).
    213 SchemaDefinition -> 'schema' Directives '{' FieldDefinitionList '}' : build_ast_node('SchemaDeclaration', #{'directives' => '$2', 'fields' => '$4'}, extract_location('$1')).
    214 
    215 ObjectTypeDefinition -> 'type' Name :
    216   build_ast_node('ObjectTypeDefinition', #{'name' => extract_binary('$2')}, extract_location('$1')).
    217 ObjectTypeDefinition -> 'type' Name Directives :
    218   build_ast_node('ObjectTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3'}, extract_location('$1')).
    219 ObjectTypeDefinition -> 'type' Name '{' FieldDefinitionList '}' :
    220   build_ast_node('ObjectTypeDefinition', #{'name' => extract_binary('$2'), 'fields' => '$4'}, extract_location('$1')).
    221 ObjectTypeDefinition -> 'type' Name Directives '{' FieldDefinitionList '}' :
    222   build_ast_node('ObjectTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3', 'fields' => '$5'}, extract_location('$1')).
    223 ObjectTypeDefinition -> 'type' Name ImplementsInterfaces '{' FieldDefinitionList '}' :
    224   build_ast_node('ObjectTypeDefinition', #{'name' => extract_binary('$2'), 'interfaces' => '$3', 'fields' => '$5'}, extract_location('$1')).
    225 ObjectTypeDefinition -> 'type' Name ImplementsInterfaces Directives '{' FieldDefinitionList '}' :
    226   build_ast_node('ObjectTypeDefinition', #{'name' => extract_binary('$2'), 'interfaces' => '$3', 'directives' => '$4', 'fields' => '$6'}, extract_location('$1')).
    227 
    228 ImplementsInterfaces -> 'implements' NamedTypeList : '$2'.
    229 
    230 NamedTypeList -> NamedType : ['$1'].
    231 NamedTypeList -> NamedType NamedTypeList : ['$1'|'$2'].
    232 
    233 FieldDefinitionList -> FieldDefinition : ['$1'].
    234 FieldDefinitionList -> FieldDefinition FieldDefinitionList : ['$1'|'$2'].
    235 FieldDefinitionList -> DescriptionDefinition FieldDefinition : [put_description('$2', '$1')].
    236 FieldDefinitionList -> DescriptionDefinition FieldDefinition FieldDefinitionList : [put_description('$2', '$1')|'$3'].
    237 
    238 FieldDefinition -> Name ':' Type : build_ast_node('FieldDefinition', #{'name' => extract_binary('$1'), 'type' => '$3'}, extract_location('$1')).
    239 FieldDefinition -> Name ':' Type Directives : build_ast_node('FieldDefinition', #{'name' => extract_binary('$1'), 'type' => '$3', 'directives' => '$4'}, extract_location('$1')).
    240 FieldDefinition -> Name ArgumentsDefinition ':' Type : build_ast_node('FieldDefinition', #{'name' => extract_binary('$1'), 'arguments' => '$2', 'type' => '$4'}, extract_location('$1')).
    241 FieldDefinition -> Name Directives ':' Type : build_ast_node('FieldDefinition', #{'name' => extract_binary('$1'), 'directives' => '$2', 'type' => '$4'}, extract_location('$1')).
    242 FieldDefinition -> Name ArgumentsDefinition ':' Type Directives : build_ast_node('FieldDefinition', #{'name' => extract_binary('$1'), 'arguments' => '$2', 'directives' => '$5', 'type' => '$4'}, extract_location('$1')).
    243 
    244 ArgumentsDefinition -> '(' InputValueDefinitionList ')' : '$2'.
    245 
    246 InputValueDefinitionList -> InputValueDefinition : ['$1'].
    247 InputValueDefinitionList -> InputValueDefinition InputValueDefinitionList : ['$1'|'$2'].
    248 
    249 InputValueDefinitionList -> DescriptionDefinition InputValueDefinition : [put_description('$2', '$1')].
    250 InputValueDefinitionList -> DescriptionDefinition InputValueDefinition InputValueDefinitionList : [put_description('$2', '$1')|'$3'].
    251 
    252 InputValueDefinition -> Name ':' Type : build_ast_node('InputValueDefinition', #{'name' => extract_binary('$1'), 'type' => '$3'}, extract_location('$1')).
    253 InputValueDefinition -> Name ':' Type Directives : build_ast_node('InputValueDefinition', #{'name' => extract_binary('$1'), 'type' => '$3', 'directives' => '$4'}, extract_location('$1')).
    254 InputValueDefinition -> Name ':' Type DefaultValue : build_ast_node('InputValueDefinition', #{'name' => extract_binary('$1'), 'type' => '$3', 'default_value' => '$4'}, extract_location('$1')).
    255 InputValueDefinition -> Name ':' Type DefaultValue Directives : build_ast_node('InputValueDefinition', #{'name' => extract_binary('$1'), 'type' => '$3', 'default_value' => '$4', 'directives' => '$5'}, extract_location('$1')).
    256 
    257 InterfaceTypeDefinition -> 'interface' Name :
    258   build_ast_node('InterfaceTypeDefinition', #{'name' => extract_binary('$2')}, extract_location('$1')).
    259 InterfaceTypeDefinition -> 'interface' Name Directives :
    260   build_ast_node('InterfaceTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3'}, extract_location('$1')).
    261 InterfaceTypeDefinition -> 'interface' Name '{' FieldDefinitionList '}' :
    262   build_ast_node('InterfaceTypeDefinition', #{'name' => extract_binary('$2'), 'fields' => '$4'}, extract_location('$1')).
    263 InterfaceTypeDefinition -> 'interface' Name Directives '{' FieldDefinitionList '}' :
    264   build_ast_node('InterfaceTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3', 'fields' => '$5'}, extract_location('$1')).
    265 InterfaceTypeDefinition -> 'interface' Name ImplementsInterfaces '{' FieldDefinitionList '}' :
    266   build_ast_node('InterfaceTypeDefinition', #{'name' => extract_binary('$2'), 'interfaces' => '$3', 'fields' => '$5'}, extract_location('$1')).
    267 InterfaceTypeDefinition -> 'interface' Name ImplementsInterfaces Directives '{' FieldDefinitionList '}' :
    268   build_ast_node('InterfaceTypeDefinition', #{'name' => extract_binary('$2'), 'interfaces' => '$3', 'directives' => '$4', 'fields' => '$6'}, extract_location('$1')).
    269 
    270 
    271 UnionTypeDefinition -> 'union' Name :
    272   build_ast_node('UnionTypeDefinition', #{'name' => extract_binary('$2')}, extract_location('$1')).
    273 UnionTypeDefinition -> 'union' Name Directives :
    274   build_ast_node('UnionTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3'}, extract_location('$1')).
    275 UnionTypeDefinition -> 'union' Name '=' UnionMembers :
    276   build_ast_node('UnionTypeDefinition', #{'name' => extract_binary('$2'), 'types' => '$4'}, extract_location('$1')).
    277 UnionTypeDefinition -> 'union' Name Directives '=' UnionMembers :
    278   build_ast_node('UnionTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3', 'types' => '$5'}, extract_location('$1')).
    279 
    280 UnionMembers -> NamedType : ['$1'].
    281 UnionMembers -> NamedType '|' UnionMembers : ['$1'|'$3'].
    282 UnionMembers -> '|' NamedType '|' UnionMembers : ['$2'|'$4'].
    283 
    284 ScalarTypeDefinition -> 'scalar' Name : build_ast_node('ScalarTypeDefinition', #{'name' => extract_binary('$2')}, extract_location('$2')).
    285 ScalarTypeDefinition -> 'scalar' Name Directives : build_ast_node('ScalarTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3'}, extract_location('$2')).
    286 
    287 EnumTypeDefinition -> 'enum' Name :
    288   build_ast_node('EnumTypeDefinition', #{'name' => extract_binary('$2')}, extract_location('$2')).
    289 EnumTypeDefinition -> 'enum' Name Directives :
    290   build_ast_node('EnumTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3'}, extract_location('$2')).
    291 EnumTypeDefinition -> 'enum' Name '{' EnumValueDefinitionList '}':
    292   build_ast_node('EnumTypeDefinition', #{'name' => extract_binary('$2'), 'values' => '$4'}, extract_location('$2')).
    293 EnumTypeDefinition -> 'enum' Name Directives '{' EnumValueDefinitionList '}':
    294   build_ast_node('EnumTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3', 'values' => '$5'}, extract_location('$2')).
    295 
    296 EnumValueDefinitionList -> EnumValueDefinition : ['$1'].
    297 EnumValueDefinitionList -> EnumValueDefinition EnumValueDefinitionList : ['$1'|'$2'].
    298 
    299 EnumValueDefinitionList -> DescriptionDefinition EnumValueDefinition : [put_description('$2', '$1')].
    300 EnumValueDefinitionList -> DescriptionDefinition EnumValueDefinition EnumValueDefinitionList : [put_description('$2', '$1')|'$3'].
    301 
    302 DirectiveDefinitionLocations -> Name : [extract_binary('$1')].
    303 DirectiveDefinitionLocations -> Name '|' DirectiveDefinitionLocations : [extract_binary('$1')|'$3'].
    304 DirectiveDefinitionLocations -> '|' Name '|' DirectiveDefinitionLocations : [extract_binary('$2')|'$4'].
    305 
    306 EnumValueDefinition -> EnumValue : build_ast_node('EnumValueDefinition', #{'value' => extract_binary('$1')}, extract_location('$1')).
    307 EnumValueDefinition -> EnumValue Directives : build_ast_node('EnumValueDefinition', #{'value' => extract_binary('$1'), 'directives' => '$2'}, extract_location('$1')).
    308 
    309 InputObjectTypeDefinition -> 'input' Name :
    310   build_ast_node('InputObjectTypeDefinition', #{'name' => extract_binary('$2')}, extract_location('$2')).
    311 InputObjectTypeDefinition -> 'input' Name Directives :
    312   build_ast_node('InputObjectTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3'}, extract_location('$2')).
    313 InputObjectTypeDefinition -> 'input' Name '{' InputValueDefinitionList '}' :
    314   build_ast_node('InputObjectTypeDefinition', #{'name' => extract_binary('$2'), 'fields' => '$4'}, extract_location('$2')).
    315 InputObjectTypeDefinition -> 'input' Name Directives '{' InputValueDefinitionList '}' :
    316   build_ast_node('InputObjectTypeDefinition', #{'name' => extract_binary('$2'), 'directives' => '$3', 'fields' => '$5'}, extract_location('$2')).
    317 
    318 TypeExtensionDefinition -> 'extend' EnumTypeDefinition :
    319   build_ast_node('TypeExtensionDefinition', #{'definition' => '$2'}, extract_location('$1')).
    320 TypeExtensionDefinition -> 'extend' InputObjectTypeDefinition :
    321   build_ast_node('TypeExtensionDefinition', #{'definition' => '$2'}, extract_location('$1')).
    322 TypeExtensionDefinition -> 'extend' InterfaceTypeDefinition :
    323   build_ast_node('TypeExtensionDefinition', #{'definition' => '$2'}, extract_location('$1')).
    324 TypeExtensionDefinition -> 'extend' ObjectTypeDefinition :
    325   build_ast_node('TypeExtensionDefinition', #{'definition' => '$2'}, extract_location('$1')).
    326 TypeExtensionDefinition -> 'extend' ScalarTypeDefinition :
    327   build_ast_node('TypeExtensionDefinition', #{'definition' => '$2'}, extract_location('$1')).
    328 TypeExtensionDefinition -> 'extend' SchemaDefinition :
    329   build_ast_node('TypeExtensionDefinition', #{'definition' => '$2'}, extract_location('$1')).
    330 TypeExtensionDefinition -> 'extend' UnionTypeDefinition :
    331   build_ast_node('TypeExtensionDefinition', #{'definition' => '$2'}, extract_location('$1')).
    332 
    333 Expect 10.
    334 
    335 Erlang code.
    336 
    337 % Line-Level Utilities
    338 
    339 extract_location({_Token, {Line, Column}}) ->
    340   #{'line' => Line, 'column' => Column};
    341 extract_location({_Token, {Line, Column}, _Value}) ->
    342   #{'line' => Line, 'column' => Column};
    343 extract_location(_Other) ->
    344   #{'line' => nil, 'column' => nil}.
    345 
    346 extract_child_location([Head|_]) ->
    347   extract_child_location(Head);
    348 extract_child_location(#{loc := #{'line' := Line, 'column' := Column}}) ->
    349   #{'line' => Line, 'column' => Column};
    350 extract_child_location(_) ->
    351   #{'line' => nil, 'column' => nil}.
    352 
    353 % Value-level Utilities
    354 
    355 extract_atom({Value, _Loc}) ->
    356   Value.
    357 
    358 extract_binary(Value) when is_binary(Value) ->
    359   Value;
    360 
    361 extract_binary({Token, _Loc}) ->
    362   list_to_binary(atom_to_list(Token));
    363 
    364 extract_binary({_Token, _Loc, Value}) ->
    365   list_to_binary(Value).
    366 
    367 % AST Generation
    368 
    369 build_ast_node(Type, Node, #{'line' := nil, 'column' := nil}) ->
    370   build_ast_node(Type, Node, nil);
    371 build_ast_node(Type, Node, Loc) ->
    372   'Elixir.Kernel':struct(list_to_atom("Elixir.Absinthe.Language." ++ atom_to_list(Type)), Node#{loc => Loc}).
    373 
    374 % Descriptions
    375 
    376 put_description(Node, Description) ->
    377   maps:put(description, Description, Node).
    378 
    379 % String
    380 
    381 extract_quoted_string_token({_Token, _Loc, Value}) ->
    382   unicode:characters_to_binary(lists:sublist(Value, 2, length(Value) - 2)).
    383 
    384 % Block String
    385 
    386 extract_quoted_block_string_token({_Token, _Loc, Value}) ->
    387   unicode:characters_to_binary(process_block_string(lists:sublist(Value, 4, length(Value) - 6))).
    388 
    389 -spec process_block_string(string()) -> string().
    390 process_block_string(Escaped) ->
    391   process_block_string(Escaped, []).
    392 
    393 -spec process_block_string(string(), string()) -> string().
    394 process_block_string([], Acc) ->
    395   block_string_value(lists:reverse(Acc));
    396 process_block_string([$\r, $\n | T], Acc) -> process_block_string(T, [$\n | Acc]);
    397 process_block_string([$\\, $", $", $" | T], Acc) -> process_block_string(T, [$", $", $"] ++ Acc);
    398 process_block_string([H | T], Acc) -> process_block_string(T, [H | Acc]).
    399 
    400 -spec block_string_value(string()) -> string().
    401 block_string_value(Value) ->
    402   [FirstLine | Rest] = string:split(Value, "\n", all),
    403   Prefix = indentation_prefix(common_indent(Rest)),
    404   UnindentedLines = unindent(Rest, Prefix),
    405   Lines = trim_blank_lines([FirstLine | UnindentedLines]),
    406   string:join(Lines, "\n").
    407 
    408 -spec trim_blank_lines([string()]) -> [string()].
    409 trim_blank_lines(Lines) ->
    410   trim_blank_lines(trim_blank_lines(Lines, leading), trailing).
    411 
    412 -spec trim_blank_lines([string()], leading | trailing) -> [string()].
    413 trim_blank_lines(Lines, leading) ->
    414   lists:dropwhile(fun is_blank/1, Lines);
    415 trim_blank_lines(Lines, trailing) ->
    416   lists:reverse(trim_blank_lines(lists:reverse(Lines), leading)).
    417 
    418 -spec indentation_prefix(non_neg_integer()) -> string().
    419 indentation_prefix(Indent) ->
    420   lists:map(fun(_) -> 32 end, lists:seq(1, Indent)).
    421 
    422 -spec unindent([string()], string()) -> [string()].
    423 unindent(Lines, Prefix) ->
    424   unindent(Lines, Prefix, []).
    425 
    426 -spec unindent([string()], string(), [string()]) -> [string()].
    427 unindent([], _Prefix, Result) ->
    428   lists:reverse(Result);
    429 unindent([H | T], Prefix, Result) ->
    430   Processed = prefix(H, Prefix),
    431   unindent(T, Prefix, [Processed | Result]).
    432 
    433 -spec prefix(string(), string()) -> string().
    434 prefix(Line, []) ->
    435   Line;
    436 prefix(Line, Prefix) ->
    437   Prefixed = lists:prefix(Prefix, Line),
    438   if
    439     Prefixed ->
    440       string:substr(Line, length(Prefix) + 1);
    441     true ->
    442       Line
    443   end.
    444 
    445 -spec common_indent([string()]) -> non_neg_integer().
    446 common_indent(Lines) ->
    447   case common_indent(Lines, noindent) of
    448     noindent ->
    449       0;
    450     Indent ->
    451       Indent
    452   end.
    453 
    454 -spec common_indent([string()], noindent | non_neg_integer()) -> noindent | non_neg_integer().
    455 common_indent([], Indent) ->
    456     Indent;
    457 common_indent([H | T], Indent) ->
    458   CurrentIndent = leading_whitespace(H),
    459   if
    460     (CurrentIndent < length(H)) and ((Indent == noindent) or (CurrentIndent < Indent)) ->
    461       common_indent(T, CurrentIndent);
    462     true ->
    463       common_indent(T, Indent)
    464   end.
    465 
    466 -spec leading_whitespace(string()) -> non_neg_integer().
    467 leading_whitespace(BlockStringValue) ->
    468   leading_whitespace(BlockStringValue, 0).
    469 
    470 -spec leading_whitespace(string(), non_neg_integer()) -> non_neg_integer().
    471 leading_whitespace([], N) ->
    472   N;
    473 leading_whitespace([32 | T], N) ->
    474   leading_whitespace(T, N + 1);
    475 leading_whitespace([$\t | T], N) ->
    476   leading_whitespace(T, N + 1);
    477 leading_whitespace([_H | _T], N) ->
    478   N.
    479 
    480 -spec is_blank(string()) -> boolean().
    481 is_blank(BlockStringValue) ->
    482     leading_whitespace(BlockStringValue) == length(BlockStringValue).
    483 
    484 % Integer
    485 
    486 extract_integer({_Token, _Loc, Value}) ->
    487   {Int, []} = string:to_integer(Value), Int.
    488 
    489 % Float
    490 
    491 extract_float({_Token, _Loc, Value}) ->
    492   {Float, []} = string:to_float(Value), Float.
    493 
    494 % Boolean
    495 
    496 extract_boolean({_Token, _Loc, "true"}) ->
    497   true;
    498 extract_boolean({_Token, _Loc, "false"}) ->
    499   false.
    500 
    501 % Directive Placement
    502 
    503 do_extract_directive_locations([], Converted) ->
    504   Converted;
    505 do_extract_directive_locations([LocationBinary | Tail], Converted) ->
    506   LocationAtom = to_directive_location_atom(LocationBinary),
    507   do_extract_directive_locations(Tail, [LocationAtom | Converted]).
    508 
    509 to_directive_location_atom(Name) ->
    510   erlang:binary_to_existing_atom(string:lowercase(Name), utf8).
    511 
    512 extract_directive_locations(Locations) ->
    513   Result = do_extract_directive_locations(Locations, []),
    514   lists:sort(Result).