tinygql 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/bench.rb +38 -0
- data/lib/tinygql/lexer.rb +118 -40
- data/lib/tinygql/nodes.rb +255 -86
- data/lib/tinygql/nodes.rb.erb +15 -2
- data/lib/tinygql/nodes.yml +34 -4
- data/lib/tinygql/parser.rb +156 -50
- data/lib/tinygql/version.rb +1 -1
- data/lib/tinygql/visitors.rb +261 -304
- data/lib/tinygql/visitors.rb.erb +8 -20
- data/test/lexer_test.rb +78 -0
- data/test/parser_test.rb +68 -0
- data/test/schema-extensions.graphql +48 -0
- metadata +4 -2
data/lib/tinygql/nodes.yml
CHANGED
@@ -84,7 +84,7 @@ nodes:
|
|
84
84
|
- name: Directive
|
85
85
|
fields:
|
86
86
|
- name: literal
|
87
|
-
- arguments
|
87
|
+
- arguments?: list
|
88
88
|
|
89
89
|
- name: TypeCondition
|
90
90
|
fields:
|
@@ -98,19 +98,19 @@ nodes:
|
|
98
98
|
|
99
99
|
- name: FragmentSpread
|
100
100
|
fields:
|
101
|
-
- fragment_name
|
101
|
+
- fragment_name: literal
|
102
102
|
- directives?: list
|
103
103
|
|
104
104
|
- name: FragmentDefinition
|
105
105
|
fields:
|
106
|
-
- fragment_name
|
106
|
+
- fragment_name: literal
|
107
107
|
- type_condition
|
108
108
|
- directives?: list
|
109
109
|
- selection_set: list
|
110
110
|
|
111
111
|
- name: RootOperationTypeDefinition
|
112
112
|
fields:
|
113
|
-
- operation_type
|
113
|
+
- operation_type: literal
|
114
114
|
- named_type
|
115
115
|
|
116
116
|
- name: SchemaDefinition
|
@@ -204,3 +204,33 @@ nodes:
|
|
204
204
|
- name: literal
|
205
205
|
- arguments_definition?: list
|
206
206
|
- directive_locations: list
|
207
|
+
|
208
|
+
- name: ScalarTypeExtension
|
209
|
+
fields:
|
210
|
+
- name: literal
|
211
|
+
- directives?: list
|
212
|
+
|
213
|
+
- name: InterfaceTypeExtension
|
214
|
+
fields:
|
215
|
+
- name: literal
|
216
|
+
- implements_interfaces?: list
|
217
|
+
- directives?: list
|
218
|
+
- fields_definition?: list
|
219
|
+
|
220
|
+
- name: UnionTypeExtension
|
221
|
+
fields:
|
222
|
+
- name: literal
|
223
|
+
- directives?: list
|
224
|
+
- union_member_types?: list
|
225
|
+
|
226
|
+
- name: EnumTypeExtension
|
227
|
+
fields:
|
228
|
+
- name: literal
|
229
|
+
- directives?: list
|
230
|
+
- enum_value_definition?: list
|
231
|
+
|
232
|
+
- name: InputObjectTypeExtension
|
233
|
+
fields:
|
234
|
+
- name: literal
|
235
|
+
- directives?: list
|
236
|
+
- input_fields_definition?: list
|
data/lib/tinygql/parser.rb
CHANGED
@@ -13,8 +13,7 @@ module TinyGQL
|
|
13
13
|
|
14
14
|
def initialize doc
|
15
15
|
@lexer = Lexer.new doc
|
16
|
-
@lexer.advance
|
17
|
-
@token_name = @lexer.token_name
|
16
|
+
@token_name = @lexer.advance
|
18
17
|
end
|
19
18
|
|
20
19
|
def parse
|
@@ -25,8 +24,13 @@ module TinyGQL
|
|
25
24
|
|
26
25
|
attr_reader :token_name
|
27
26
|
|
27
|
+
def pos
|
28
|
+
@lexer.pos
|
29
|
+
end
|
30
|
+
|
28
31
|
def document
|
29
|
-
|
32
|
+
loc = pos
|
33
|
+
Nodes::Document.new loc, definition_list
|
30
34
|
end
|
31
35
|
|
32
36
|
def definition_list
|
@@ -53,19 +57,70 @@ module TinyGQL
|
|
53
57
|
def type_system_extension
|
54
58
|
expect_token :EXTEND
|
55
59
|
case token_name
|
60
|
+
when :SCALAR then scalar_type_extension
|
56
61
|
when :TYPE then object_type_extension
|
62
|
+
when :INTERFACE then interface_type_extension
|
63
|
+
when :UNION then union_type_extension
|
64
|
+
when :ENUM then enum_type_extension
|
65
|
+
when :INPUT then input_object_type_extension
|
57
66
|
else
|
58
|
-
expect_token :
|
67
|
+
expect_token :SCALAR
|
59
68
|
end
|
60
69
|
end
|
61
70
|
|
71
|
+
def input_object_type_extension
|
72
|
+
loc = pos
|
73
|
+
expect_token :INPUT
|
74
|
+
name = self.name
|
75
|
+
directives = if at?(:DIR_SIGN); self.directives; end
|
76
|
+
input_fields_definition = if at?(:LCURLY); self.input_fields_definition; end
|
77
|
+
Nodes::InputObjectTypeExtension.new(loc, name, directives, input_fields_definition)
|
78
|
+
end
|
79
|
+
|
80
|
+
def enum_type_extension
|
81
|
+
loc = pos
|
82
|
+
expect_token :ENUM
|
83
|
+
name = self.name
|
84
|
+
directives = if at?(:DIR_SIGN); self.directives; end
|
85
|
+
enum_values_definition = if at?(:LCURLY); self.enum_values_definition; end
|
86
|
+
Nodes::EnumTypeExtension.new(loc, name, directives, enum_values_definition)
|
87
|
+
end
|
88
|
+
|
89
|
+
def union_type_extension
|
90
|
+
loc = pos
|
91
|
+
expect_token :UNION
|
92
|
+
name = self.name
|
93
|
+
directives = if at?(:DIR_SIGN); self.directives; end
|
94
|
+
union_member_types = if at?(:EQUALS); self.union_member_types; end
|
95
|
+
Nodes::UnionTypeExtension.new(loc, name, directives, union_member_types)
|
96
|
+
end
|
97
|
+
|
98
|
+
def interface_type_extension
|
99
|
+
loc = pos
|
100
|
+
expect_token :INTERFACE
|
101
|
+
name = self.name
|
102
|
+
implements_interfaces = if at?(:IMPLEMENTS); self.implements_interfaces; end
|
103
|
+
directives = if at?(:DIR_SIGN); self.directives; end
|
104
|
+
fields_definition = if at?(:LCURLY); self.fields_definition; end
|
105
|
+
Nodes::InterfaceTypeExtension.new(loc, name, implements_interfaces, directives, fields_definition)
|
106
|
+
end
|
107
|
+
|
108
|
+
def scalar_type_extension
|
109
|
+
loc = pos
|
110
|
+
expect_token :SCALAR
|
111
|
+
name = self.name
|
112
|
+
directives = if at?(:DIR_SIGN); self.directives; end
|
113
|
+
Nodes::ScalarTypeExtension.new(loc, name, directives)
|
114
|
+
end
|
115
|
+
|
62
116
|
def object_type_extension
|
117
|
+
loc = pos
|
63
118
|
expect_token :TYPE
|
64
119
|
name = self.name
|
65
120
|
implements_interfaces = if at?(:IMPLEMENTS); self.implements_interfaces; end
|
66
121
|
directives = if at?(:DIR_SIGN); self.directives; end
|
67
122
|
fields_definition = if at?(:LCURLY); self.fields_definition; end
|
68
|
-
Nodes::ObjectTypeExtension.new(name, implements_interfaces, directives, fields_definition)
|
123
|
+
Nodes::ObjectTypeExtension.new(loc, name, implements_interfaces, directives, fields_definition)
|
69
124
|
end
|
70
125
|
|
71
126
|
def type_system_definition desc
|
@@ -78,13 +133,14 @@ module TinyGQL
|
|
78
133
|
end
|
79
134
|
|
80
135
|
def directive_defintion desc
|
136
|
+
loc = pos
|
81
137
|
expect_token :DIRECTIVE
|
82
138
|
expect_token :DIR_SIGN
|
83
139
|
name = self.name
|
84
140
|
arguments_definition = if at?(:LPAREN); self.arguments_definition; end
|
85
141
|
expect_token :ON
|
86
142
|
directive_locations = self.directive_locations
|
87
|
-
Nodes::DirectiveDefinition.new(desc, name, arguments_definition, directive_locations)
|
143
|
+
Nodes::DirectiveDefinition.new(loc, desc, name, arguments_definition, directive_locations)
|
88
144
|
end
|
89
145
|
|
90
146
|
def directive_locations
|
@@ -97,11 +153,12 @@ module TinyGQL
|
|
97
153
|
end
|
98
154
|
|
99
155
|
def directive_location
|
156
|
+
loc = pos
|
100
157
|
directive = expect_token_value :IDENTIFIER
|
101
158
|
|
102
159
|
case directive
|
103
160
|
when "QUERY", "MUTATION", "SUBSCRIPTION", "FIELD", "FRAGMENT_DEFINITION", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"
|
104
|
-
Nodes::ExecutableDirectiveLocation.new(directive)
|
161
|
+
Nodes::ExecutableDirectiveLocation.new(loc, directive)
|
105
162
|
when "SCHEMA",
|
106
163
|
"SCALAR",
|
107
164
|
"OBJECT",
|
@@ -113,7 +170,7 @@ module TinyGQL
|
|
113
170
|
"ENUM_VALUE",
|
114
171
|
"INPUT_OBJECT",
|
115
172
|
"INPUT_FIELD_DEFINITION"
|
116
|
-
Nodes::TypeSystemDirectiveLocation.new(directive)
|
173
|
+
Nodes::TypeSystemDirectiveLocation.new(loc, directive)
|
117
174
|
else
|
118
175
|
raise UnexpectedToken, "Expected directive #{directive}"
|
119
176
|
end
|
@@ -128,16 +185,17 @@ module TinyGQL
|
|
128
185
|
when :ENUM then enum_type_definition(desc)
|
129
186
|
when :INPUT then input_object_type_definition(desc)
|
130
187
|
else
|
131
|
-
expect_token :
|
188
|
+
expect_token :TYPE
|
132
189
|
end
|
133
190
|
end
|
134
191
|
|
135
192
|
def input_object_type_definition desc
|
193
|
+
loc = pos
|
136
194
|
expect_token :INPUT
|
137
195
|
name = self.name
|
138
196
|
directives = if at?(:DIR_SIGN); self.directives; end
|
139
197
|
input_fields_definition = if at?(:LCURLY); self.input_fields_definition; end
|
140
|
-
Nodes::InputObjectTypeDefinition.new(desc, name, directives, input_fields_definition)
|
198
|
+
Nodes::InputObjectTypeDefinition.new(loc, desc, name, directives, input_fields_definition)
|
141
199
|
end
|
142
200
|
|
143
201
|
def input_fields_definition
|
@@ -151,11 +209,12 @@ module TinyGQL
|
|
151
209
|
end
|
152
210
|
|
153
211
|
def enum_type_definition desc
|
212
|
+
loc = pos
|
154
213
|
expect_token :ENUM
|
155
214
|
name = self.name
|
156
215
|
directives = if at?(:DIR_SIGN); self.directives; end
|
157
216
|
enum_values_definition = if at?(:LCURLY); self.enum_values_definition; end
|
158
|
-
Nodes::EnumTypeDefinition.new(desc, name, directives, enum_values_definition)
|
217
|
+
Nodes::EnumTypeDefinition.new(loc, desc, name, directives, enum_values_definition)
|
159
218
|
end
|
160
219
|
|
161
220
|
def enum_values_definition
|
@@ -169,25 +228,28 @@ module TinyGQL
|
|
169
228
|
end
|
170
229
|
|
171
230
|
def enum_value_definition
|
231
|
+
loc = pos
|
172
232
|
description = if at?(:STRING); string_value; end
|
173
233
|
enum_value = self.enum_value
|
174
234
|
directives = if at?(:DIR_SIGN); self.directives; end
|
175
|
-
Nodes::EnumValueDefinition.new(description, enum_value, directives)
|
235
|
+
Nodes::EnumValueDefinition.new(loc, description, enum_value, directives)
|
176
236
|
end
|
177
237
|
|
178
238
|
def scalar_type_definition desc
|
239
|
+
loc = pos
|
179
240
|
expect_token :SCALAR
|
180
241
|
name = self.name
|
181
242
|
directives = if at?(:DIR_SIGN); self.directives; end
|
182
|
-
Nodes::ScalarTypeDefinition.new(desc, name, directives)
|
243
|
+
Nodes::ScalarTypeDefinition.new(loc, desc, name, directives)
|
183
244
|
end
|
184
245
|
|
185
246
|
def union_type_definition desc
|
247
|
+
loc = pos
|
186
248
|
expect_token :UNION
|
187
249
|
name = self.name
|
188
250
|
directives = if at?(:DIR_SIGN); self.directives; end
|
189
251
|
union_member_types = if at?(:EQUALS); self.union_member_types; end
|
190
|
-
Nodes::UnionTypeDefinition.new(desc, name, directives, union_member_types)
|
252
|
+
Nodes::UnionTypeDefinition.new(loc, desc, name, directives, union_member_types)
|
191
253
|
end
|
192
254
|
|
193
255
|
def union_member_types
|
@@ -201,21 +263,23 @@ module TinyGQL
|
|
201
263
|
end
|
202
264
|
|
203
265
|
def interface_type_definition desc
|
266
|
+
loc = pos
|
204
267
|
expect_token :INTERFACE
|
205
268
|
name = self.name
|
206
269
|
directives = if at?(:DIR_SIGN); self.directives; end
|
207
270
|
fields_definition = if at?(:LCURLY); self.fields_definition; end
|
208
|
-
Nodes::InterfaceTypeDefinition.new(desc, name, directives, fields_definition)
|
271
|
+
Nodes::InterfaceTypeDefinition.new(loc, desc, name, directives, fields_definition)
|
209
272
|
end
|
210
273
|
|
211
274
|
def object_type_definition desc
|
275
|
+
loc = pos
|
212
276
|
expect_token :TYPE
|
213
277
|
name = self.name
|
214
278
|
implements_interfaces = if at?(:IMPLEMENTS); self.implements_interfaces; end
|
215
279
|
directives = if at?(:DIR_SIGN); self.directives; end
|
216
280
|
fields_definition = if at?(:LCURLY); self.fields_definition; end
|
217
281
|
|
218
|
-
Nodes::ObjectTypeDefinition.new(desc, name, implements_interfaces, directives, fields_definition)
|
282
|
+
Nodes::ObjectTypeDefinition.new(loc, desc, name, implements_interfaces, directives, fields_definition)
|
219
283
|
end
|
220
284
|
|
221
285
|
def fields_definition
|
@@ -229,6 +293,7 @@ module TinyGQL
|
|
229
293
|
end
|
230
294
|
|
231
295
|
def field_definition
|
296
|
+
loc = pos
|
232
297
|
description = if at?(:STRING); string_value; end
|
233
298
|
name = self.name
|
234
299
|
arguments_definition = if at?(:LPAREN); self.arguments_definition; end
|
@@ -236,7 +301,7 @@ module TinyGQL
|
|
236
301
|
type = self.type
|
237
302
|
directives = if at?(:DIR_SIGN); self.directives; end
|
238
303
|
|
239
|
-
Nodes::FieldDefinition.new(description, name, arguments_definition, type, directives)
|
304
|
+
Nodes::FieldDefinition.new(loc, description, name, arguments_definition, type, directives)
|
240
305
|
end
|
241
306
|
|
242
307
|
def arguments_definition
|
@@ -250,13 +315,14 @@ module TinyGQL
|
|
250
315
|
end
|
251
316
|
|
252
317
|
def input_value_definition
|
318
|
+
loc = pos
|
253
319
|
description = if at?(:STRING); string_value; end
|
254
320
|
name = self.name
|
255
321
|
expect_token :COLON
|
256
322
|
type = self.type
|
257
323
|
default_value = if at?(:EQUALS); self.default_value; end
|
258
324
|
directives = if at?(:DIR_SIGN); self.directives; end
|
259
|
-
Nodes::InputValueDefinition.new(description, name, type, default_value, directives)
|
325
|
+
Nodes::InputValueDefinition.new(loc, description, name, type, default_value, directives)
|
260
326
|
end
|
261
327
|
|
262
328
|
def implements_interfaces
|
@@ -271,21 +337,23 @@ module TinyGQL
|
|
271
337
|
end
|
272
338
|
|
273
339
|
def schema_definition desc
|
340
|
+
loc = pos
|
274
341
|
expect_token :SCHEMA
|
275
342
|
|
276
343
|
directives = if at?(:DIR_SIGN); self.directives; end
|
277
344
|
expect_token :LCURLY
|
278
345
|
defs = root_operation_type_definition
|
279
346
|
expect_token :RCURLY
|
280
|
-
Nodes::SchemaDefinition.new(desc, directives, defs)
|
347
|
+
Nodes::SchemaDefinition.new(loc, desc, directives, defs)
|
281
348
|
end
|
282
349
|
|
283
350
|
def root_operation_type_definition
|
284
351
|
list = []
|
285
352
|
while !at?(:RCURLY)
|
353
|
+
loc = pos
|
286
354
|
operation_type = self.operation_type
|
287
355
|
expect_token :COLON
|
288
|
-
list << Nodes::RootOperationTypeDefinition.new(operation_type, named_type)
|
356
|
+
list << Nodes::RootOperationTypeDefinition.new(loc, operation_type, named_type)
|
289
357
|
end
|
290
358
|
list
|
291
359
|
end
|
@@ -299,18 +367,20 @@ module TinyGQL
|
|
299
367
|
end
|
300
368
|
|
301
369
|
def fragment_definition
|
370
|
+
loc = pos
|
302
371
|
expect_token :FRAGMENT
|
303
|
-
expect_token(:
|
372
|
+
expect_token(:IDENTIFIER) if at?(:ON)
|
304
373
|
name = self.name
|
305
374
|
tc = self.type_condition
|
306
375
|
directives = if at?(:DIR_SIGN)
|
307
376
|
self.directives
|
308
377
|
end
|
309
378
|
|
310
|
-
Nodes::FragmentDefinition.new(name, tc, directives, selection_set)
|
379
|
+
Nodes::FragmentDefinition.new(loc, name, tc, directives, selection_set)
|
311
380
|
end
|
312
381
|
|
313
382
|
def operation_definition
|
383
|
+
loc = pos
|
314
384
|
case token_name
|
315
385
|
when :QUERY, :MUTATION, :SUBSCRIPTION
|
316
386
|
type = self.operation_type
|
@@ -320,6 +390,7 @@ module TinyGQL
|
|
320
390
|
end
|
321
391
|
|
322
392
|
Nodes::OperationDefinition.new(
|
393
|
+
loc,
|
323
394
|
type,
|
324
395
|
ident,
|
325
396
|
variable_definitions,
|
@@ -353,20 +424,22 @@ module TinyGQL
|
|
353
424
|
when :ON, :DIR_SIGN, :LCURLY then inline_fragment
|
354
425
|
when :IDENTIFIER then fragment_spread
|
355
426
|
else
|
356
|
-
expect_token :
|
427
|
+
expect_token :IDENTIFIER
|
357
428
|
end
|
358
429
|
end
|
359
430
|
|
360
431
|
def fragment_spread
|
432
|
+
loc = pos
|
361
433
|
name = self.name
|
362
|
-
directives = if at?(:DIR_SIGN)
|
363
|
-
self.directives
|
364
|
-
end
|
434
|
+
directives = if at?(:DIR_SIGN); self.directives; end
|
365
435
|
|
366
|
-
|
436
|
+
expect_token(:IDENTIFIER) if at?(:ON)
|
437
|
+
|
438
|
+
Nodes::FragmentSpread.new(loc, name, directives)
|
367
439
|
end
|
368
440
|
|
369
441
|
def inline_fragment
|
442
|
+
loc = pos
|
370
443
|
type_condition = if at?(:ON)
|
371
444
|
self.type_condition
|
372
445
|
end
|
@@ -375,15 +448,17 @@ module TinyGQL
|
|
375
448
|
self.directives
|
376
449
|
end
|
377
450
|
|
378
|
-
Nodes::InlineFragment.new(type_condition, directives, selection_set)
|
451
|
+
Nodes::InlineFragment.new(loc, type_condition, directives, selection_set)
|
379
452
|
end
|
380
453
|
|
381
454
|
def type_condition
|
455
|
+
loc = pos
|
382
456
|
expect_token :ON
|
383
|
-
Nodes::TypeCondition.new(named_type)
|
457
|
+
Nodes::TypeCondition.new(loc, named_type)
|
384
458
|
end
|
385
459
|
|
386
460
|
def field
|
461
|
+
loc = pos
|
387
462
|
name = self.name
|
388
463
|
|
389
464
|
aliaz = nil
|
@@ -398,7 +473,7 @@ module TinyGQL
|
|
398
473
|
directives = if at?(:DIR_SIGN); self.directives; end
|
399
474
|
selection_set = if at?(:LCURLY); self.selection_set; end
|
400
475
|
|
401
|
-
Nodes::Field.new(aliaz, name, arguments, directives, selection_set)
|
476
|
+
Nodes::Field.new(loc, aliaz, name, arguments, directives, selection_set)
|
402
477
|
end
|
403
478
|
|
404
479
|
def operation_type
|
@@ -414,13 +489,14 @@ module TinyGQL
|
|
414
489
|
end
|
415
490
|
|
416
491
|
def directive
|
492
|
+
loc = pos
|
417
493
|
expect_token(:DIR_SIGN)
|
418
494
|
name = self.name
|
419
495
|
arguments = if at?(:LPAREN)
|
420
496
|
self.arguments
|
421
497
|
end
|
422
498
|
|
423
|
-
Nodes::Directive.new(name, arguments)
|
499
|
+
Nodes::Directive.new(loc, name, arguments)
|
424
500
|
end
|
425
501
|
|
426
502
|
def arguments
|
@@ -434,9 +510,10 @@ module TinyGQL
|
|
434
510
|
end
|
435
511
|
|
436
512
|
def argument
|
513
|
+
loc = pos
|
437
514
|
name = self.name
|
438
515
|
expect_token(:COLON)
|
439
|
-
Nodes::Argument.new(name, value)
|
516
|
+
Nodes::Argument.new(loc, name, value)
|
440
517
|
end
|
441
518
|
|
442
519
|
def variable_definitions
|
@@ -450,6 +527,7 @@ module TinyGQL
|
|
450
527
|
end
|
451
528
|
|
452
529
|
def variable_definition
|
530
|
+
loc = pos
|
453
531
|
var = variable
|
454
532
|
expect_token(:COLON)
|
455
533
|
type = self.type
|
@@ -457,7 +535,7 @@ module TinyGQL
|
|
457
535
|
self.default_value
|
458
536
|
end
|
459
537
|
|
460
|
-
Nodes::VariableDefinition.new(var, type, default_value)
|
538
|
+
Nodes::VariableDefinition.new(loc, var, type, default_value)
|
461
539
|
end
|
462
540
|
|
463
541
|
def default_value
|
@@ -477,54 +555,66 @@ module TinyGQL
|
|
477
555
|
when :LCURLY then object_value
|
478
556
|
when :VAR_SIGN then variable
|
479
557
|
else
|
480
|
-
expect_token :
|
558
|
+
expect_token :INT
|
481
559
|
end
|
482
560
|
end
|
483
561
|
|
484
562
|
def object_value
|
563
|
+
start = pos
|
485
564
|
expect_token(:LCURLY)
|
486
565
|
list = []
|
487
566
|
while !at?(:RCURLY)
|
567
|
+
loc = pos
|
488
568
|
n = name
|
489
569
|
expect_token(:COLON)
|
490
|
-
list << Nodes::ObjectField.new(n, value)
|
570
|
+
list << Nodes::ObjectField.new(loc, n, value)
|
491
571
|
end
|
492
572
|
expect_token(:RCURLY)
|
493
|
-
Nodes::ObjectValue.new(list)
|
573
|
+
Nodes::ObjectValue.new(start, list)
|
494
574
|
end
|
495
575
|
|
496
576
|
def list_value
|
577
|
+
loc = pos
|
497
578
|
expect_token(:LBRACKET)
|
498
579
|
list = []
|
499
580
|
while !at?(:RBRACKET)
|
500
581
|
list << value
|
501
582
|
end
|
502
583
|
expect_token(:RBRACKET)
|
503
|
-
Nodes::ListValue.new(list)
|
584
|
+
Nodes::ListValue.new(loc, list)
|
504
585
|
end
|
505
586
|
|
506
587
|
def enum_value
|
507
|
-
Nodes::EnumValue.new(expect_token_value(:IDENTIFIER))
|
588
|
+
Nodes::EnumValue.new(pos, expect_token_value(:IDENTIFIER))
|
508
589
|
end
|
509
590
|
|
510
591
|
def float_value
|
511
|
-
Nodes::FloatValue.new(expect_token_value(:FLOAT))
|
592
|
+
Nodes::FloatValue.new(pos, expect_token_value(:FLOAT))
|
512
593
|
end
|
513
594
|
|
514
595
|
def int_value
|
515
|
-
Nodes::IntValue.new(expect_token_value(:INT))
|
596
|
+
Nodes::IntValue.new(pos, expect_token_value(:INT))
|
516
597
|
end
|
517
598
|
|
518
599
|
def string_value
|
519
|
-
Nodes::StringValue.new(
|
600
|
+
Nodes::StringValue.new(pos, expect_string_value)
|
520
601
|
end
|
521
602
|
|
522
603
|
def boolean_value
|
523
|
-
|
604
|
+
if at?(:TRUE)
|
605
|
+
accept_token
|
606
|
+
Nodes::BooleanValue.new(pos, "true")
|
607
|
+
elsif at?(:FALSE)
|
608
|
+
accept_token
|
609
|
+
Nodes::BooleanValue.new(pos, "false")
|
610
|
+
else
|
611
|
+
expect_tokens([:TRUE, :FALSE])
|
612
|
+
end
|
524
613
|
end
|
525
614
|
|
526
615
|
def null_value
|
527
|
-
|
616
|
+
expect_token :NULL
|
617
|
+
Nodes::NullValue.new(pos, "null")
|
528
618
|
end
|
529
619
|
|
530
620
|
def type
|
@@ -534,40 +624,50 @@ module TinyGQL
|
|
534
624
|
end
|
535
625
|
|
536
626
|
if at?(:BANG)
|
537
|
-
Nodes::NotNullType.new type
|
627
|
+
Nodes::NotNullType.new pos, type
|
538
628
|
expect_token(:BANG)
|
539
629
|
end
|
540
630
|
type
|
541
631
|
end
|
542
632
|
|
543
633
|
def list_type
|
634
|
+
loc = pos
|
544
635
|
expect_token(:LBRACKET)
|
545
|
-
type = Nodes::ListType.new(self.type)
|
636
|
+
type = Nodes::ListType.new(loc, self.type)
|
546
637
|
expect_token(:RBRACKET)
|
547
638
|
type
|
548
639
|
end
|
549
640
|
|
550
641
|
def named_type
|
551
|
-
Nodes::NamedType.new(name)
|
642
|
+
Nodes::NamedType.new(pos, name)
|
552
643
|
end
|
553
644
|
|
554
645
|
def variable
|
555
646
|
return unless at?(:VAR_SIGN)
|
647
|
+
loc = pos
|
556
648
|
accept_token
|
557
|
-
Nodes::Variable.new name
|
649
|
+
Nodes::Variable.new loc, name
|
558
650
|
end
|
559
651
|
|
560
652
|
def name
|
561
653
|
case token_name
|
562
|
-
when :IDENTIFIER
|
654
|
+
when :IDENTIFIER then accept_token_value
|
655
|
+
when :TYPE then
|
656
|
+
accept_token
|
657
|
+
"type"
|
658
|
+
when :QUERY then
|
659
|
+
accept_token
|
660
|
+
"query"
|
661
|
+
when :INPUT then
|
662
|
+
accept_token
|
663
|
+
"input"
|
563
664
|
else
|
564
665
|
expect_token_value(:IDENTIFIER)
|
565
666
|
end
|
566
667
|
end
|
567
668
|
|
568
669
|
def accept_token
|
569
|
-
@lexer.advance
|
570
|
-
@token_name = @lexer.token_name
|
670
|
+
@token_name = @lexer.advance
|
571
671
|
end
|
572
672
|
|
573
673
|
# Only use when we care about the accepted token's value
|
@@ -591,6 +691,12 @@ module TinyGQL
|
|
591
691
|
token_value
|
592
692
|
end
|
593
693
|
|
694
|
+
def expect_string_value
|
695
|
+
token_value = @lexer.string_value
|
696
|
+
expect_token :STRING
|
697
|
+
token_value
|
698
|
+
end
|
699
|
+
|
594
700
|
def expect_tokens toks
|
595
701
|
token_value = @lexer.token_value
|
596
702
|
unless toks.any? { |tok| at?(tok) }
|
data/lib/tinygql/version.rb
CHANGED