Skip to content

Commit aa89ce2

Browse files
committed
Clean Up, Add Tests
1 parent 2a952fe commit aa89ce2

File tree

9 files changed

+87
-275
lines changed

9 files changed

+87
-275
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// NSString+TextStory.swift
3+
// CodeEditSourceEditor
4+
//
5+
// Created by Khan Winter on 6/3/25.
6+
//
7+
8+
import AppKit
9+
import TextStory
10+
11+
extension NSString: @retroactive TextStoring {
12+
public func substring(from range: NSRange) -> String? {
13+
self.substring(with: range)
14+
}
15+
16+
public func applyMutation(_ mutation: TextMutation) {
17+
self.replacingCharacters(in: mutation.range, with: mutation.string)
18+
}
19+
}

Sources/CodeEditSourceEditor/Gutter/LineFolding/FoldingRibbonView+Draw.swift

Lines changed: 0 additions & 205 deletions
This file was deleted.

Sources/CodeEditSourceEditor/LineFolding/FoldProviders/IndentationLineFoldProvider.swift

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,8 @@
66
//
77

88
import AppKit
9-
import TextStory
109
import CodeEditTextView
1110

12-
extension NSString: @retroactive TextStoring {
13-
public func substring(from range: NSRange) -> String? {
14-
self.substring(with: range)
15-
}
16-
17-
public func applyMutation(_ mutation: TextMutation) {
18-
self.replacingCharacters(in: mutation.range, with: mutation.string)
19-
}
20-
}
21-
2211
final class IndentationLineFoldProvider: LineFoldProvider {
2312
func indentLevelAtLine(substring: NSString) -> Int? {
2413
for idx in 0..<substring.length {

Sources/CodeEditSourceEditor/LineFolding/FoldProviders/LineFoldProvider.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ enum LineFoldProviderLineInfo {
3131
}
3232
}
3333

34+
@MainActor
3435
protocol LineFoldProvider: AnyObject {
3536
func foldLevelAtLine(
3637
lineNumber: Int,

Sources/CodeEditSourceEditor/LineFolding/Model/LineFoldCalculator.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import AppKit
99
import CodeEditTextView
10-
import Combine
1110

1211
/// A utility that calculates foldable line ranges in a text document based on indentation depth.
1312
///

Sources/CodeEditSourceEditor/LineFolding/Model/LineFoldingModel.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ import Combine
1818
/// - For each line in the document, put its indent level into a list.
1919
/// - Loop through the list, creating nested folds as indents go up and down.
2020
///
21-
class LineFoldingModel: NSObject, NSTextStorageDelegate {
21+
class LineFoldingModel: NSObject, NSTextStorageDelegate, ObservableObject {
2222
/// An ordered tree of fold ranges in a document. Can be traversed using ``FoldRange/parent``
2323
/// and ``FoldRange/subFolds``.
24-
var foldCache: LineFoldStorage = LineFoldStorage(documentLength: 0)
24+
@Published var foldCache: LineFoldStorage = LineFoldStorage(documentLength: 0)
2525
private var calculator: LineFoldCalculator
2626

2727
private var textChangedStream: AsyncStream<(NSRange, Int)>
@@ -30,7 +30,7 @@ class LineFoldingModel: NSObject, NSTextStorageDelegate {
3030

3131
weak var controller: TextViewController?
3232

33-
init(controller: TextViewController, foldView: FoldingRibbonView, foldProvider: LineFoldProvider?) {
33+
init(controller: TextViewController, foldView: NSView, foldProvider: LineFoldProvider?) {
3434
self.controller = controller
3535
(textChangedStream, textChangedStreamContinuation) = AsyncStream<(NSRange, Int)>.makeStream()
3636
self.calculator = LineFoldCalculator(

Sources/CodeEditSourceEditor/LineFolding/View/FoldingRibbonView.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import AppKit
1010
import CodeEditTextView
1111
import Combine
1212

13-
#warning("Replace before release")
14-
private let demoFoldProvider = IndentationLineFoldProvider()
15-
1613
/// Displays the code folding ribbon in the ``GutterView``.
1714
///
1815
/// This view draws its contents
1916
class FoldingRibbonView: NSView {
17+
18+
#warning("Replace before release")
19+
private static let demoFoldProvider = IndentationLineFoldProvider()
20+
2021
static let width: CGFloat = 7.0
2122

2223
var model: LineFoldingModel?
@@ -92,7 +93,7 @@ class FoldingRibbonView: NSView {
9293
self.model = LineFoldingModel(
9394
controller: controller,
9495
foldView: self,
95-
foldProvider: foldProvider ?? demoFoldProvider
96+
foldProvider: foldProvider ?? Self.demoFoldProvider
9697
)
9798
}
9899

Tests/CodeEditSourceEditorTests/LineFoldingTests/LineFoldStorageTests.swift

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct LineFoldStorageTests {
3030
LineFoldStorage.RawFold(depth: 1, range: 0..<5),
3131
LineFoldStorage.RawFold(depth: 2, range: 5..<10)
3232
]
33-
storage.updateFolds(from: raw) { [] }
33+
storage.updateFolds(from: raw, collapsedRanges: [])
3434

3535
let folds = storage.folds(in: 0..<20)
3636
#expect(folds.count == 2)
@@ -43,13 +43,11 @@ struct LineFoldStorageTests {
4343
var storage = LineFoldStorage(documentLength: 15)
4444
let raw = [LineFoldStorage.RawFold(depth: 1, range: 0..<5)]
4545
// First pass: no collapsed
46-
storage.updateFolds(from: raw) { [] }
46+
storage.updateFolds(from: raw, collapsedRanges: [])
4747
#expect(storage.folds(in: 0..<15).first?.isCollapsed == false)
4848

4949
// Second pass: provider marks depth=1, start=0 as collapsed
50-
storage.updateFolds(from: raw) {
51-
collapsedSet((1, 0))
52-
}
50+
storage.updateFolds(from: raw, collapsedRanges: collapsedSet((1, 0)))
5351
#expect(storage.folds(in: 0..<15).first?.isCollapsed == true)
5452
}
5553

@@ -58,11 +56,11 @@ struct LineFoldStorageTests {
5856
var storage = LineFoldStorage(documentLength: 30)
5957
let raw = [LineFoldStorage.RawFold(depth: 2, range: 10..<20)]
6058

61-
storage.updateFolds(from: raw) { [] }
59+
storage.updateFolds(from: raw, collapsedRanges: [])
6260
let initial = storage.fullFoldRegion(at: 10, depth: 2)!.id
6361

6462
// Perform update again with identical raw folds
65-
storage.updateFolds(from: raw) { [] }
63+
storage.updateFolds(from: raw, collapsedRanges: [])
6664
let subsequent = storage.fullFoldRegion(at: 10, depth: 2)!.id
6765

6866
#expect(initial == subsequent)

0 commit comments

Comments
 (0)