diff --git a/packages/diffs/src/renderers/DiffHunksRenderer.ts b/packages/diffs/src/renderers/DiffHunksRenderer.ts index 97397e05e..a01e3c718 100644 --- a/packages/diffs/src/renderers/DiffHunksRenderer.ts +++ b/packages/diffs/src/renderers/DiffHunksRenderer.ts @@ -472,7 +472,6 @@ export class DiffHunksRenderer { }; forceHighlight = false; } - const forcePlainText = isDiffMassive(diff, this.getTokenizeMaxLength()); this.renderCache ??= { diff, highlighted: false, @@ -480,37 +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 ( - // We should only attempt to kick off the worker highlighter if there - // are lines to render - renderRange.totalLines > 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 cc9106d75..4107629b3 100644 --- a/packages/diffs/src/renderers/FileRenderer.ts +++ b/packages/diffs/src/renderers/FileRenderer.ts @@ -233,11 +233,6 @@ export class FileRenderer { }; forceHighlight = false; } - const lines = this.getOrCreateLineCache(file); - const forcePlainText = isFileMassive( - lines.length, - this.getTokenizeMaxLength() - ); this.renderCache ??= { file, highlighted: false, @@ -245,32 +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 ( - // We should only attempt to kick off the worker highlighter if there - // are lines to render - renderRange.totalLines > 0 && !forcePlainText && + hasContent && (!this.renderCache.highlighted || forceHighlight) ) { this.workerManager.highlightFileAST(this, file);