Skip to content

Commit 255842c

Browse files
author
Robert Mosolgo
authored
Merge pull request #1338 from tenderlove/immutable-nodes
Make language nodes immutable
2 parents f3dfdf6 + 296627c commit 255842c

File tree

2 files changed

+39
-47
lines changed

2 files changed

+39
-47
lines changed

lib/graphql/language/document_from_schema_definition.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,16 +124,19 @@ def build_scalar_type_node(scalar_type)
124124
end
125125

126126
def build_argument_node(argument)
127+
if argument.default_value?
128+
default_value = build_default_value(argument.default_value, argument.type)
129+
else
130+
default_value = nil
131+
end
132+
127133
argument_node = GraphQL::Language::Nodes::InputValueDefinition.new(
128134
name: argument.name,
129135
description: argument.description,
130136
type: build_type_name_node(argument.type),
137+
default_value: default_value,
131138
)
132139

133-
if argument.default_value?
134-
argument_node.default_value = build_default_value(argument.default_value, argument.type)
135-
end
136-
137140
argument_node
138141
end
139142

lib/graphql/language/nodes.rb

Lines changed: 32 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def scalars
1818
end
1919
end
2020

21-
attr_accessor :line, :col, :filename
21+
attr_reader :line, :col, :filename
2222

2323
# Initialize a node by extracting its position,
2424
# then calling the class's `initialize_node` method.
@@ -69,7 +69,7 @@ def to_query_string(printer: GraphQL::Language::Printer.new)
6969

7070
# Base class for non-null type names and list type names
7171
class WrapperType < AbstractNode
72-
attr_accessor :of_type
72+
attr_reader :of_type
7373

7474
def initialize_node(of_type: nil)
7575
@of_type = of_type
@@ -82,18 +82,17 @@ def scalars
8282

8383
# Base class for nodes whose only value is a name (no child nodes or other scalars)
8484
class NameOnlyNode < AbstractNode
85+
attr_reader :name
8586
include Scalars::Name
8687

87-
attr_accessor :name
88-
8988
def initialize_node(name: nil)
9089
@name = name
9190
end
9291
end
9392

9493
# A key-value pair for a field's inputs
9594
class Argument < AbstractNode
96-
attr_accessor :name, :value
95+
attr_reader :name, :value
9796

9897
# @!attribute name
9998
# @return [String] the key for this argument
@@ -116,9 +115,8 @@ def children
116115
end
117116

118117
class Directive < AbstractNode
118+
attr_reader :name, :arguments
119119
include Scalars::Name
120-
121-
attr_accessor :name, :arguments
122120
alias :children :arguments
123121

124122
def initialize_node(name: nil, arguments: [])
@@ -128,10 +126,9 @@ def initialize_node(name: nil, arguments: [])
128126
end
129127

130128
class DirectiveDefinition < AbstractNode
129+
attr_reader :name, :arguments, :locations, :description
131130
include Scalars::Name
132131

133-
attr_accessor :name, :arguments, :locations, :description
134-
135132
def initialize_node(name: nil, arguments: [], locations: [], description: nil)
136133
@name = name
137134
@arguments = arguments
@@ -165,7 +162,7 @@ class DirectiveLocation < NameOnlyNode; end
165162
# document.to_query_string(printer: VariableSrubber.new)
166163
#
167164
class Document < AbstractNode
168-
attr_accessor :definitions
165+
attr_reader :definitions
169166
alias :children :definitions
170167

171168
# @!attribute definitions
@@ -187,7 +184,7 @@ class NullValue < NameOnlyNode; end
187184

188185
# A single selection in a GraphQL query.
189186
class Field < AbstractNode
190-
attr_accessor :name, :alias, :arguments, :directives, :selections
187+
attr_reader :name, :alias, :arguments, :directives, :selections
191188

192189
# @!attribute selections
193190
# @return [Array<Nodes::Field>] Selections on this object (or empty array if this is a scalar field)
@@ -212,7 +209,7 @@ def children
212209

213210
# A reusable fragment, defined at document-level.
214211
class FragmentDefinition < AbstractNode
215-
attr_accessor :name, :type, :directives, :selections
212+
attr_reader :name, :type, :directives, :selections
216213

217214
# @!attribute name
218215
# @return [String] the identifier for this fragment, which may be applied with `...#{name}`
@@ -237,9 +234,8 @@ def scalars
237234

238235
# Application of a named fragment in a selection
239236
class FragmentSpread < AbstractNode
237+
attr_reader :name, :directives
240238
include Scalars::Name
241-
242-
attr_accessor :name, :directives
243239
alias :children :directives
244240

245241
# @!attribute name
@@ -253,7 +249,7 @@ def initialize_node(name: nil, directives: [])
253249

254250
# An unnamed fragment, defined directly in the query with `... { }`
255251
class InlineFragment < AbstractNode
256-
attr_accessor :type, :directives, :selections
252+
attr_reader :type, :directives, :selections
257253

258254
# @!attribute type
259255
# @return [String, nil] Name of the type this fragment applies to, or `nil` if this fragment applies to any type
@@ -275,7 +271,7 @@ def scalars
275271

276272
# A collection of key-value inputs which may be a field argument
277273
class InputObject < AbstractNode
278-
attr_accessor :arguments
274+
attr_reader :arguments
279275
alias :children :arguments
280276

281277
# @!attribute arguments
@@ -325,7 +321,7 @@ class NonNullType < WrapperType; end
325321
# May be anonymous or named.
326322
# May be explicitly typed (eg `mutation { ... }`) or implicitly a query (eg `{ ... }`).
327323
class OperationDefinition < AbstractNode
328-
attr_accessor :operation_type, :name, :variables, :directives, :selections
324+
attr_reader :operation_type, :name, :variables, :directives, :selections
329325

330326
# @!attribute variables
331327
# @return [Array<VariableDefinition>] Variable definitions for this operation
@@ -361,7 +357,7 @@ class TypeName < NameOnlyNode; end
361357

362358
# An operation-level query variable
363359
class VariableDefinition < AbstractNode
364-
attr_accessor :name, :type, :default_value
360+
attr_reader :name, :type, :default_value
365361

366362
# @!attribute default_value
367363
# @return [String, Integer, Float, Boolean, Array, NullValue] A Ruby value to use if no other value is provided
@@ -387,7 +383,7 @@ def scalars
387383
class VariableIdentifier < NameOnlyNode; end
388384

389385
class SchemaDefinition < AbstractNode
390-
attr_accessor :query, :mutation, :subscription, :directives
386+
attr_reader :query, :mutation, :subscription, :directives
391387

392388
def initialize_node(query: nil, mutation: nil, subscription: nil, directives: [])
393389
@query = query
@@ -404,7 +400,7 @@ def scalars
404400
end
405401

406402
class SchemaExtension < AbstractNode
407-
attr_accessor :query, :mutation, :subscription, :directives
403+
attr_reader :query, :mutation, :subscription, :directives
408404

409405
def initialize_node(query: nil, mutation: nil, subscription: nil, directives: [])
410406
@query = query
@@ -421,9 +417,8 @@ def scalars
421417
end
422418

423419
class ScalarTypeDefinition < AbstractNode
420+
attr_reader :name, :directives, :description
424421
include Scalars::Name
425-
426-
attr_accessor :name, :directives, :description
427422
alias :children :directives
428423

429424
def initialize_node(name:, directives: [], description: nil)
@@ -434,7 +429,7 @@ def initialize_node(name:, directives: [], description: nil)
434429
end
435430

436431
class ScalarTypeExtension < AbstractNode
437-
attr_accessor :name, :directives
432+
attr_reader :name, :directives
438433
alias :children :directives
439434

440435
def initialize_node(name:, directives: [])
@@ -444,10 +439,9 @@ def initialize_node(name:, directives: [])
444439
end
445440

446441
class ObjectTypeDefinition < AbstractNode
442+
attr_reader :name, :interfaces, :fields, :directives, :description
447443
include Scalars::Name
448444

449-
attr_accessor :name, :interfaces, :fields, :directives, :description
450-
451445
def initialize_node(name:, interfaces:, fields:, directives: [], description: nil)
452446
@name = name
453447
@interfaces = interfaces || []
@@ -462,7 +456,7 @@ def children
462456
end
463457

464458
class ObjectTypeExtension < AbstractNode
465-
attr_accessor :name, :interfaces, :fields, :directives
459+
attr_reader :name, :interfaces, :fields, :directives
466460

467461
def initialize_node(name:, interfaces:, fields:, directives: [])
468462
@name = name
@@ -477,7 +471,7 @@ def children
477471
end
478472

479473
class InputValueDefinition < AbstractNode
480-
attr_accessor :name, :type, :default_value, :directives,:description
474+
attr_reader :name, :type, :default_value, :directives,:description
481475
alias :children :directives
482476

483477
def initialize_node(name:, type:, default_value: nil, directives: [], description: nil)
@@ -494,7 +488,7 @@ def scalars
494488
end
495489

496490
class FieldDefinition < AbstractNode
497-
attr_accessor :name, :arguments, :type, :directives, :description
491+
attr_reader :name, :arguments, :type, :directives, :description
498492

499493
def initialize_node(name:, arguments:, type:, directives: [], description: nil)
500494
@name = name
@@ -514,10 +508,9 @@ def scalars
514508
end
515509

516510
class InterfaceTypeDefinition < AbstractNode
511+
attr_reader :name, :fields, :directives, :description
517512
include Scalars::Name
518513

519-
attr_accessor :name, :fields, :directives, :description
520-
521514
def initialize_node(name:, fields:, directives: [], description: nil)
522515
@name = name
523516
@fields = fields
@@ -531,7 +524,7 @@ def children
531524
end
532525

533526
class InterfaceTypeExtension < AbstractNode
534-
attr_accessor :name, :fields, :directives
527+
attr_reader :name, :fields, :directives
535528

536529
def initialize_node(name:, fields:, directives: [])
537530
@name = name
@@ -545,10 +538,9 @@ def children
545538
end
546539

547540
class UnionTypeDefinition < AbstractNode
541+
attr_reader :name, :types, :directives, :description
548542
include Scalars::Name
549-
550-
attr_accessor :name, :types, :directives, :description
551-
543+
552544
def initialize_node(name:, types:, directives: [], description: nil)
553545
@name = name
554546
@types = types
@@ -562,7 +554,7 @@ def children
562554
end
563555

564556
class UnionTypeExtension < AbstractNode
565-
attr_accessor :name, :types, :directives
557+
attr_reader :name, :types, :directives
566558

567559
def initialize_node(name:, types:, directives: [])
568560
@name = name
@@ -576,10 +568,9 @@ def children
576568
end
577569

578570
class EnumTypeDefinition < AbstractNode
571+
attr_reader :name, :values, :directives, :description
579572
include Scalars::Name
580573

581-
attr_accessor :name, :values, :directives, :description
582-
583574
def initialize_node(name:, values:, directives: [], description: nil)
584575
@name = name
585576
@values = values
@@ -593,7 +584,7 @@ def children
593584
end
594585

595586
class EnumTypeExtension < AbstractNode
596-
attr_accessor :name, :values, :directives
587+
attr_reader :name, :values, :directives
597588

598589
def initialize_node(name:, values:, directives: [])
599590
@name = name
@@ -607,9 +598,8 @@ def children
607598
end
608599

609600
class EnumValueDefinition < AbstractNode
601+
attr_reader :name, :directives, :description
610602
include Scalars::Name
611-
612-
attr_accessor :name, :directives, :description
613603
alias :children :directives
614604

615605
def initialize_node(name:, directives: [], description: nil)
@@ -620,10 +610,9 @@ def initialize_node(name:, directives: [], description: nil)
620610
end
621611

622612
class InputObjectTypeDefinition < AbstractNode
613+
attr_reader :name, :fields, :directives, :description
623614
include Scalars::Name
624615

625-
attr_accessor :name, :fields, :directives, :description
626-
627616
def initialize_node(name:, fields:, directives: [], description: nil)
628617
@name = name
629618
@fields = fields
@@ -637,7 +626,7 @@ def children
637626
end
638627

639628
class InputObjectTypeExtension < AbstractNode
640-
attr_accessor :name, :fields, :directives
629+
attr_reader :name, :fields, :directives
641630

642631
def initialize_node(name:, fields:, directives: [])
643632
@name = name

0 commit comments

Comments
 (0)