Skip to content

Commit a3136ac

Browse files
fix: node nullability safety
1 parent a15c129 commit a3136ac

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

Sources/GraphQL/Language/Visitor.swift

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func visit(root: Node, visitor: Visitor, keyMap: [Kind: [String]] = [:]) -> Node
8787
var inArray = false
8888
var keys: [IndexPathElement] = ["root"]
8989
var index: Int = -1
90-
var edits: [(key: IndexPathElement, node: Node)] = []
90+
var edits: [(key: IndexPathElement, node: Node?)] = []
9191
var node: NodeResult? = .node(root)
9292
var key: IndexPathElement?
9393
var parent: NodeResult?
@@ -111,10 +111,15 @@ func visit(root: Node, visitor: Visitor, keyMap: [Kind: [String]] = [:]) -> Node
111111
let editKey = editKey.indexValue!
112112
let arrayKey = editKey - editOffset
113113

114-
if case .array(var n) = node {
115-
n.remove(at: arrayKey)
116-
node = .array(n)
117-
editOffset += 1
114+
if case var .array(n) = node {
115+
if let editValue = editValue {
116+
n[arrayKey] = editValue
117+
node = .array(n)
118+
} else {
119+
n.remove(at: arrayKey)
120+
node = .array(n)
121+
editOffset += 1
122+
}
118123
}
119124
}
120125
} else {
@@ -179,7 +184,7 @@ func visit(root: Node, visitor: Visitor, keyMap: [Kind: [String]] = [:]) -> Node
179184
continue
180185
}
181186
} else if case let .node(resultNode) = result {
182-
edits.append((key!, resultNode!))
187+
edits.append((key!, resultNode))
183188
if !isLeaving {
184189
if let resultNode = resultNode {
185190
node = .node(resultNode)
@@ -216,8 +221,8 @@ func visit(root: Node, visitor: Visitor, keyMap: [Kind: [String]] = [:]) -> Node
216221
} while
217222
stack != nil
218223

219-
if !edits.isEmpty {
220-
return edits[edits.count - 1].node
224+
if !edits.isEmpty, let nextEditNode = edits[edits.count - 1].node {
225+
return nextEditNode
221226
}
222227

223228
return root
@@ -226,14 +231,14 @@ func visit(root: Node, visitor: Visitor, keyMap: [Kind: [String]] = [:]) -> Node
226231
final class Stack {
227232
let index: Int
228233
let keys: [IndexPathElement]
229-
let edits: [(key: IndexPathElement, node: Node)]
234+
let edits: [(key: IndexPathElement, node: Node?)]
230235
let inArray: Bool
231236
let prev: Stack?
232237

233238
init(
234239
index: Int,
235240
keys: [IndexPathElement],
236-
edits: [(key: IndexPathElement, node: Node)],
241+
edits: [(key: IndexPathElement, node: Node?)],
237242
inArray: Bool,
238243
prev: Stack?
239244
) {

0 commit comments

Comments
 (0)