Ignore --pathmap in the IDE's F# project options - #20470
xperiandri wants to merge 4 commits into
Conversation
✅ Release notes checked
|
T-Gro
left a comment
There was a problem hiding this comment.
🤖🕵️ LGTM & approved, but CI is red.
aee3361 to
39cd09d
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
T-Gro
left a comment
There was a problem hiding this comment.
🤖🕵️ Please make the description more concise using this guidance. Keep the problem and why the change is needed prominent, using short sentences in simplified technical English. Retain necessary caveats.
|
🔍 Tooling Safety Check — Affects-Design-Time
|
…r tests Test helpers so far put every synthetic file into one Roslyn project. CreateMultiProjectSolution creates one project per synthetic project with project references, the way VS wires project-to-project references; CreateMultiTargetSolution creates one project per target instance sharing the project path and the document paths, the way VS loads a multi-targeted project. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A project built with DeterministicSourcePaths or an explicit PathMap hands the IDE a `--pathmap:` option. FCS applies the map when it pickles the ranges of the in-memory reference other projects check against, so every symbol imported from such a project names a mapped, relative file that no workspace document has, and Go To Definition ends in the generated signature instead of the source. The map is a property of the build output; the IDE now drops it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
39cd09d to
00e8c04
Compare
There was a problem hiding this comment.
Copilot review overview
🟢 Approval recommended
The only finding is a non-blocking nit concerning unused test scaffolding.
Review effort: Lite
Findings: None
What changed in this PR
This PR removes build-only --pathmap options from IDE F# project settings to preserve cross-project source navigation.
Changes:
- Filters
--pathmap:from IDE compilation options. - Adds multi-project navigation regression tests and helpers.
- Updates Visual Studio release notes.
| File | Summary |
|---|---|
vsintegration/tests/FSharp.Editor.Tests/PathMapNavigationTests.fs |
Adds path-map navigation regression tests. |
vsintegration/tests/FSharp.Editor.Tests/Helpers/RoslynHelpers.fs |
Adds multi-project test helpers. |
vsintegration/tests/FSharp.Editor.Tests/FSharp.Editor.Tests.fsproj |
Includes the new tests. |
vsintegration/src/FSharp.Editor/LanguageService/FSharpProjectOptionsManager.fs |
Removes --pathmap: from IDE options. |
docs/release-notes/.VisualStudio/18.vNext.md |
Documents the fix. |
💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.
In a solution whose
Directory.Build.propssets<PathMap>$(MSBuildThisFileDirectory)=.\</PathMap>orDeterministicSourcePaths, Go To Definition from an F# file into another F# project of the solution opens the generated signature instead of the source. The declaration comes back named.\backend\Use cases\Circulars\GraphQL\.\backend\Use cases\Circulars\GraphQL\Types\Circular.fs: the project system passes the build's--pathmap:into the IDE's compilation options, FCS applies it when it pickles the ranges of the in-memory referenced-assembly data, and the implicit include directory it is joined with is mapped too. No lookup by path can find such a file.The map also leaks between projects.
TcGlobalscarries it, and FCS cachesTcGlobalswith the framework imports under a key that does not include it, so one project with a--pathmap:is enough to break navigation into any sibling of the same framework set, and a project with a map is checked without it when a sibling filled the cache first. #20476 fixes the cache; dropping the option in the IDE makes the cached map empty for all of them.FSharpProjectOptionsManagernow drops--pathmap:from the options it takes from the project site, next to the-r:options it already discards. The map only describes what the build should write into its output; nothing in the IDE needs it.🤖 Generated with Claude Code