From 0d4731a6e3d77a74ecf9b35986d76294d15a9a47 Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 21 May 2026 16:39:59 -0700 Subject: [PATCH 1/2] Fix for theme changes on collapsed files --- packages/diffs/src/renderers/DiffHunksRenderer.ts | 7 +++---- packages/diffs/src/renderers/FileRenderer.ts | 11 ++++------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/diffs/src/renderers/DiffHunksRenderer.ts b/packages/diffs/src/renderers/DiffHunksRenderer.ts index 97397e05e..379ce85ea 100644 --- a/packages/diffs/src/renderers/DiffHunksRenderer.ts +++ b/packages/diffs/src/renderers/DiffHunksRenderer.ts @@ -472,7 +472,8 @@ export class DiffHunksRenderer { }; forceHighlight = false; } - const forcePlainText = isDiffMassive(diff, this.getTokenizeMaxLength()); + const forcePlainText = + isDiffPlainText(diff) || isDiffMassive(diff, this.getTokenizeMaxLength()); this.renderCache ??= { diff, highlighted: false, @@ -507,9 +508,7 @@ export class DiffHunksRenderer { this.renderCache.renderRange = renderRange; } if ( - // We should only attempt to kick off the worker highlighter if there - // are lines to render - renderRange.totalLines > 0 && + (diff.additionLines.length > 0 || diff.deletionLines.length > 0) && !forcePlainText && (!this.renderCache.highlighted || forceHighlight) ) { diff --git a/packages/diffs/src/renderers/FileRenderer.ts b/packages/diffs/src/renderers/FileRenderer.ts index cc9106d75..c372c7399 100644 --- a/packages/diffs/src/renderers/FileRenderer.ts +++ b/packages/diffs/src/renderers/FileRenderer.ts @@ -234,10 +234,9 @@ export class FileRenderer { forceHighlight = false; } const lines = this.getOrCreateLineCache(file); - const forcePlainText = isFileMassive( - lines.length, - this.getTokenizeMaxLength() - ); + const forcePlainText = + isFilePlainText(file) || + isFileMassive(lines.length, this.getTokenizeMaxLength()); this.renderCache ??= { file, highlighted: false, @@ -267,9 +266,7 @@ export class FileRenderer { } if ( - // We should only attempt to kick off the worker highlighter if there - // are lines to render - renderRange.totalLines > 0 && + file.contents.length > 0 && !forcePlainText && (!this.renderCache.highlighted || forceHighlight) ) { From 14a42a9c62b436c512158c00faba806a57d5686b Mon Sep 17 00:00:00 2001 From: Amadeus Demarzi Date: Thu, 21 May 2026 17:55:05 -0700 Subject: [PATCH 2/2] Harden/optimize rendering --- .../diffs/src/renderers/DiffHunksRenderer.ts | 52 ++++++++++++------- packages/diffs/src/renderers/FileRenderer.ts | 42 +++++++++------ 2 files changed, 61 insertions(+), 33 deletions(-) diff --git a/packages/diffs/src/renderers/DiffHunksRenderer.ts b/packages/diffs/src/renderers/DiffHunksRenderer.ts index 379ce85ea..a01e3c718 100644 --- a/packages/diffs/src/renderers/DiffHunksRenderer.ts +++ b/packages/diffs/src/renderers/DiffHunksRenderer.ts @@ -472,8 +472,6 @@ export class DiffHunksRenderer { }; forceHighlight = false; } - const forcePlainText = - isDiffPlainText(diff) || isDiffMassive(diff, this.getTokenizeMaxLength()); this.renderCache ??= { diff, highlighted: false, @@ -481,35 +479,53 @@ export class DiffHunksRenderer { result: undefined, renderRange: undefined, }; + const hasContent = + diff.additionLines.length > 0 || diff.deletionLines.length > 0; + const forcePlainText = + !hasContent || + isDiffPlainText(diff) || + isDiffMassive(diff, this.getTokenizeMaxLength()); + const newContent = !areDiffTargetsEqual(diff, this.renderCache.diff); + const newRenderRange = !areRenderRangesEqual( + this.renderCache.renderRange, + renderRange + ); if (this.workerManager?.isWorkingPool() === true) { if ( forcePlainText || this.renderCache.result == null || - (!this.renderCache.highlighted && - (!areDiffTargetsEqual(diff, this.renderCache.diff) || - !areRenderRangesEqual(this.renderCache.renderRange, renderRange))) + (!this.renderCache.highlighted && (newContent || newRenderRange)) ) { this.renderCache.diff = diff; this.renderCache.options = options; this.renderCache.highlighted = false; - this.renderCache.result = this.workerManager.getPlainDiffAST( - diff, - renderRange.startingLine, - renderRange.totalLines, - // If we aren't using a windowed render, then we need to render - // everything - isDefaultRenderRange(renderRange) - ? true - : expandUnchanged + if ( + this.renderCache.result == null || + newContent || + newRenderRange || + forceHighlight + ) { + this.renderCache.result = this.workerManager.getPlainDiffAST( + diff, + renderRange.startingLine, + renderRange.totalLines, + // If we aren't using a windowed render, then we need to render + // everything + isDefaultRenderRange(renderRange) ? true - : this.expandedHunks, - collapsedContextThreshold - ); + : expandUnchanged + ? true + : this.expandedHunks, + collapsedContextThreshold + ); + } this.renderCache.renderRange = renderRange; } + + // Should we kick off an async highlight process if ( - (diff.additionLines.length > 0 || diff.deletionLines.length > 0) && !forcePlainText && + hasContent && (!this.renderCache.highlighted || forceHighlight) ) { this.workerManager.highlightDiffAST(this, diff); diff --git a/packages/diffs/src/renderers/FileRenderer.ts b/packages/diffs/src/renderers/FileRenderer.ts index c372c7399..4107629b3 100644 --- a/packages/diffs/src/renderers/FileRenderer.ts +++ b/packages/diffs/src/renderers/FileRenderer.ts @@ -233,10 +233,6 @@ export class FileRenderer { }; forceHighlight = false; } - const lines = this.getOrCreateLineCache(file); - const forcePlainText = - isFilePlainText(file) || - isFileMassive(lines.length, this.getTokenizeMaxLength()); this.renderCache ??= { file, highlighted: false, @@ -244,30 +240,46 @@ export class FileRenderer { result: undefined, renderRange: undefined, }; + const lines = this.getOrCreateLineCache(file); + const hasContent = file.contents.length > 0; + const forcePlainText = + !hasContent || + isFilePlainText(file) || + isFileMassive(lines.length, this.getTokenizeMaxLength()); + const newContent = !areFilesEqual(file, this.renderCache.file); + const newRenderRange = !areRenderRangesEqual( + this.renderCache.renderRange, + renderRange + ); if (this.workerManager?.isWorkingPool() === true) { // Cache invalidation based on renderRange comparison if ( - this.renderCache.result == null || forcePlainText || - (!this.renderCache.highlighted && - (!areFilesEqual(file, this.renderCache.file) || - !areRenderRangesEqual(this.renderCache.renderRange, renderRange))) + this.renderCache.result == null || + (!this.renderCache.highlighted && (newContent || newRenderRange)) ) { this.renderCache.file = file; this.renderCache.options = options; this.renderCache.highlighted = false; - this.renderCache.result = this.workerManager.getPlainFileAST( - file, - renderRange.startingLine, - renderRange.totalLines, - lines - ); + if ( + this.renderCache.result == null || + newContent || + newRenderRange || + forceHighlight + ) { + this.renderCache.result = this.workerManager.getPlainFileAST( + file, + renderRange.startingLine, + renderRange.totalLines, + lines + ); + } this.renderCache.renderRange = renderRange; } if ( - file.contents.length > 0 && !forcePlainText && + hasContent && (!this.renderCache.highlighted || forceHighlight) ) { this.workerManager.highlightFileAST(this, file);