Skip to content

Commit 73e216f

Browse files
Expose and fix re-triggering in ClosePairFilter
1 parent 96acd70 commit 73e216f

2 files changed

Lines changed: 27 additions & 1 deletion

File tree

Sources/TextFormation/ClosePairFilter.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ public struct ClosePairFilter<Interface: TextSystemInterface> {
2828
// behavior better.
2929
self.processAfterTrigger = open != close
3030
}
31+
32+
private mutating func resetState() {
33+
recognizer.resetState()
34+
self.triggerPosition = nil
35+
}
3136
}
3237

3338
extension ClosePairFilter: Filter {
@@ -63,7 +68,7 @@ extension ClosePairFilter: Filter {
6368
interface.offset(from: mutation.range.lowerBound, to: pos) == 0,
6469
interface.offset(from: mutation.range.upperBound, to: pos) == 0
6570
else {
66-
recognizer.resetState()
71+
resetState()
6772
return nil
6873
}
6974

Tests/TextFormationTests/ClosePairFilterTests.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,27 @@ struct ClosePairFilterTests {
208208
#expect(system.string == "' ")
209209
}
210210

211+
@Test func matchingThenDeleteAndInsert() throws {
212+
let system = MockSystem(string: "")
213+
var filter = ClosePairFilter<MockSystem>(open: "'", close: "'")
214+
215+
let openOutput = try #require(try system.runFilter(&filter, 0..<0, "'"))
216+
#expect(openOutput == MutationOutput(selection: NSRange(1..<1), delta: 1))
217+
#expect(system.string == "'")
218+
219+
let insert1 = try #require(try system.runFilter(&filter, 1..<1, "a"))
220+
#expect(insert1 == MutationOutput(selection: NSRange(2..<2), delta: 2))
221+
#expect(system.string == "'a'")
222+
223+
let delete = try #require(try system.runFilter(&filter, 1..<2, ""))
224+
#expect(delete == MutationOutput(selection: NSRange(1..<1), delta: -1))
225+
#expect(system.string == "''")
226+
227+
let insert2 = try #require(try system.runFilter(&filter, 1..<1, "a"))
228+
#expect(insert2 == MutationOutput(selection: NSRange(2..<2), delta: 1))
229+
#expect(system.string == "'a'")
230+
}
231+
211232
@Test func matchingWithNewlineNoWhitespaceReturned() throws {
212233
let system = MockSystem(string: "")
213234
var filter = ClosePairFilter<MockSystem>(open: "abc", close: "def")

0 commit comments

Comments
 (0)