Skip to content

Improve background progress reporting - #1545

Open
TheAngryByrd wants to merge 6 commits into
ionide:mainfrom
TheAngryByrd:better-progress-reporting
Open

Improve background progress reporting#1545
TheAngryByrd wants to merge 6 commits into
ionide:mainfrom
TheAngryByrd:better-progress-reporting

Conversation

@TheAngryByrd

Copy link
Copy Markdown
Member

Summary

  • consolidate concurrent typecheck and analyzer work into shared LSP progress notifications
  • report batch progress for project loading and dependent-file typechecking
  • propagate progress cancellation and limit dependent-file typechecking concurrency
  • honor FSharp.notifications.backgroundServiceProgress for all shared progress reporters

Testing

  • dotnet fantomas --check build.fsx src
  • dotnet build test/FsAutoComplete.Tests.Lsp/FsAutoComplete.Tests.Lsp.fsproj -c Release -f net10.0 -p:ImportDirectoryPackagesProps=false --nologo
  • dotnet run -c Release -f net10.0 --no-build --project test/FsAutoComplete.Tests.Lsp/FsAutoComplete.Tests.Lsp.fsproj -- --filter-test-list "SharedTypecheckProgressReporter" — 17 passed

The full solution build reached the changed projects, but nested TestExplorer sample builds imported a parent Directory.Packages.props and failed with NU1008. The focused LSP build completed with zero warnings and errors.

@TheAngryByrd
TheAngryByrd marked this pull request as ready for review August 31, 2026 04:04
@TheAngryByrd
TheAngryByrd requested a balanced review from Copilot August 31, 2026 04:04

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Cancellation propagation, configuration handling, duplicate-operation tracking, and one test assertion are currently incorrect.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Introduces shared LSP progress reporting for typechecking, analyzers, project loading, and dependent-file checks.

Changes:

  • Adds shared, cancellable batch progress infrastructure.
  • Integrates reporters into server workflows.
  • Adds concurrency helpers and reporter tests.
File summaries
File Description
FSharpLspClient.fs Implements shared progress reporting.
FSharpLspClient.fsi Exposes the reporter API.
AdaptiveServerState.fs Integrates shared progress and cancellation.
Utils.fs Adds percentage-based parallelism helpers.
Utils.fsi Declares new parallelism helpers.
SharedTypecheckProgressReporterTests.fs Tests reporter behavior.
Program.fs Registers the new tests.
Review details
  • Files reviewed: 7/7 changed files
  • Comments generated: 8
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +236 to +237
let simpleName = IO.Path.GetFileName fileName
activeFiles <- Set.add simpleName activeFiles
Comment on lines +208 to +209
let projectLoadingProgressReporter =
new SharedTypecheckProgressReporter("Loading Projects", fun () -> progressLookup.CreateProgressReport(lspClient))
opts,
shouldCache = shouldCache
)
|> Async.withCancellation progressCt
fileToken,
progressReporter.CancellationToken
)
CancellationTokenSource.CreateLinkedTokenSource(rootToken, fileToken, progressCt)

if config.Notifications.BackgroundServiceProgress then
do! progress.Begin($"Checking for unnecessary parentheses {fileName}...", message = filePathUntag)
use! _progress = analyzerProgressReporter.Begin($"Unnecessary parens - {fileName}")
Comment on lines +361 to +377
// Second batch — counters should have been reset
let! batchDisp2 =
reporter.BeginBatch ([| "C:/src/C.fs"; "C:/src/D.fs" |]) CancellationToken.None
|> Async.AwaitTask

do! settle ()

// The Begin for second batch should show 0% (0/2)
let callsArr = calls.ToArray()

let hasZeroPercentage =
callsArr
|> Array.exists (fun c ->
match c with
| Begin(_, _, Some 0u) -> true
| Report(_, Some 0u) -> true
| _ -> false)
Expect.isTrue (ct = CancellationToken.None) "CancellationToken should be None after all files end"
}

testCaseAsync "Multiple sequential files reuse the same report cycle"
Comment on lines +293 to +295
let normalizedFiles = files |> Array.map normalizePath |> Array.distinct
batchTotal <- batchTotal + normalizedFiles.Length
batchFiles <- Set.union batchFiles (normalizedFiles |> Set.ofArray)
@TheAngryByrd
TheAngryByrd force-pushed the better-progress-reporting branch from 69e74d3 to d7e1661 Compare August 31, 2026 11:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants