1
1
from copy import copy , deepcopy
2
2
from enum import Enum
3
- from typing import List , NamedTuple , Optional , Union
3
+ from typing import NamedTuple , Optional , Union
4
4
5
5
from .source import Source
6
6
from .token_kind import TokenKind
7
- from ..pyutils import camel_to_snake
7
+ from ..pyutils import camel_to_snake , FrozenList
8
8
9
9
__all__ = [
10
10
"Location" ,
@@ -110,6 +110,11 @@ def __eq__(self, other):
110
110
return other == self .desc
111
111
return False
112
112
113
+ def __hash__ (self ):
114
+ return hash (
115
+ (self .kind , self .start , self .end , self .line , self .column , self .value )
116
+ )
117
+
113
118
def __copy__ (self ):
114
119
"""Create a shallow copy of the token"""
115
120
return self .__class__ (
@@ -163,8 +168,8 @@ def __eq__(self, other):
163
168
return self .start == other [0 ] and self .end == other [1 ]
164
169
return False
165
170
166
- def __ne__ (self , other ):
167
- return not self .__eq__ ( other )
171
+ def __hash__ (self ):
172
+ return hash (( self . start , self .end ) )
168
173
169
174
170
175
class OperationType (Enum ):
@@ -190,7 +195,10 @@ class Node:
190
195
def __init__ (self , ** kwargs ):
191
196
"""Initialize the node with the given keyword arguments."""
192
197
for key in self .keys :
193
- setattr (self , key , kwargs .get (key ))
198
+ value = kwargs .get (key )
199
+ if isinstance (value , list ) and not isinstance (value , FrozenList ):
200
+ value = FrozenList (value )
201
+ setattr (self , key , value )
194
202
195
203
def __repr__ (self ):
196
204
"""Get a simple representation of the node."""
@@ -206,7 +214,7 @@ def __eq__(self, other):
206
214
)
207
215
208
216
def __hash__ (self ):
209
- return id ( self )
217
+ return hash ( tuple ( getattr ( self , key ) for key in self . keys ) )
210
218
211
219
def __copy__ (self ):
212
220
"""Create a shallow copy of the node."""
@@ -248,7 +256,7 @@ class NameNode(Node):
248
256
class DocumentNode (Node ):
249
257
__slots__ = ("definitions" ,)
250
258
251
- definitions : List ["DefinitionNode" ]
259
+ definitions : FrozenList ["DefinitionNode" ]
252
260
253
261
254
262
class DefinitionNode (Node ):
@@ -259,8 +267,8 @@ class ExecutableDefinitionNode(DefinitionNode):
259
267
__slots__ = "name" , "directives" , "variable_definitions" , "selection_set"
260
268
261
269
name : Optional [NameNode ]
262
- directives : Optional [List ["DirectiveNode" ]]
263
- variable_definitions : List ["VariableDefinitionNode" ]
270
+ directives : Optional [FrozenList ["DirectiveNode" ]]
271
+ variable_definitions : FrozenList ["VariableDefinitionNode" ]
264
272
selection_set : "SelectionSetNode"
265
273
266
274
@@ -276,27 +284,27 @@ class VariableDefinitionNode(Node):
276
284
variable : "VariableNode"
277
285
type : "TypeNode"
278
286
default_value : Optional ["ValueNode" ]
279
- directives : Optional [List ["DirectiveNode" ]]
287
+ directives : Optional [FrozenList ["DirectiveNode" ]]
280
288
281
289
282
290
class SelectionSetNode (Node ):
283
291
__slots__ = ("selections" ,)
284
292
285
- selections : List ["SelectionNode" ]
293
+ selections : FrozenList ["SelectionNode" ]
286
294
287
295
288
296
class SelectionNode (Node ):
289
297
__slots__ = ("directives" ,)
290
298
291
- directives : Optional [List ["DirectiveNode" ]]
299
+ directives : Optional [FrozenList ["DirectiveNode" ]]
292
300
293
301
294
302
class FieldNode (SelectionNode ):
295
303
__slots__ = "alias" , "name" , "arguments" , "selection_set"
296
304
297
305
alias : Optional [NameNode ]
298
306
name : NameNode
299
- arguments : Optional [List ["ArgumentNode" ]]
307
+ arguments : Optional [FrozenList ["ArgumentNode" ]]
300
308
selection_set : Optional [SelectionSetNode ]
301
309
302
310
@@ -381,13 +389,13 @@ class EnumValueNode(ValueNode):
381
389
class ListValueNode (ValueNode ):
382
390
__slots__ = ("values" ,)
383
391
384
- values : List [ValueNode ]
392
+ values : FrozenList [ValueNode ]
385
393
386
394
387
395
class ObjectValueNode (ValueNode ):
388
396
__slots__ = ("fields" ,)
389
397
390
- fields : List ["ObjectFieldNode" ]
398
+ fields : FrozenList ["ObjectFieldNode" ]
391
399
392
400
393
401
class ObjectFieldNode (Node ):
@@ -404,7 +412,7 @@ class DirectiveNode(Node):
404
412
__slots__ = "name" , "arguments"
405
413
406
414
name : NameNode
407
- arguments : List [ArgumentNode ]
415
+ arguments : FrozenList [ArgumentNode ]
408
416
409
417
410
418
# Type Reference
@@ -442,8 +450,8 @@ class TypeSystemDefinitionNode(DefinitionNode):
442
450
class SchemaDefinitionNode (TypeSystemDefinitionNode ):
443
451
__slots__ = "directives" , "operation_types"
444
452
445
- directives : Optional [List [DirectiveNode ]]
446
- operation_types : List ["OperationTypeDefinitionNode" ]
453
+ directives : Optional [FrozenList [DirectiveNode ]]
454
+ operation_types : FrozenList ["OperationTypeDefinitionNode" ]
447
455
448
456
449
457
class OperationTypeDefinitionNode (Node ):
@@ -461,7 +469,7 @@ class TypeDefinitionNode(TypeSystemDefinitionNode):
461
469
462
470
description : Optional [StringValueNode ]
463
471
name : NameNode
464
- directives : Optional [List [DirectiveNode ]]
472
+ directives : Optional [FrozenList [DirectiveNode ]]
465
473
466
474
467
475
class ScalarTypeDefinitionNode (TypeDefinitionNode ):
@@ -471,14 +479,14 @@ class ScalarTypeDefinitionNode(TypeDefinitionNode):
471
479
class ObjectTypeDefinitionNode (TypeDefinitionNode ):
472
480
__slots__ = "interfaces" , "fields"
473
481
474
- interfaces : Optional [List [NamedTypeNode ]]
475
- fields : Optional [List ["FieldDefinitionNode" ]]
482
+ interfaces : Optional [FrozenList [NamedTypeNode ]]
483
+ fields : Optional [FrozenList ["FieldDefinitionNode" ]]
476
484
477
485
478
486
class FieldDefinitionNode (TypeDefinitionNode ):
479
487
__slots__ = "arguments" , "type"
480
488
481
- arguments : Optional [List ["InputValueDefinitionNode" ]]
489
+ arguments : Optional [FrozenList ["InputValueDefinitionNode" ]]
482
490
type : TypeNode
483
491
484
492
@@ -492,19 +500,19 @@ class InputValueDefinitionNode(TypeDefinitionNode):
492
500
class InterfaceTypeDefinitionNode (TypeDefinitionNode ):
493
501
__slots__ = ("fields" ,)
494
502
495
- fields : Optional [List ["FieldDefinitionNode" ]]
503
+ fields : Optional [FrozenList ["FieldDefinitionNode" ]]
496
504
497
505
498
506
class UnionTypeDefinitionNode (TypeDefinitionNode ):
499
507
__slots__ = ("types" ,)
500
508
501
- types : Optional [List [NamedTypeNode ]]
509
+ types : Optional [FrozenList [NamedTypeNode ]]
502
510
503
511
504
512
class EnumTypeDefinitionNode (TypeDefinitionNode ):
505
513
__slots__ = ("values" ,)
506
514
507
- values : Optional [List ["EnumValueDefinitionNode" ]]
515
+ values : Optional [FrozenList ["EnumValueDefinitionNode" ]]
508
516
509
517
510
518
class EnumValueDefinitionNode (TypeDefinitionNode ):
@@ -514,7 +522,7 @@ class EnumValueDefinitionNode(TypeDefinitionNode):
514
522
class InputObjectTypeDefinitionNode (TypeDefinitionNode ):
515
523
__slots__ = ("fields" ,)
516
524
517
- fields : Optional [List [InputValueDefinitionNode ]]
525
+ fields : Optional [FrozenList [InputValueDefinitionNode ]]
518
526
519
527
520
528
# Directive Definitions
@@ -525,9 +533,9 @@ class DirectiveDefinitionNode(TypeSystemDefinitionNode):
525
533
526
534
description : Optional [StringValueNode ]
527
535
name : NameNode
528
- arguments : Optional [List [InputValueDefinitionNode ]]
536
+ arguments : Optional [FrozenList [InputValueDefinitionNode ]]
529
537
repeatable : bool
530
- locations : List [NameNode ]
538
+ locations : FrozenList [NameNode ]
531
539
532
540
533
541
# Type System Extensions
@@ -536,8 +544,8 @@ class DirectiveDefinitionNode(TypeSystemDefinitionNode):
536
544
class SchemaExtensionNode (Node ):
537
545
__slots__ = "directives" , "operation_types"
538
546
539
- directives : Optional [List [DirectiveNode ]]
540
- operation_types : Optional [List [OperationTypeDefinitionNode ]]
547
+ directives : Optional [FrozenList [DirectiveNode ]]
548
+ operation_types : Optional [FrozenList [OperationTypeDefinitionNode ]]
541
549
542
550
543
551
# Type Extensions
@@ -547,7 +555,7 @@ class TypeExtensionNode(TypeSystemDefinitionNode):
547
555
__slots__ = "name" , "directives"
548
556
549
557
name : NameNode
550
- directives : Optional [List [DirectiveNode ]]
558
+ directives : Optional [FrozenList [DirectiveNode ]]
551
559
552
560
553
561
TypeSystemExtensionNode = Union [SchemaExtensionNode , TypeExtensionNode ]
@@ -560,29 +568,29 @@ class ScalarTypeExtensionNode(TypeExtensionNode):
560
568
class ObjectTypeExtensionNode (TypeExtensionNode ):
561
569
__slots__ = "interfaces" , "fields"
562
570
563
- interfaces : Optional [List [NamedTypeNode ]]
564
- fields : Optional [List [FieldDefinitionNode ]]
571
+ interfaces : Optional [FrozenList [NamedTypeNode ]]
572
+ fields : Optional [FrozenList [FieldDefinitionNode ]]
565
573
566
574
567
575
class InterfaceTypeExtensionNode (TypeExtensionNode ):
568
576
__slots__ = ("fields" ,)
569
577
570
- fields : Optional [List [FieldDefinitionNode ]]
578
+ fields : Optional [FrozenList [FieldDefinitionNode ]]
571
579
572
580
573
581
class UnionTypeExtensionNode (TypeExtensionNode ):
574
582
__slots__ = ("types" ,)
575
583
576
- types : Optional [List [NamedTypeNode ]]
584
+ types : Optional [FrozenList [NamedTypeNode ]]
577
585
578
586
579
587
class EnumTypeExtensionNode (TypeExtensionNode ):
580
588
__slots__ = ("values" ,)
581
589
582
- values : Optional [List [EnumValueDefinitionNode ]]
590
+ values : Optional [FrozenList [EnumValueDefinitionNode ]]
583
591
584
592
585
593
class InputObjectTypeExtensionNode (TypeExtensionNode ):
586
594
__slots__ = ("fields" ,)
587
595
588
- fields : Optional [List [InputValueDefinitionNode ]]
596
+ fields : Optional [FrozenList [InputValueDefinitionNode ]]
0 commit comments