On Windows `FileSystem.GetFullPathShim` causes Test Failures and no code errors displayed in Ionide
Quite a lot of FsAutoComplete Tests currently fail on Windows because it doesn't receive any typecheck errors/diagnostics (In logs: search for "Should have had errors" or "Expected errors" or "Expected to fail"). On Linux (inclusive WSL (2)) these errors are received.
Further: In Ionide, a F# file open at Editor start doesn't receive any Errors/Diagnostics. See https://github.com/ionide/ionide-vscode-fsharp/issues/1500#issuecomment-841820866 (the original issue https://github.com/ionide/ionide-vscode-fsharp/issues/1500 seems to be slightly different).
I traced the issue down to FileSystem.GetFullPathShim. Replacing its implementation with actualFs.GetFullPathShim f (-> calling the source F# IFileSystem implementation), results in tests running successfully and showing errors for files opened at startup.
What's happening?:
In FsAutoComplete the input path is converted to an Uri and then to a local path: https://github.com/fsharp/FsAutoComplete/blob/97227bc56143ab09b7e96a35166063645f0f5c56/src/FsAutoComplete.Core/FileSystem.fs#L89-L94
- f =
C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\5.0.0\ref\net5.0\System.Diagnostics.Tracing.dll - FilePathToUri =
file:///C%3A/Program%20Files/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/ref/net5.0/System.Diagnostics.Tracing.dll - FileUriToLocalPath/expanded =
C:/Program Files/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/ref/net5.0/System.Diagnostics.Tracing.dll
The original F# FileSystem.GetFullPathShim is just Path.GetFullPath fileName:
-
actualFs.GetFullPathShim f=C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\5.0.0\ref\net5.0\System.Diagnostics.Tracing.dll
Difference: / vs \ path separator. These are both valid on Windows.
BUT: Changing the return path to use \ instead of / resolve the issues mentioned above.
So issue is: FileSystem doesn't like Windows path Separators...
Code with changed slashes on windows for testing:
- https://github.com/Booksbaum/FsAutoComplete/tree/windows-error
- Tests: https://github.com/Booksbaum/FsAutoComplete/runs/2858468720
(Windows has still some errors, but all "Should have had errors" failures are gone)
I'm not actually sure it's a bug here (in FsAutoComplete), or a bug in F# Compiler Service. Seems like a normalization issue and the return path is to be expected in a certain format.
But in that case, shouldn't Diagnostics in VsCode&Ionide always fail instead of just for files visible at startup if it cannot handle /?...
So: no idea why it's happening, but it's definitely because of FileSystem.GetFullPathShim...
Yep, you've hit on one of the most frustrating aspects of LSP overall: paths come in as file URIs (which require quite a lot of massaging because .Net is horrible at dealing with OS-agnostic file paths), and we have to be pretty rigorous in how we scrub them, since we can get paths from any OS while running on a completely different OS (which Visual Studio doesn't have to deal with and so they don't see how bad the underlying APIs are).
This is why we've wrapped IFileSystem in FSAC. We've shimmed out the 'core' APIs that all of the rest of the IFileSystem calls seem to use with implementations that should be OS agnostic, but as you're showing that's not quite the case.
We used to do OS probing like I see you doing on your branch, but that (IIRC) starts failing when the following scenarios are taken into account:
- running fsac on folders stored in WSL on windows
- when consuming libraries built on Windows while on linux
- and I'm sure others that I'm forgetting.
So any change here I'd want to test in quite a few circumstances (of course more windows tests becoming green without impacting other OS's is a good sign).
I do think you're on to something, but I think your implementation causes issues with other functionality. If we compare the results of the goto tests on windows on your branch to another PR (look for lsp.Ionide WorkspaceLoader.Go to definition tests) many of those tests now fail with this change. That does echo your comments about some kind of normalization mixup between FSAC and FCS, though.
More explorations:
Quite a lot of the (remaining) issues are with Goto lookups. When there's no direct source available, FsAutoComplete goes through a couple of hoops to find or decompile some source (like https://github.com/fsharp/FsAutoComplete/blob/master/src/FsAutoComplete.Core/ParseAndCheckResults.fs#L61 or https://github.com/fsharp/FsAutoComplete/blob/master/src/FsAutoComplete.Core/ParseAndCheckResults.fs#L143). It looks like some of these functions require paths in a certain normalized way or they fail.
Some examples tests:
-
lsp.Ionide WorkspaceLoader.Go to definition tests.GoTo Tests.Go-to-type-definition on property(inGoToTests.fs): Try to go to type defstring option. That's inprim-types.fsi. Path requires to contain forward slashes. What's interesting is: The path isE:\A\_work\130\s\src\fsharp\FSharp.Core\prim-types.fsi-> NOT on my local pc, but debug data from source. I guess when splitting the path to retrieve the source from SourceLink.
SourceLink handling does some normalization, but I don't think for every path. Especially the input is expected to be already normalized (https://github.com/fsharp/FsAutoComplete/blob/1e1f5e5338ecc69fb8103238d8fb44901d608dad/src/FsAutoComplete.Core/Sourcelink.fs#L169). BUT: when calling the function the path isn't normalized, but instead directly taken from the F# Checker (-> assumes path to be normalized, there are even a couple of comments (in other contexts) hinting at this like https://github.com/fsharp/FsAutoComplete/blob/1e1f5e5338ecc69fb8103238d8fb44901d608dad/src/FsAutoComplete.Core/Commands.fs#L172) -> SourceLink (maybe decompiler) requires normalized paths with forward slashes -
lsp.Ionide WorkspaceLoader.Go to definition tests.GoTo Tests.Go-to-implementation on sourcelink file with sourcelink in PDB(inGoToTests.fs): Basically same as above, but to dig a bit deeper into path resolution.*.pdbfiles AREN'T handled viaIFileSystem. BUT: to match a pdb file with a source file, pdb path and source file path must match -- and source file path is processed fiaIFileSystem->pdbpath isn't normalized.Here is how it looks in invalid case:
No sourcelinked source file matched "C:\projects/giraffe\src/Giraffe\GiraffeViewEngine.fs". Available documents were (normalized paths here): ["C:/projects/giraffe/src/Giraffe/Middleware.fs", "C:/projects/giraffe/src/Giraffe/HttpStatusCodeHandlers.fs", "C:/projects/giraffe/src/Giraffe/Negotiation.fs", "C:/projects/giraffe/src/Giraffe/Streaming.fs", "C:/projects/giraffe/src/Giraffe/Preconditional.fs", "C:/projects/giraffe/src/Giraffe/ResponseWriters.fs", "C:/projects/giraffe/src/Giraffe/Routing.fs", "C:/projects/giraffe/src/Giraffe/Auth.fs", "C:/projects/giraffe/src/Giraffe/ModelValidation.fs", "C:/projects/giraffe/src/Giraffe/ModelBinding.fs", "C:/projects/giraffe/src/Giraffe/GiraffeViewEngine.fs", "C:/projects/giraffe/src/Giraffe/ResponseCaching.fs", "C:/projects/giraffe/src/Giraffe/Core.fs", "C:/projects/giraffe/src/Giraffe/FormatExpressions.fs", "C:/projects/giraffe/src/Giraffe/Serialization.fs", "C:/projects/giraffe/src/Giraffe/ComputationExpressions.fs", "C:/projects/giraffe/src/Giraffe/Common.fs"]Note: source file is handled via
IFileSystem(-> alternating slash directions -- I did this to provoke normalization errors), while the other paths aren't normalized withIFileSystem, but instead differently (-> all forward slashes) -
lsp.Ionide WorkspaceLoader.windows error.script test(inProgram.fs, not in master, but in my branch to search for errors):*.fsxpath MUST be all backslash to get diagnostics. The same is NOT true for*.fsfile as part of a project. That can have whatever path separator (For testing I'm actually alternating between separators in the same path to provoke errors). No idea whyfsxdifferent fromfsfiles.
Following restrictions above there are still some errors on windows:
-
lsp.Ionide WorkspaceLoader.Rename Tests.Rename from definition within script file&lsp.Ionide WorkspaceLoader.Rename Tests.Rename from usage within script file:
-> again different normalization. But both path are valid and it's checking what is returned to LSP client -> probably okexpected: file:///E%3A/prog/fsharp/editor/ionide/FsAutoComplete/test/FsAutoComplete.Tests.Lsp/TestCases/RenameTest/Script.fsx actual: file:///e%3A/prog/fsharp/editor/ionide/FsAutoComplete/test/FsAutoComplete.Tests.Lsp/TestCases/RenameTest/Script.fsx -
lsp.Ionide WorkspaceLoader.Rename Tests.Rename from usage within project file,lsp.Ionide WorkspaceLoader.Go to definition tests.GoTo Tests.Go-to-implementation-on-interface-definition,lsp.Ionide WorkspaceLoader.Rename Tests.Rename from definition across project files:
No idea whyRequest failed: { Code = -32603 Message = "Cached typecheck results not yet available" Data = None }
Both don't seem to be caused by IFileSystem.GetFullPathShim
Last but not least: Network paths: On windows these are \\MyNas\folder\somefile.fs. Forward slashes are sometimes ok, sometimes not: I can move to //Mynas/folder in powershell, but not in explorer (which opens the browser...) or cmd (CMD does not support UNC paths as current directories.) (Last one is an issue with VS Code: code \\MyNas\folder: code is a batch script -> cmd -> doesn't support UNC path. Opening network folder via Open Folder in VS Code works just fine).
I just tested windows error tests (in Program.fs) -- with quite strange results:
- Script works just fine -- interestingly it doesn't matter if forward or backward slashes...(normal windows path: for fsx file: must be backward slash...)
- File in Project doesn't work -- neither with all backward nor all forward slashes. Stuck at
waitForParseResultsForFile. No idea why. (BUT: Ionide running in VS Code in a Network drive works (at least in a short test) -- so no idea why test doesn't work...)
(I switched a lot of projects, folders and logging. It's possible some results are caused by outdated compilation results or just compiling/running in the wrong path. (I'm writing this because I just caught myself editing code in FsAutoComplete in one location, but compiling FsAutoComplete in another...))
running fsac on folders stored in WSL on windows
Accessing WSL (at least WSL 2) is done via network path: \\wsl$\Ubuntu-20.04\home
hm...a 'bit' unstructured` -- So summary:
-
fsxfiles: require backward slashes (but somehow work in Ionide sometimes?) - GoTo (type) definition: SourceLink required forward slashes
- Network Path (incl. WSL 2): tests work with neither backward nor forward slashes....(but somehow work in current Ionide?...)
Another thing which I don't know has anything to with this issue -- but it prevents test runs:
The stuff above I tested with dotnet test (in folder test\FsAutoComplete.Tests.Lsp).
But when using dotnet run I get different results: Tests get stuck (most likely while waiting for waitForWorkspaceFinishedParsing). The log shows: loading projects did fail. With dotnet test the same projects load.
Some examples of failing tests are (I only tested some):
-
lsp.Ionide WorkspaceLoader.windows error.project test- Note:
lsp.Ionide WorkspaceLoader.windows error.project testsucceeds. It's basically the same test -- just with a Script file instead of Project and F# file
- Note:
-
Rename Tests.Rename from usage within project file -
GoTo Tests.Go-to-definition on external symbol (System.Net.HttpWebRequest)
All of these test Projects, NOT single Script files.
Project Loading error is:
Using "ResolvePackageDependencies" task from assembly "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\..\\tools\\net5.0/Microsoft.NET.Build.Tasks.dll".
Task "ResolvePackageDependencies"
Error reading assets file: Error loading lock file 'E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\obj\\project.assets.json' : The type initializer for 'NuGet.ProjectModel.JsonUtility' threw an exception.
Build continuing because "ContinueOnError" on the task "ResolvePackageDependencies" is set to "ErrorAndContinue".
Done executing task "ResolvePackageDependencies" -- FAILED.
Done building target "RunResolvePackageDependencies" in project "Project.fsproj" -- FAILED.
...
Task "ResolvePackageAssets"
Error reading assets file: Error loading lock file 'E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\obj\\project.assets.json' : The type initializer for 'NuGet.ProjectModel.JsonUtility' threw an exception.
Done executing task "ResolvePackageAssets" -- FAILED
full `Workspace Notofy` output
[19:50:32 INF] [Commands] Workspace loading started '["E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj"]'
[19:50:32 INF] [Commands] Workspace loading finished
[19:50:33 INF] [LSP] Workspace Notify {"finished": false, "$type": "WorkspaceLoad"}
[19:50:33 INF] [LSP] Workspace Notify {"projectFileName": "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj", "$type": "ProjectLoading"}
[19:50:33 INF] [LSP] Workspace Notify {"projectFileName": "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj", "errorDetails": {"projFile": "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj", "Item2": "Build started.
Project "Project.fsproj" (ResolvePackageDependenciesDesignTime;_GenerateCompileDependencyCache;CoreCompile target(s)):
Building with tools version "Current".
Target "_CheckForUnsupportedTargetFramework" skipped, due to false condition; ('$(_UnsupportedTargetFrameworkError)' == 'true') was evaluated as ('' == 'true').
Target "_CollectTargetFrameworkForTelemetry" in file "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.NET.TargetFrameworkInference.targets" from project "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj" (target "RunResolvePackageDependencies" depends on it):
Using "AllowEmptyTelemetry" task from assembly "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\..\\tools\\net5.0/Microsoft.NET.Build.Tasks.dll".
Task "AllowEmptyTelemetry"
Done executing task "AllowEmptyTelemetry".
Done building target "_CollectTargetFrameworkForTelemetry" in project "Project.fsproj".
Target "_CheckForUnsupportedTargetPlatformIdentifier" skipped, due to false condition; ('$(TargetPlatformIdentifier)' != '' and '$(TargetFrameworkIdentifier)' == '.NETCoreApp' and $([MSBuild]::VersionGreaterThanOrEquals($(TargetFrameworkVersion), 5.0))) was evaluated as ('Windows' != '' and '.NETStandard' == '.NETCoreApp' and False).
Target "RunResolvePackageDependencies" in file "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.PackageDependencyResolution.targets" from project "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj" (target "ResolvePackageDependenciesDesignTime" depends on it):
Task "CheckForTargetInAssetsFile" skipped, due to false condition; ( '$(DesignTimeBuild)' != 'true') was evaluated as ( 'true' != 'true').
Using "ResolvePackageDependencies" task from assembly "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\..\\tools\\net5.0/Microsoft.NET.Build.Tasks.dll".
Task "ResolvePackageDependencies"
Error reading assets file: Error loading lock file 'E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\obj\\project.assets.json' : The type initializer for 'NuGet.ProjectModel.JsonUtility' threw an exception.
Build continuing because "ContinueOnError" on the task "ResolvePackageDependencies" is set to "ErrorAndContinue".
Done executing task "ResolvePackageDependencies" -- FAILED.
Done building target "RunResolvePackageDependencies" in project "Project.fsproj" -- FAILED.
Target "AssignProjectConfiguration" skipped, due to false condition; ('$(CurrentSolutionConfigurationContents)' != '' or '@(ProjectReference)'!='') was evaluated as ('' != '' or ''!='').
Target "ProcessFrameworkReferences" skipped, due to false condition; ('@(FrameworkReference)' != '') was evaluated as ('' != '').
Target "_NormalizeTargetPlatformVersion" skipped, due to false condition; ('$(TargetPlatformVersion)' != '' and '$(TargetFrameworkIdentifier)' == '.NETCoreApp' and $([MSBuild]::VersionGreaterThanOrEquals($(TargetFrameworkVersion), 5.0)) and ('$(Language)' != 'C++' or '$(_EnablePackageReferencesInVCProjects)' == 'true')) was evaluated as ('7.0' != '' and '.NETStandard' == '.NETCoreApp' and False and ('F#' != 'C++' or '' == 'true')).
Target "_CheckForLanguageAndFeatureCombinationSupport" in file "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.NET.RuntimeIdentifierInference.targets" from project "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj" (target "ProcessFrameworkReferences" depends on it):
Task "NETSdkError" skipped, due to false condition; (('$(Language)' == 'C++' and '$(_EnablePackageReferencesInVCProjects)' != 'true') and $(OutputType) != 'library' and '$(TargetFrameworkIdentifier)' == '.NETCoreApp') was evaluated as (('F#' == 'C++' and '' != 'true') and Library != 'library' and '.NETStandard' == '.NETCoreApp').
Task "NETSdkError" skipped, due to false condition; (('$(Language)' == 'C++' and '$(_EnablePackageReferencesInVCProjects)' != 'true') and $(EnableComHosting) == 'true') was evaluated as (('F#' == 'C++' and '' != 'true') and == 'true').
Task "NETSdkError" skipped, due to false condition; (('$(Language)' == 'C++' and '$(_EnablePackageReferencesInVCProjects)' != 'true') and $(SelfContained) == 'true') was evaluated as (('F#' == 'C++' and '' != 'true') and == 'true').
Done building target "_CheckForLanguageAndFeatureCombinationSupport" in project "Project.fsproj".
Target "UpdateAspNetToFrameworkReference" skipped, due to false condition; ('$(TargetFrameworkIdentifier)' == '.NETCoreApp' And '$(_TargetFrameworkVersionWithoutV)' >= '3.0') was evaluated as ('.NETStandard' == '.NETCoreApp' And '2.0' >= '3.0').
Target "IncludeTargetingPackReference" skipped, due to false condition; ('$(TargetFrameworkMoniker)' != '' and '$(TargetFrameworkIdentifier)' == '.NETFramework' and '$(AutomaticallyUseReferenceAssemblyPackages)' == 'true') was evaluated as ('.NETStandard,Version=v2.0' != '' and '.NETStandard' == '.NETFramework' and 'true' == 'true').
Target "CheckForImplicitPackageReferenceOverrides" in file "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.NET.Sdk.DefaultItems.Shared.targets" from project "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj" (target "ApplyImplicitVersions" depends on it):
Using "CheckForImplicitPackageReferenceOverrides" task from assembly "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\..\\tools\\net5.0/Microsoft.NET.Build.Tasks.dll".
Task "CheckForImplicitPackageReferenceOverrides"
Done executing task "CheckForImplicitPackageReferenceOverrides".
Done building target "CheckForImplicitPackageReferenceOverrides" in project "Project.fsproj".
Target "ApplyImplicitVersions" in file "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.NET.Sdk.DefaultItems.Shared.targets" from project "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj" (target "ProcessFrameworkReferences" depends on it):
Using "ApplyImplicitVersions" task from assembly "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\..\\tools\\net5.0/Microsoft.NET.Build.Tasks.dll".
Task "ApplyImplicitVersions"
Done executing task "ApplyImplicitVersions".
Done building target "ApplyImplicitVersions" in project "Project.fsproj".
Target "_DefaultMicrosoftNETPlatformLibrary" in file "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.NET.Sdk.Shared.targets" from project "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj" (target "ResolvePackageAssets" depends on it):
Done building target "_DefaultMicrosoftNETPlatformLibrary" in project "Project.fsproj".
Target "_ComputePackageReferencePublish" in file "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.NET.Sdk.Shared.targets" from project "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj" (target "ResolvePackageAssets" depends on it):
Done building target "_ComputePackageReferencePublish" in project "Project.fsproj".
Target "ResolvePackageAssets" in file "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\Microsoft.PackageDependencyResolution.targets" from project "E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\Project.fsproj" (target "ResolveLockFileReferences" depends on it):
Using "ResolvePackageAssets" task from assembly "C:\\Program Files\\dotnet\\sdk\\5.0.301\\Sdks\\Microsoft.NET.Sdk\\targets\\..\\tools\\net5.0/Microsoft.NET.Build.Tasks.dll".
Task "ResolvePackageAssets"
Error reading assets file: Error loading lock file 'E:\\prog\\fsharp\\editor\\ionide\\FsAutoComplete\\test\\FsAutoComplete.Tests.Lsp\\TestCases\\WindowsError\\Project\\obj\\project.assets.json' : The type initializer for 'NuGet.ProjectModel.JsonUtility' threw an exception.
Done executing task "ResolvePackageAssets" -- FAILED.
Done building target "ResolvePackageAssets" in project "Project.fsproj" -- FAILED.
Done building project "Project.fsproj" -- FAILED.
Build FAILED.
", "$type": "GenericError"}, "$type": "ProjectError"}
[19:50:33 INF] [LSP] Workspace Notify {"finished": true, "$type": "WorkspaceLoad"}
[19:50:33 INF] [LSP] TextDocumentDidOpen Request: e:\prog\fsharp\editor\ionide\FsAutoComplete\test\FsAutoComplete.Tests.Lsp\TestCases\WindowsError\Project\Library.fs
Don't know if that's related to paths issues or it's something different.
Why just dotnet run, not dotnet test? Do these run in different environments (dotnet test maybe isolated?)