From 5da96c987ef10991cf7387bbc47bdacb45324c28 Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Mon, 7 Jul 2025 10:26:00 -0500 Subject: [PATCH 1/2] Fix Style Store Crash --- .../StyledRangeContainer.swift | 30 +++++++++++++++++++ .../SourceEditor/SourceEditor.swift | 3 +- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Sources/CodeEditSourceEditor/Highlighting/StyledRangeContainer/StyledRangeContainer.swift b/Sources/CodeEditSourceEditor/Highlighting/StyledRangeContainer/StyledRangeContainer.swift index 95c81cb7e..881d16f30 100644 --- a/Sources/CodeEditSourceEditor/Highlighting/StyledRangeContainer/StyledRangeContainer.swift +++ b/Sources/CodeEditSourceEditor/Highlighting/StyledRangeContainer/StyledRangeContainer.swift @@ -45,6 +45,31 @@ class StyledRangeContainer { } } + enum RunState { + case empty + case value(RangeStoreRun) + case exhausted + + var isExhausted: Bool { + if case .exhausted = self { return true } + return false + } + + var hasValue: Bool { + if case .value = self { return true } + return false + } + + var length: Int { + switch self { + case .empty, .exhausted: + return 0 + case .value(let run): + return run.length + } + } + } + var _storage: [ProviderID: RangeStore] = [:] weak var delegate: StyledRangeContainerDelegate? @@ -98,6 +123,11 @@ class StyledRangeContainer { var minValue = allRuns.compactMap { $0.last }.enumerated().min(by: { $0.1.length < $1.1.length }) while let value = minValue { + // Early return if all arrays are empty + guard allRuns.contains(where: { !$0.isEmpty }) else { + return runs.reversed() + } + // Get minimum length off the end of each array let minRunIdx = value.offset var minRun = value.element diff --git a/Sources/CodeEditSourceEditor/SourceEditor/SourceEditor.swift b/Sources/CodeEditSourceEditor/SourceEditor/SourceEditor.swift index 3b2496aa1..efd1fcd8d 100644 --- a/Sources/CodeEditSourceEditor/SourceEditor/SourceEditor.swift +++ b/Sources/CodeEditSourceEditor/SourceEditor/SourceEditor.swift @@ -149,7 +149,8 @@ public struct SourceEditor: NSViewControllerRepresentable { controller.setCursorPositions(cursorPositions) } - if let scrollPosition = state.scrollPosition, scrollPosition != state.scrollPosition { + let scrollView = controller.scrollView + if let scrollPosition = state.scrollPosition, scrollPosition != scrollView?.contentView.bounds.origin { controller.scrollView.scroll(controller.scrollView.contentView, to: scrollPosition) controller.scrollView.reflectScrolledClipView(controller.scrollView.contentView) controller.gutterView.needsDisplay = true From 8f56c7c34227228674b567e129956da464c03989 Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Mon, 7 Jul 2025 10:26:53 -0500 Subject: [PATCH 2/2] Guard --- .../StyledRangeContainer/StyledRangeContainer.swift | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Sources/CodeEditSourceEditor/Highlighting/StyledRangeContainer/StyledRangeContainer.swift b/Sources/CodeEditSourceEditor/Highlighting/StyledRangeContainer/StyledRangeContainer.swift index 881d16f30..f0677416b 100644 --- a/Sources/CodeEditSourceEditor/Highlighting/StyledRangeContainer/StyledRangeContainer.swift +++ b/Sources/CodeEditSourceEditor/Highlighting/StyledRangeContainer/StyledRangeContainer.swift @@ -123,11 +123,6 @@ class StyledRangeContainer { var minValue = allRuns.compactMap { $0.last }.enumerated().min(by: { $0.1.length < $1.1.length }) while let value = minValue { - // Early return if all arrays are empty - guard allRuns.contains(where: { !$0.isEmpty }) else { - return runs.reversed() - } - // Get minimum length off the end of each array let minRunIdx = value.offset var minRun = value.element @@ -148,7 +143,9 @@ class StyledRangeContainer { } } - allRuns[minRunIdx].removeLast() + if !allRuns[minRunIdx].isEmpty { + allRuns[minRunIdx].removeLast() + } runs.append(minRun) minValue = allRuns.compactMap { $0.last }.enumerated().min(by: { $0.1.length < $1.1.length })