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).