Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ JSON = "0.20, 0.21"
JSONRPC = "1.1"
JuliaFormatter = "0.18.1"
StaticLint = "8.0"
SymbolServer = "6, 7.0"
SymbolServer = "7.1"
Tokenize = "0.5.10"
URIParser = "0.4.1"
julia = "1"
Expand Down
17 changes: 11 additions & 6 deletions src/languageserverinstance.jl
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,14 @@ mutable struct LanguageServerInstance

shutdown_requested::Bool

function LanguageServerInstance(pipe_in, pipe_out, env_path="", depot_path="", err_handler=nothing, symserver_store_path=nothing, download=true)
function LanguageServerInstance(pipe_in, pipe_out, env_path="", depot_path="", err_handler=nothing, symserver_store_path=nothing, download=true, symbolcache_upstream = nothing)
new(
JSONRPC.JSONRPCEndpoint(pipe_in, pipe_out, err_handler),
Set{String}(),
Dict{URI2,Document}(),
env_path,
depot_path,
SymbolServer.SymbolServerInstance(depot_path, symserver_store_path),
SymbolServer.SymbolServerInstance(depot_path, symserver_store_path; symbolcache_upstream = symbolcache_upstream),
Channel(Inf),
StaticLint.ExternalEnv(deepcopy(SymbolServer.stdlibs), SymbolServer.collect_extended_methods(SymbolServer.stdlibs), collect(keys(SymbolServer.stdlibs))),
Dict(),
Expand Down Expand Up @@ -147,7 +147,7 @@ function create_symserver_progress_ui(server)
JSONRPC.send(
server.jr_endpoint,
progress_notification_type,
ProgressParams(token, WorkDoneProgressBegin("Julia", missing, "Starting async tasks...", 0))
ProgressParams(token, WorkDoneProgressBegin("Julia", missing, "Starting async tasks...", missing))
)
end
end
Expand Down Expand Up @@ -185,11 +185,11 @@ function trigger_symbolstore_reload(server::LanguageServerInstance)
JSONRPC.send(
server.jr_endpoint,
progress_notification_type,
ProgressParams(server.current_symserver_progress_token, WorkDoneProgressReport(missing, msg, percentage))
ProgressParams(server.current_symserver_progress_token, WorkDoneProgressReport(missing, msg, missing))
)
@info msg percentage
@info msg
else
@info msg percentage
@info msg
end
end,
server.err_handler,
Expand Down Expand Up @@ -261,6 +261,7 @@ function Base.run(server::LanguageServerInstance)
server.status = :started

run(server.jr_endpoint)
@debug "Connected at $(round(Int, time()))"

trigger_symbolstore_reload(server)

Expand Down Expand Up @@ -310,6 +311,8 @@ function Base.run(server::LanguageServerInstance)
@debug "LS: Symbol server listener task done."
end

@debug "Symbol Server started at $(round(Int, time()))"

msg_dispatcher = JSONRPC.MsgDispatcher()

msg_dispatcher[textDocument_codeAction_request_type] = request_wrapper(textDocument_codeAction_request, server)
Expand Down Expand Up @@ -351,6 +354,7 @@ function Base.run(server::LanguageServerInstance)
msg_dispatcher[textDocument_selectionRange_request_type] = request_wrapper(textDocument_selectionRange_request, server)

@debug "starting main loop"
@debug "Starting event listener loop at $(round(Int, time()))"
while true
message = take!(server.combined_msg_queue)
if message.type == :close
Expand Down Expand Up @@ -380,6 +384,7 @@ function Base.run(server::LanguageServerInstance)
@debug "starting re-lint of everything"
relintserver(server)
@debug "re-lint done"
@debug "Linting finished at $(round(Int, time()))"
end
end
end
Expand Down
22 changes: 14 additions & 8 deletions src/requests/hover.jl
Original file line number Diff line number Diff line change
Expand Up @@ -161,39 +161,45 @@ end

get_fcall_position(x, documentation, visited=nothing) = documentation

function get_fcall_position(x::EXPR, documentation, visited=EXPR[])
function get_fcall_position(x::EXPR, documentation, visited=Set{EXPR}())
if x in visited # TODO: remove
throw(LSInfiniteLoop("Possible infinite loop.")) # TODO: remove
else # TODO: remove
push!(visited, x) # TODO: remove
end # TODO: remove
if parentof(x) isa EXPR
if CSTParser.iscall(parentof(x))
call_counts = StaticLint.call_nargs(parentof(x))
call_counts[1] < 5 && return documentation
minargs, _, _ = StaticLint.call_nargs(parentof(x))
arg_i = 0
for (i, arg) = enumerate(parentof(x))
for (i, arg) in enumerate(parentof(x))
if arg == x
arg_i = div(i - 1, 2)
break
end
end
arg_i == 0 && return documentation

# hovering over the function name, so we might as well check the parent
if arg_i == 0
return get_fcall_position(parentof(x), documentation, visited)
end

minargs < 4 && return documentation

fname = CSTParser.get_name(parentof(x))
if StaticLint.hasref(fname) &&
(refof(fname) isa StaticLint.Binding && refof(fname).val isa EXPR && CSTParser.defines_struct(refof(fname).val) && StaticLint.struct_nargs(refof(fname).val)[1] == call_counts[1])
(refof(fname) isa StaticLint.Binding && refof(fname).val isa EXPR && CSTParser.defines_struct(refof(fname).val) && StaticLint.struct_nargs(refof(fname).val)[1] == minargs)
dt_ex = refof(fname).val
args = dt_ex.args[3]
args.args === nothing || arg_i > length(args.args) && return documentation
_fieldname = CSTParser.str_value(CSTParser.get_arg_name(args.args[arg_i]))
documentation = string("Datatype field `$_fieldname` of $(CSTParser.str_value(CSTParser.get_name(dt_ex)))", "\n", documentation)
elseif StaticLint.hasref(fname) && (refof(fname) isa SymbolServer.DataTypeStore || refof(fname) isa StaticLint.Binding && refof(fname).val isa SymbolServer.DataTypeStore)
dts = refof(fname) isa StaticLint.Binding ? refof(fname).val : refof(fname)
if length(dts.fieldnames) == call_counts[1] && arg_i <= length(dts.fieldnames)
if length(dts.fieldnames) == minargs && arg_i <= length(dts.fieldnames)
documentation = string("Datatype field `$(dts.fieldnames[arg_i])`", "\n", documentation)
end
else
documentation = string("Argument $arg_i of $(call_counts[1]) in call to `", CSTParser.str_value(fname), "`\n", documentation)
documentation = string("Argument $arg_i of $(minargs) in call to `", CSTParser.str_value(fname), "`\n", documentation)
end
return documentation
else
Expand Down