[ANN] VS Code extension 1.224 pre-release

Hey everyone,

it’s been a while since we last had a noteworthy release of the Julia extension for VS Code, but this pre-release brings a significant rework of the underlying analysis engine and should fix many long standing bugs around anything that’s related to static analysis of Julia code.

You can find the changelog on GitHub, but even that doesn’t tell the full story: even for complex packages you should see almost no false positives anymore (though macros and isdefined guarded field access are still problems and unlikely to be fully solved). The LS should also be significantly faster and more responsive, especially for larger workspaces.

Just as an example: Opening Revise.jl shows no “proper” false positives in the src directory anymore


All missing-reference or missing-reference warnings are due to version or isdefined guarded branches.

That said, a rework this significant also needs a lot of real world testing, so we’d appreciate people trying this pre-release and reporting bugs on GitHub or Slack.

I see this crash:

ERROR: Salsa.DerivedFunctionException{MethodError}(MethodError(splitpath, (nothing,), 0x000000000000975a), Union{Salsa.DerivedKey{F, TT}, Salsa.InputKey{F, TT}} where {F, TT}[Salsa.DerivedKey{typeof(JuliaWorkspaces.derived_package_for_file), Tuple{JuliaWorkspaces.URIs2.URI}}((JuliaWorkspaces.URIs2.URI("untitled", nothing, "Untitled-1", nothing, nothing),)), Salsa.DerivedKey{typeof(JuliaWorkspaces.derived_testitems), Tuple{JuliaWorkspaces.URIs2.URI}}((JuliaWorkspaces.URIs2.URI("untitled", nothing, "Untitled-1", nothing, nothing),))])
Stacktrace:
  [1] (::JuliaWorkspaces.var"#%%__user_derived_package_for_file##6#%%__user_derived_package_for_file##7"{Nothing})(i::@NamedTuple{uri::JuliaWorkspaces.URIs2.URI, parts::Vector{String}})
    @ JuliaWorkspaces ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/JuliaWorkspaces/src/layer_projects.jl:252
  [2] filter(f::JuliaWorkspaces.var"#%%__user_derived_package_for_file##6#%%__user_derived_package_for_file##7"{Nothing}, a::Vector{@NamedTuple{uri::JuliaWorkspaces.URIs2.URI, parts::Vector{String}}})
    @ Base ./array.jl:2937
  [3] #%%__user_derived_package_for_file##4
    @ ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/JuliaWorkspaces/src/layer_projects.jl:251 [inlined]
  [4] |>
    @ ./operators.jl:972 [inlined]
  [5] #%%__user_derived_package_for_file##0
    @ ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/JuliaWorkspaces/src/layer_projects.jl:246 [inlined]
  [6] |>(x::Vector{JuliaWorkspaces.URIs2.URI}, f::JuliaWorkspaces.var"#%%__user_derived_package_for_file##0#%%__user_derived_package_for_file##1"{Nothing})
    @ Base ./operators.jl:972
  [7] var"%%__user_derived_package_for_file"(rt::Salsa._TracingRuntime{JuliaWorkspaces.SContext, Salsa._DefaultSalsaStorage.DefaultStorage}, file::JuliaWorkspaces.URIs2.URI)
    @ JuliaWorkspaces ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/JuliaWorkspaces/src/layer_projects.jl:245
  [8] macro expansion
    @ ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/Salsa/src/TraceLogging.jl:264 [inlined]
  [9] _memoized_lookup_internal(runtime::Salsa._TracingRuntime{JuliaWorkspaces.SContext, Salsa._DefaultSalsaStorage.DefaultStorage}, key::Salsa.DerivedKey{typeof(JuliaWorkspaces.derived_package_for_file), Tuple{JuliaWorkspaces.URIs2.URI}})
    @ Salsa._DefaultSalsaStorage ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/Salsa/src/default_storage.jl:269
 [10] memoized_lookup(rt::Salsa._TracingRuntime{JuliaWorkspaces.SContext, Salsa._DefaultSalsaStorage.DefaultStorage}, dependency_key::Salsa.DerivedKey{typeof(JuliaWorkspaces.derived_package_for_file), Tuple{JuliaWorkspaces.URIs2.URI}})
    @ Salsa ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/Salsa/src/runtime_generic.jl:20
 [11] memoized_lookup_unwrapped
    @ ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/Salsa/src/runtime_generic.jl:43 [inlined]
 [12] derived_package_for_file
    @ ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/Salsa/src/derived_macro.jl:109 [inlined]
 [13] var"%%__user_derived_testitems"(rt::Salsa._TracingRuntime{JuliaWorkspaces.SContext, Salsa._DefaultSalsaStorage.DefaultStorage}, uri::JuliaWorkspaces.URIs2.URI)
    @ JuliaWorkspaces ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/JuliaWorkspaces/src/layer_testitems.jl:45
 [14] macro expansion
    @ ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/Salsa/src/TraceLogging.jl:264 [inlined]
 [15] _memoized_lookup_internal(runtime::Salsa._TracingRuntime{JuliaWorkspaces.SContext, Salsa._DefaultSalsaStorage.DefaultStorage}, key::Salsa.DerivedKey{typeof(JuliaWorkspaces.derived_testitems), Tuple{JuliaWorkspaces.URIs2.URI}})
    @ Salsa._DefaultSalsaStorage ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/Salsa/src/default_storage.jl:269
 [16] memoized_lookup(rt::Salsa._TopLevelRuntime{JuliaWorkspaces.SContext, Salsa._DefaultSalsaStorage.DefaultStorage}, dependency_key::Salsa.DerivedKey{typeof(JuliaWorkspaces.derived_testitems), Tuple{JuliaWorkspaces.URIs2.URI}})
    @ Salsa ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/Salsa/src/runtime_generic.jl:20
 [17] memoized_lookup_unwrapped
    @ ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/Salsa/src/runtime_generic.jl:43 [inlined]
 [18] derived_testitems(rt::Salsa._TopLevelRuntime{JuliaWorkspaces.SContext, Salsa._DefaultSalsaStorage.DefaultStorage}, uri::JuliaWorkspaces.URIs2.URI)
    @ JuliaWorkspaces ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/Salsa/src/derived_macro.jl:109
 [19] get_test_items(jw::JuliaWorkspaces.JuliaWorkspace, uri::JuliaWorkspaces.URIs2.URI)
    @ JuliaWorkspaces ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/JuliaWorkspaces/src/public.jl:588
 [20] publish_file_diagnostics_testitems(server::LanguageServer.LanguageServerInstance, uris::Vector{JuliaWorkspaces.URIs2.URI})
    @ LanguageServer ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/LanguageServer/src/testitem_diagnostic_marking.jl:129
 [21] textDocument_didOpen_notification(params::LanguageServer.DidOpenTextDocumentParams, server::LanguageServer.LanguageServerInstance, conn::JSONRPC.JSONRPCEndpoint{Base.PipeEndpoint, Base.PipeEndpoint, JSON.Serializations.StandardSerialization, JSONRPC.ContentLengthFraming})
    @ LanguageServer ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/LanguageServer/src/requests/textdocument.jl:26
 [22] invoke_handler(func::typeof(LanguageServer.textDocument_didOpen_notification), params::LanguageServer.DidOpenTextDocumentParams, server::LanguageServer.LanguageServerInstance, conn::JSONRPC.JSONRPCEndpoint{Base.PipeEndpoint, Base.PipeEndpoint, JSON.Serializations.StandardSerialization, JSONRPC.ContentLengthFraming})
    @ LanguageServer ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/LanguageServer/src/languageserverinstance.jl:179
 [23] (::LanguageServer.var"#notification_wrapper##0#notification_wrapper##1"{typeof(LanguageServer.textDocument_didOpen_notification), LanguageServer.LanguageServerInstance})(conn::JSONRPC.JSONRPCEndpoint{Base.PipeEndpoint, Base.PipeEndpoint, JSON.Serializations.StandardSerialization, JSONRPC.ContentLengthFraming}, params::LanguageServer.DidOpenTextDocumentParams)
    @ LanguageServer ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/LanguageServer/src/languageserverinstance.jl:214
 [24] dispatch_msg(x::JSONRPC.JSONRPCEndpoint{Base.PipeEndpoint, Base.PipeEndpoint, JSON.Serializations.StandardSerialization, JSONRPC.ContentLengthFraming}, dispatcher::JSONRPC.MsgDispatcher, msg::JSONRPC.Request)
    @ JSONRPC ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/JSONRPC/src/typed.jl:0
 [25] (::LanguageServer.var"#123#124"{Vector{Any}, LanguageServer.LanguageServerInstance, LanguageServer.LSPTraceReceiver{LanguageServer.LanguageServerInstance}, Base.RefValue{Bool}})()
    @ LanguageServer ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/LanguageServer/src/languageserverinstance.jl:476
 [26] with_logstate(f::LanguageServer.var"#123#124"{Vector{Any}, LanguageServer.LanguageServerInstance, LanguageServer.LSPTraceReceiver{LanguageServer.LanguageServerInstance}, Base.RefValue{Bool}}, logstate::Base.CoreLogging.LogState)
    @ Base.CoreLogging ./logging/logging.jl:542
 [27] with_logger
    @ ./logging/logging.jl:653 [inlined]
 [28] run(server::LanguageServer.LanguageServerInstance; timings::Vector{Any})
    @ LanguageServer ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/LanguageServer/src/languageserverinstance.jl:339
 [29] run(server::LanguageServer.LanguageServerInstance)
    @ LanguageServer ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/packages/LanguageServer/src/languageserverinstance.jl:310
 [30] top-level scope
    @ ~/.vscode/extensions/julialang.language-julia-1.224.1/scripts/languageserver/main.jl:198
 [31] include(mod::Module, _path::String)
    @ Base ./Base.jl:306
 [32] exec_options(opts::Base.JLOptions)
    @ Base ./client.jl:317
 [33] _start()
    @ Base ./client.jl:550

Should be fixed by fix: handle non-file URIs in derived_{package,project}_for_file - Pull Request #157 - julia-vscode/JuliaWorkspaces.jl - GitHub.

I hope if fixes the really troubles it has had. I can barely can use VSCode anymore because Language Server is always being compiled for looong periods and my Laptop melts in these hot summer days.