Skip to content

Commit 75849fc

Browse files
authored
Merge pull request #1365 from julia-vscode/sp/public1
feat: some support for marking completions as public
2 parents 5aa671e + 93470e7 commit 75849fc

File tree

4 files changed

+51
-14
lines changed

4 files changed

+51
-14
lines changed

src/protocol/completion.jl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ end
4848
deprecatedSupport::Union{Bool,Missing}
4949
preselectSupport::Union{Bool,Missing}
5050
tagSupport::Union{CompletionTagClientCapabilities,Missing}
51+
labelDetailsSupport::Union{Bool,Missing}
5152
end
5253

5354
@dict_readable struct CompletionItemKindCapabilities <: Outbound
@@ -89,6 +90,11 @@ end
8990
context::Union{CompletionContext,Missing}
9091
end
9192

93+
struct CompletionItemLabelDetails <: Outbound
94+
detail::Union{String,Missing}
95+
description::Union{String,Missing}
96+
end
97+
9298
struct CompletionItem <: Outbound
9399
label::String
94100
kind::Union{Int,Missing}
@@ -106,9 +112,11 @@ struct CompletionItem <: Outbound
106112
commitCharacters::Union{Vector{String},Missing}
107113
command::Union{Command,Missing}
108114
data::Union{Any,Missing}
115+
labelDetails::Union{CompletionItemLabelDetails, Missing}
109116
end
110-
CompletionItem(label, kind, documentation, textEdit) = CompletionItem(label, kind, missing, missing, documentation, missing, missing, missing, missing, missing, InsertTextFormats.PlainText, textEdit, missing, missing, missing, missing)
111-
CompletionItem(label, kind, detail, documentation, textEdit) = CompletionItem(label, kind, missing, detail, documentation, missing, missing, missing, missing, missing, InsertTextFormats.PlainText, textEdit, missing, missing, missing, missing)
117+
CompletionItem(label, kind, documentation, textEdit) = CompletionItem(label, kind, missing, missing, documentation, missing, missing, missing, missing, missing, InsertTextFormats.PlainText, textEdit, missing, missing, missing, missing, missing)
118+
CompletionItem(label, kind, detail, documentation, textEdit) = CompletionItem(label, kind, missing, detail, documentation, missing, missing, missing, missing, missing, InsertTextFormats.PlainText, textEdit, missing, missing, missing, missing, missing)
119+
CompletionItem(label, kind, detail, labelDetails, documentation, textEdit) = CompletionItem(label, kind, missing, detail, documentation, missing, missing, missing, missing, missing, InsertTextFormats.PlainText, textEdit, missing, missing, missing, missing, labelDetails)
112120

113121
struct CompletionList <: Outbound
114122
isIncomplete::Bool

src/requests/completions.jl

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ function latex_completions(partial::String, state::CompletionState)
113113
for (k, v) in Iterators.flatten((REPL.REPLCompletions.latex_symbols, REPL.REPLCompletions.emoji_symbols))
114114
if is_completion_match(string(k), partial)
115115
# t1 = TextEdit(Range(state.doc, (state.offset - sizeof(partial)):state.offset), v)
116-
add_completion_item(state, CompletionItem(k, CompletionItemKinds.Unit, missing, v, v, missing, missing, missing, missing, missing, missing, texteditfor(state, partial, v), missing, missing, missing, missing))
116+
add_completion_item(state, CompletionItem(k, CompletionItemKinds.Unit, missing, v, v, missing, missing, missing, missing, missing, missing, texteditfor(state, partial, v), missing, missing, missing, missing, missing))
117117
end
118118
end
119119
end
@@ -123,7 +123,7 @@ function kw_completion(partial::String, state::CompletionState)
123123
for (kw, comp) in snippet_completions
124124
if startswith(kw, partial)
125125
kind = occursin("\$0", comp) ? CompletionItemKinds.Snippet : CompletionItemKinds.Keyword
126-
add_completion_item(state, CompletionItem(kw, kind, missing, missing, kw, missing, missing, missing, missing, missing, InsertTextFormats.Snippet, texteditfor(state, partial, comp), missing, missing, missing, missing))
126+
add_completion_item(state, CompletionItem(kw, kind, missing, missing, kw, missing, missing, missing, missing, missing, InsertTextFormats.Snippet, texteditfor(state, partial, comp), missing, missing, missing, missing, missing))
127127
end
128128
end
129129
end
@@ -325,15 +325,15 @@ function collect_completions(m::SymbolServer.ModuleStore, spartial, state::Compl
325325
foreach(possible_names) do n
326326
ci = CompletionItem(n, _completion_kind(v), missing, "This is an unexported symbol and will be explicitly imported.",
327327
MarkupContent(sanitize_docstring(v.doc)), missing, missing, missing, missing, missing, InsertTextFormats.PlainText,
328-
texteditfor(state, spartial, n), textedit_to_insert_using_stmt(m, canonical_name, state), missing, missing, "import")
328+
texteditfor(state, spartial, n), textedit_to_insert_using_stmt(m, canonical_name, state), missing, missing, "import", missing)
329329
add_completion_item(state, ci)
330330
end
331331
elseif state.server.completion_mode === :qualify
332332
foreach(possible_names) do n
333333
add_completion_item(state, CompletionItem(string(m.name, ".", n), _completion_kind(v), missing,
334334
missing, MarkupContent(sanitize_docstring(v.doc)), missing,
335335
missing, string(n), missing, missing, InsertTextFormats.PlainText, texteditfor(state, spartial, string(m.name, ".", n)),
336-
missing, missing, missing, missing))
336+
missing, missing, missing, missing, missing))
337337
end
338338
end
339339
end
@@ -383,12 +383,13 @@ function collect_completions(x::StaticLint.Scope, spartial, state::CompletionSta
383383
end
384384
if length(possible_names) > 0
385385
documentation = ""
386-
if n[2] isa StaticLint.Binding
387-
documentation = get_tooltip(n[2], documentation, state.server)
388-
sanitize_docstring(documentation)
386+
b = n[2]
387+
if b isa StaticLint.Binding
388+
documentation = get_tooltip(b, documentation, state.server)
389+
documentation = sanitize_docstring(documentation)
389390
end
390391
foreach(possible_names) do nn
391-
add_completion_item(state, CompletionItem(nn, _completion_kind(n[2]), get_typed_definition(n[2]), MarkupContent(documentation), texteditfor(state, spartial, nn)))
392+
add_completion_item(state, CompletionItem(nn, _completion_kind(b), get_typed_definition(b), _completion_details_label(b), MarkupContent(documentation), texteditfor(state, spartial, nn)))
392393
end
393394
end
394395
end
@@ -417,14 +418,14 @@ function _get_dot_completion(px::EXPR, spartial, state::CompletionState)
417418
for a in refof(px).type.fieldnames
418419
a = String(a)
419420
if is_completion_match(a, spartial)
420-
add_completion_item(state, CompletionItem(a, CompletionItemKinds.Method, get_typed_definition(a), MarkupContent(a), texteditfor(state, spartial, a)))
421+
add_completion_item(state, CompletionItem(a, CompletionItemKinds.Method, get_typed_definition(a), _completion_details_label(a), MarkupContent(a), texteditfor(state, spartial, a)))
421422
end
422423
end
423424
elseif refof(px).type isa StaticLint.Binding && refof(px).type.val isa SymbolServer.DataTypeStore
424425
for a in refof(px).type.val.fieldnames
425426
a = String(a)
426427
if is_completion_match(a, spartial)
427-
add_completion_item(state, CompletionItem(a, CompletionItemKinds.Method, get_typed_definition(a), MarkupContent(a), texteditfor(state, spartial, a)))
428+
add_completion_item(state, CompletionItem(a, CompletionItemKinds.Method, get_typed_definition(a), _completion_details_label(a), MarkupContent(a), texteditfor(state, spartial, a)))
428429
end
429430
end
430431
elseif refof(px).type isa StaticLint.Binding && refof(px).type.val isa EXPR && CSTParser.defines_struct(refof(px).type.val) && scopeof(refof(px).type.val) isa StaticLint.Scope
@@ -464,7 +465,14 @@ function _completion_kind(b)
464465
end
465466
end
466467

467-
468+
function _completion_details_label(b)
469+
if b isa StaticLint.Binding
470+
if b.is_public
471+
return CompletionItemLabelDetails(" (public)", get_typed_definition(b))
472+
end
473+
end
474+
return missing
475+
end
468476

469477
function get_import_root(x::EXPR)
470478
if CSTParser.isoperator(headof(x.args[1])) && valof(headof(x.args[1])) == ":"

test/requests/test_completions.jl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,24 @@ end
216216
@test any(i -> i.label == "yyy" && occursin("yyy::Bar", i.detail), items1)
217217
@test any(i -> i.label == "xxx" && occursin("xxx::Bar = f.yyy", i.detail), items2)
218218
end
219+
220+
@testitem "completion public annotation" begin
221+
include("../test_shared_server.jl")
222+
223+
settestdoc("""
224+
module Foo
225+
public bar
226+
227+
"asd"
228+
function bar end
229+
end
230+
231+
Foo.ba
232+
""")
233+
items = completion_test(7, 6).items
234+
@test length(items) == 1
235+
item = only(items)
236+
@test item.label == "bar"
237+
@test item.labelDetails.detail == " (public)"
238+
@test occursin("function bar end", item.labelDetails.description)
239+
end

test/test_shared_init_request.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ init_request = LanguageServer.InitializeParams(
1919
),
2020
LanguageServer.TextDocumentClientCapabilities(
2121
LanguageServer.TextDocumentSyncClientCapabilities(true, true, true, true),
22-
LanguageServer.CompletionClientCapabilities(true, LanguageServer.CompletionItemClientCapabilities(true, missing, missing, missing, missing, missing), missing, missing),
22+
LanguageServer.CompletionClientCapabilities(true, LanguageServer.CompletionItemClientCapabilities(true, missing, missing, missing, missing, missing, missing), missing, missing),
2323
LanguageServer.HoverClientCapabilities(true, missing),
2424
LanguageServer.SignatureHelpClientCapabilities(true, missing, missing),
2525
LanguageServer.DeclarationClientCapabilities(false, missing),

0 commit comments

Comments
 (0)