From 1b0b6c0bd6e96c14bded624df803f82561dde645 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Mon, 9 Aug 2021 18:31:31 +0200 Subject: [PATCH 1/7] Draft for method completion --- draft/draft_method_complete.jl | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 draft/draft_method_complete.jl diff --git a/draft/draft_method_complete.jl b/draft/draft_method_complete.jl new file mode 100644 index 00000000..3f60c270 --- /dev/null +++ b/draft/draft_method_complete.jl @@ -0,0 +1,20 @@ +using REPL + +# Test with or without arbitrary additional arguments +moreargs = true + +x = 3 + +teststr = "x,x,x,x,x" +callstr = "_(" * teststr * ")" +ex_org = Meta.parse(callstr, raise=false, depwarn=false) +res = REPL.REPLCompletions.complete_any_methods(ex_org, Main, Main, moreargs) + +# Reference directly from REPL +refstr = "?(" * teststr +if !moreargs + refstr *= ")" +end +ref = REPL.REPLCompletions.completions(refstr, length(refstr))[1] + +println(ref == res) From 127222d3143903a524cfd631de9860a7ff1218f6 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 10 Aug 2021 13:44:21 +0200 Subject: [PATCH 2/7] wip completion methods --- draft/draft_method_complete.jl | 10 ++++ draft/draft_test_method_complete.jl | 88 +++++++++++++++++++++++++++++ src/requests/completions.jl | 17 ++++++ 3 files changed, 115 insertions(+) create mode 100644 draft/draft_test_method_complete.jl diff --git a/draft/draft_method_complete.jl b/draft/draft_method_complete.jl index 3f60c270..4041c3fd 100644 --- a/draft/draft_method_complete.jl +++ b/draft/draft_method_complete.jl @@ -18,3 +18,13 @@ end ref = REPL.REPLCompletions.completions(refstr, length(refstr))[1] println(ref == res) + +struct Foo + bar + baz +end + +phi = Foo(1, 2) +psi = Foo(2, 3) + + diff --git a/draft/draft_test_method_complete.jl b/draft/draft_test_method_complete.jl new file mode 100644 index 00000000..3bc5ec05 --- /dev/null +++ b/draft/draft_test_method_complete.jl @@ -0,0 +1,88 @@ +## Testing as in test/runtests.jl and test/requests/completions.jl +using Test, Sockets, LanguageServer, CSTParser, SymbolServer, SymbolServer.Pkg, StaticLint, LanguageServer.JSON, LanguageServer.JSONRPC +using LanguageServer: Document, get_text, get_offset, get_line_offsets, get_position_at, get_open_in_editor, set_open_in_editor, is_workspace_file, applytextdocumentchanges + +init_request = LanguageServer.InitializeParams( + 9902, + missing, + nothing, + nothing, + missing, + LanguageServer.ClientCapabilities( + LanguageServer.WorkspaceClientCapabilities( + true, + LanguageServer.WorkspaceEditClientCapabilities(true, missing, missing), + LanguageServer.DidChangeConfigurationClientCapabilities(false), + LanguageServer.DidChangeWatchedFilesClientCapabilities(false,), + LanguageServer.WorkspaceSymbolClientCapabilities(true, missing), + LanguageServer.ExecuteCommandClientCapabilities(true), + missing, + missing + ), + LanguageServer.TextDocumentClientCapabilities( + LanguageServer.TextDocumentSyncClientCapabilities(true, true, true, true), + LanguageServer.CompletionClientCapabilities(true, LanguageServer.CompletionItemClientCapabilities(true, missing, missing, missing, missing, missing), missing, missing), + LanguageServer.HoverClientCapabilities(true, missing), + LanguageServer.SignatureHelpClientCapabilities(true, missing, missing), + LanguageServer.DeclarationClientCapabilities(false, missing), + missing, # DefinitionClientCapabilities(), + missing, # TypeDefinitionClientCapabilities(), + missing, # ImplementationClientCapabilities(), + missing, # ReferenceClientCapabilities(), + LanguageServer.DocumentHighlightClientCapabilities(true), + LanguageServer.DocumentSymbolClientCapabilities(true, missing, missing), + LanguageServer.CodeActionClientCapabilities(true, missing, missing), + LanguageServer.CodeLensClientCapabilities(true), + missing, # DocumentLinkClientCapabilities(), + missing, # DocumentColorClientCapabilities(), + LanguageServer.DocumentFormattingClientCapabilities(true), + missing, # DocumentRangeFormattingClientCapabilities(), + missing, # DocumentOnTypeFormattingClientCapabilities(), + LanguageServer.RenameClientCapabilities(true, true), + missing, # PublishDiagnosticsClientCapabilities(), + missing, # FoldingRangeClientCapabilities(), + missing, # SelectionRangeClientCapabilities() + ), + missing, + missing + ), + "off", + missing, + missing +) + +server = LanguageServerInstance(IOBuffer(), IOBuffer(), dirname(Pkg.Types.Context().env.project_file), first(Base.DEPOT_PATH)) +server.runlinter = true +server.jr_endpoint = nothing +LanguageServer.initialize_request(init_request, server, nothing) + +JSONRPC.send(::Nothing, ::Any, ::Any) = nothing +function settestdoc(text) + empty!(server._documents) + LanguageServer.textDocument_didOpen_notification(LanguageServer.DidOpenTextDocumentParams(LanguageServer.TextDocumentItem("testdoc", "julia", 0, text)), server, nothing) + + doc = LanguageServer.getdocument(server, LanguageServer.URI2("testdoc")) + LanguageServer.parse_all(doc, server) + doc +end + +completion_test(line, char) = LanguageServer.textDocument_completion_request(LanguageServer.CompletionParams(LanguageServer.TextDocumentIdentifier("testdoc"), LanguageServer.Position(line, char), missing), server, server.jr_endpoint) + + +## A completion that is working +settestdoc("import Base: r") +labels = [item.label for item in completion_test(0, 14).items] + +## Another completion +settestdoc("using ") +labels = [item.label for item in completion_test(0, 6).items] + +## Another completion +settestdoc("""phi = 1 + ph""") +labels = [item.label for item in completion_test(0, 10).items] + +## Another completion +settestdoc("""phi = 1 + (phi,""") +labels = [item.label for item in completion_test(0, 13).items] \ No newline at end of file diff --git a/src/requests/completions.jl b/src/requests/completions.jl index aac35d9e..37972782 100644 --- a/src/requests/completions.jl +++ b/src/requests/completions.jl @@ -93,6 +93,23 @@ function textDocument_completion_request(params::CompletionParams, server::Langu collect_completions(state.x, "in", state, false) elseif t isa CSTParser.Tokens.Token && t.kind == CSTParser.Tokens.ISA && is_at_end collect_completions(state.x, "isa", state, false) + elseif t isa CSTParser.Tokens.Token && t.kind == CSTParser.Tokens.COMMA && + pt isa CSTParser.Tokens.Token && pt.kind == CSTParser.Tokens.IDENTIFIER && + ppt isa CSTParser.Tokens.Token && ppt.kind == CSTParser.Tokens.LPAREN + # WIP method completion for variable + @info "$ppt $pt $t $is_at_end" + px = get_expr(getcst(state.doc), state.offset - (1 + t.endbyte - t.startbyte)) + a = "test" + spartial = "" + add_completion_item(state, CompletionItem( + a, 2, MarkupContent(a), + TextEdit(Range( + Position(state.range.start.line, + state.range.start.character), + Position(state.range.stop.line, + state.range.stop.character)), a) + )) + # - (1 + pt.endbyte - pt.startbyte) - 2) end return CompletionList(true, unique(values(state.completions))) From 68aa393c4b1d147ab114ae1403e34b5c48b09f11 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 10 Aug 2021 18:40:05 +0200 Subject: [PATCH 3/7] Completion with prefix working --- draft/draft_method_complete.jl | 8 +++++ draft/draft_test_method_complete.jl | 7 ++-- src/requests/completions.jl | 52 +++++++++++++++++++++-------- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/draft/draft_method_complete.jl b/draft/draft_method_complete.jl index 4041c3fd..9ef79c9b 100644 --- a/draft/draft_method_complete.jl +++ b/draft/draft_method_complete.jl @@ -27,4 +27,12 @@ end phi = Foo(1, 2) psi = Foo(2, 3) +## +using CSTParser, StaticLint +expr = CSTParser.parse("""x=3 +x""") +println(StaticLint.parentof(expr)) +x = 3 + +(x,) diff --git a/draft/draft_test_method_complete.jl b/draft/draft_test_method_complete.jl index 3bc5ec05..7553b39f 100644 --- a/draft/draft_test_method_complete.jl +++ b/draft/draft_test_method_complete.jl @@ -78,11 +78,10 @@ settestdoc("using ") labels = [item.label for item in completion_test(0, 6).items] ## Another completion -settestdoc("""phi = 1 - ph""") -labels = [item.label for item in completion_test(0, 10).items] +settestdoc("me") +labels = [item.label for item in completion_test(0, 2).items] ## Another completion settestdoc("""phi = 1 (phi,""") -labels = [item.label for item in completion_test(0, 13).items] \ No newline at end of file +labels = [item.label for item in completion_test(0, 13).items] diff --git a/src/requests/completions.jl b/src/requests/completions.jl index 37972782..b00dc5ab 100644 --- a/src/requests/completions.jl +++ b/src/requests/completions.jl @@ -95,21 +95,45 @@ function textDocument_completion_request(params::CompletionParams, server::Langu collect_completions(state.x, "isa", state, false) elseif t isa CSTParser.Tokens.Token && t.kind == CSTParser.Tokens.COMMA && pt isa CSTParser.Tokens.Token && pt.kind == CSTParser.Tokens.IDENTIFIER && - ppt isa CSTParser.Tokens.Token && ppt.kind == CSTParser.Tokens.LPAREN + ppt isa CSTParser.Tokens.Token && ppt.kind == CSTParser.Tokens.LPAREN && + ! (parentof(state.x) isa EXPR && CSTParser.iscall(parentof(state.x))) # WIP method completion for variable - @info "$ppt $pt $t $is_at_end" - px = get_expr(getcst(state.doc), state.offset - (1 + t.endbyte - t.startbyte)) - a = "test" - spartial = "" - add_completion_item(state, CompletionItem( - a, 2, MarkupContent(a), - TextEdit(Range( - Position(state.range.start.line, - state.range.start.character), - Position(state.range.stop.line, - state.range.stop.character)), a) - )) - # - (1 + pt.endbyte - pt.startbyte) - 2) + @info "Tokens for method completion: $ppt $pt $t $is_at_end" + x = get_expr(getcst(state.doc), state.offset - (1 + t.endbyte - t.startbyte)) + px = get_expr(getcst(state.doc), state.offset - (1 + pt.endbyte - pt.startbyte)) + scope = scopeof(parentof(parentof(state.x))) + @info "Names in scope: $(scope.names)" + @info "Modules in scope: $([m[1] for m in scope.modules])" + + px_type = refof(px).type.name.name.name + + for m in scope.modules + for val in m[2].vals + n, v = String(val[1]), val[2] + (startswith(n, ".") || startswith(n, "#")) && continue + !(typeof(v) == SymbolServer.FunctionStore) && continue + for m in v.methods + isempty(m.sig) && continue + !(typeof(m.sig[1][2]) == SymbolServer.FakeTypeName) && continue + !(m.sig[1][2].name.name == px_type) && continue + + inplace_edit = TextEdit(Range( + Position(state.range.start.line, state.range.start.character), + Position(state.range.stop.line, state.range.stop.character)), " ") + prefix_edit = TextEdit(Range( + Position(state.range.start.line, + state.range.start.character - (1 + pt.endbyte - pt.startbyte) - 2), + Position(state.range.stop.line, + state.range.stop.character - (1 + pt.endbyte - pt.startbyte) - 2)), n) + item = CompletionItem(n, 2, missing, missing, n, + missing, missing, missing, missing, missing, + InsertTextFormats.PlainText, inplace_edit, [prefix_edit], + missing, missing, missing) + add_completion_item(state, item) + end + end + end + end return CompletionList(true, unique(values(state.completions))) From e4a7fd3a6f4ed033cb2cbff6d403f7913a5cf3a7 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Wed, 11 Aug 2021 10:47:46 +0200 Subject: [PATCH 4/7] Method completion in function --- draft/draft_test_method_complete.jl | 14 ++++ src/requests/completions.jl | 106 +++++++++++++++++----------- 2 files changed, 80 insertions(+), 40 deletions(-) diff --git a/draft/draft_test_method_complete.jl b/draft/draft_test_method_complete.jl index 7553b39f..525fe653 100644 --- a/draft/draft_test_method_complete.jl +++ b/draft/draft_test_method_complete.jl @@ -85,3 +85,17 @@ labels = [item.label for item in completion_test(0, 2).items] settestdoc("""phi = 1 (phi,""") labels = [item.label for item in completion_test(0, 13).items] +println(labels) + +## Another completion +doctext = """ +struct Foo + bar + baz +end + +phi = Foo(1, 2) +(phi,""" +settestdoc(doctext) +labels = [item.label for item in completion_test(0, length(doctext)).items] +println(labels) diff --git a/src/requests/completions.jl b/src/requests/completions.jl index b00dc5ab..4a6f7b9c 100644 --- a/src/requests/completions.jl +++ b/src/requests/completions.jl @@ -94,46 +94,13 @@ function textDocument_completion_request(params::CompletionParams, server::Langu elseif t isa CSTParser.Tokens.Token && t.kind == CSTParser.Tokens.ISA && is_at_end collect_completions(state.x, "isa", state, false) elseif t isa CSTParser.Tokens.Token && t.kind == CSTParser.Tokens.COMMA && - pt isa CSTParser.Tokens.Token && pt.kind == CSTParser.Tokens.IDENTIFIER && - ppt isa CSTParser.Tokens.Token && ppt.kind == CSTParser.Tokens.LPAREN && - ! (parentof(state.x) isa EXPR && CSTParser.iscall(parentof(state.x))) - # WIP method completion for variable - @info "Tokens for method completion: $ppt $pt $t $is_at_end" - x = get_expr(getcst(state.doc), state.offset - (1 + t.endbyte - t.startbyte)) - px = get_expr(getcst(state.doc), state.offset - (1 + pt.endbyte - pt.startbyte)) - scope = scopeof(parentof(parentof(state.x))) - @info "Names in scope: $(scope.names)" - @info "Modules in scope: $([m[1] for m in scope.modules])" - - px_type = refof(px).type.name.name.name - - for m in scope.modules - for val in m[2].vals - n, v = String(val[1]), val[2] - (startswith(n, ".") || startswith(n, "#")) && continue - !(typeof(v) == SymbolServer.FunctionStore) && continue - for m in v.methods - isempty(m.sig) && continue - !(typeof(m.sig[1][2]) == SymbolServer.FakeTypeName) && continue - !(m.sig[1][2].name.name == px_type) && continue - - inplace_edit = TextEdit(Range( - Position(state.range.start.line, state.range.start.character), - Position(state.range.stop.line, state.range.stop.character)), " ") - prefix_edit = TextEdit(Range( - Position(state.range.start.line, - state.range.start.character - (1 + pt.endbyte - pt.startbyte) - 2), - Position(state.range.stop.line, - state.range.stop.character - (1 + pt.endbyte - pt.startbyte) - 2)), n) - item = CompletionItem(n, 2, missing, missing, n, - missing, missing, missing, missing, missing, - InsertTextFormats.PlainText, inplace_edit, [prefix_edit], - missing, missing, missing) - add_completion_item(state, item) - end - end - end - + pt isa CSTParser.Tokens.Token && pt.kind == CSTParser.Tokens.IDENTIFIER && + ppt isa CSTParser.Tokens.Token && ppt.kind == CSTParser.Tokens.LPAREN && + !(parentof(state.x) isa EXPR && CSTParser.iscall(parentof(state.x))) + # method completion for given argument + ptlen = (1 + pt.endbyte - pt.startbyte) + px = get_expr(getcst(state.doc), state.offset - ptlen) + method_completion(px, state, ptlen) end return CompletionList(true, unique(values(state.completions))) @@ -581,3 +548,62 @@ function get_tls_arglist(tls::StaticLint.Scope) error() end end + +function method_completion(x, state, xlen) + scope = scopeof(parentof(parentof(state.x))) + + x_type = refof(x).type.name + + if x_type isa EXPR + typename = x_type.val + elseif x_type isa SymbolServer.FakeTypeName + typename = x_type.name.name + else + return + end + + for m in scope.modules + for val in m[2].vals + n, v = String(val[1]), val[2] + (startswith(n, ".") || startswith(n, "#") || startswith(n, "_")) && continue + !(typeof(v) == SymbolServer.FunctionStore) && continue + siglen_max = 0 # maximum signature length + for m in v.methods + isempty(m.sig) && continue + !(typeof(m.sig[1][2]) == SymbolServer.FakeTypeName) && continue + !(m.sig[1][2].name.name == typename) && continue + siglen_max = max(siglen_max, length(m.sig)) + end + (siglen_max == 0) && continue + + prefix_edit = TextEdit(Range( + Position(state.range.start.line, + state.range.start.character - xlen - 2), + Position(state.range.stop.line, + state.range.stop.character - xlen - 2)), n) + + if siglen_max == 1 # need to close bracket right away + additionalEdits = [TextEdit(Range( + Position(state.range.start.line, + state.range.start.character - 1), + Position(state.range.stop.line, + state.range.stop.character)), ""), prefix_edit] + inplace_text = "" + else + inplace_text = " " + additionalEdits = [prefix_edit] + end + + inplace_edit = TextEdit(Range( + Position(state.range.start.line, state.range.start.character), + Position(state.range.stop.line, state.range.stop.character)), + inplace_text) + + item = CompletionItem(n, 2, missing, missing, n, + missing, missing, missing, missing, missing, + InsertTextFormats.PlainText, inplace_edit, additionalEdits, + missing, missing, missing) + add_completion_item(state, item) + end + end +end From 9d439b5c085e3a79db753ea0f56d578f4221af4d Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Wed, 11 Aug 2021 11:23:02 +0200 Subject: [PATCH 5/7] wip: Testing with own function --- draft/draft_method_complete.jl | 6 ++++-- draft/draft_test_method_complete.jl | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/draft/draft_method_complete.jl b/draft/draft_method_complete.jl index 9ef79c9b..67ad6240 100644 --- a/draft/draft_method_complete.jl +++ b/draft/draft_method_complete.jl @@ -24,6 +24,10 @@ struct Foo baz end +function do_something(x::Foo) + x +end + phi = Foo(1, 2) psi = Foo(2, 3) @@ -34,5 +38,3 @@ x""") println(StaticLint.parentof(expr)) x = 3 - -(x,) diff --git a/draft/draft_test_method_complete.jl b/draft/draft_test_method_complete.jl index 525fe653..ffcc8093 100644 --- a/draft/draft_test_method_complete.jl +++ b/draft/draft_test_method_complete.jl @@ -99,3 +99,20 @@ phi = Foo(1, 2) settestdoc(doctext) labels = [item.label for item in completion_test(0, length(doctext)).items] println(labels) + +## Another completion +doctext = """ +struct Foo + bar + baz +end + +function do_something(x::Foo) + x +end + +phi = Foo(1, 2) +(phi,""" +settestdoc(doctext) +labels = [item.label for item in completion_test(0, length(doctext)).items] +println(labels) From 408fd231ee99830413ba89d586e9f7aeb4e6c488 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Wed, 11 Aug 2021 11:26:50 +0200 Subject: [PATCH 6/7] Test case for method completion --- test/requests/completions.jl | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/test/requests/completions.jl b/test/requests/completions.jl index 65da16f6..6d605c2b 100644 --- a/test/requests/completions.jl +++ b/test/requests/completions.jl @@ -11,16 +11,16 @@ completion_test(line, char) = LanguageServer.textDocument_completion_request(Lan """) @test completion_test(0, 9).items[1].textEdit.newText == "∴" @test completion_test(0, 9).items[1].textEdit.range == LanguageServer.Range(0, 0, 0, 9) - + @test completion_test(1, 10).items[1].textEdit.newText == "∴" @test completion_test(1, 10).items[1].textEdit.range == LanguageServer.Range(1, 1, 1, 10) - + @test completion_test(2, 10).items[1].textEdit.newText == "∴" @test completion_test(2, 10).items[1].textEdit.range == LanguageServer.Range(2, 1, 2, 10) - + @test completion_test(3, 10).items[1].textEdit.newText == "∴" @test completion_test(3, 10).items[1].textEdit.range == LanguageServer.Range(3, 1, 3, 10) - + @test completion_test(4, 12).items[1].textEdit.newText == "∴" @test completion_test(4, 12).items[1].textEdit.range == LanguageServer.Range(4, 3, 4, 12) @@ -37,7 +37,7 @@ end settestdoc("import ") @test all(item.label in ("Main", "Base", "Core") for item in completion_test(0, 7).items) - + settestdoc("""module M end import .""") @test_broken completion_test(1, 8).items[1].label == "M" @@ -66,7 +66,7 @@ end @test any(item.label == "quot" for item in completion_test(1, 10).items) settestdoc(""" - module M + module M inner = 1 end M. @@ -101,19 +101,19 @@ end settestdoc("@t") @test any(item.label == "@time" for item in completion_test(0, 2).items) - + settestdoc("i") @test any(item.label == "if" for item in completion_test(0, 1).items) - + settestdoc("i") @test any(item.label == "in" for item in completion_test(0, 1).items) - + settestdoc("for") @test any(item.label == "for" for item in completion_test(0, 3).items) settestdoc("in") @test any(item.label == "in" for item in completion_test(0, 2).items) - + settestdoc("isa") @test any(item.label == "isa" for item in completion_test(0, 3).items) end @@ -123,3 +123,9 @@ end myv""") @test any(item.label == "myvar" for item in completion_test(1, 3).items) end + +@testset "method completions" begin + settestdoc("""phi = 1 + (phi,""") + @test any(item.label == "Float64" for item in completion_test(0, 13).items) +end From 50c6b4c21e38c63b78282a2e60ed2d790d5cc015 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Wed, 11 Aug 2021 14:00:52 +0200 Subject: [PATCH 7/7] Rename variable, remove drafts --- draft/draft_method_complete.jl | 40 ---------- draft/draft_test_method_complete.jl | 118 ---------------------------- src/requests/completions.jl | 6 +- 3 files changed, 3 insertions(+), 161 deletions(-) delete mode 100644 draft/draft_method_complete.jl delete mode 100644 draft/draft_test_method_complete.jl diff --git a/draft/draft_method_complete.jl b/draft/draft_method_complete.jl deleted file mode 100644 index 67ad6240..00000000 --- a/draft/draft_method_complete.jl +++ /dev/null @@ -1,40 +0,0 @@ -using REPL - -# Test with or without arbitrary additional arguments -moreargs = true - -x = 3 - -teststr = "x,x,x,x,x" -callstr = "_(" * teststr * ")" -ex_org = Meta.parse(callstr, raise=false, depwarn=false) -res = REPL.REPLCompletions.complete_any_methods(ex_org, Main, Main, moreargs) - -# Reference directly from REPL -refstr = "?(" * teststr -if !moreargs - refstr *= ")" -end -ref = REPL.REPLCompletions.completions(refstr, length(refstr))[1] - -println(ref == res) - -struct Foo - bar - baz -end - -function do_something(x::Foo) - x -end - -phi = Foo(1, 2) -psi = Foo(2, 3) - -## -using CSTParser, StaticLint -expr = CSTParser.parse("""x=3 -x""") -println(StaticLint.parentof(expr)) - -x = 3 diff --git a/draft/draft_test_method_complete.jl b/draft/draft_test_method_complete.jl deleted file mode 100644 index ffcc8093..00000000 --- a/draft/draft_test_method_complete.jl +++ /dev/null @@ -1,118 +0,0 @@ -## Testing as in test/runtests.jl and test/requests/completions.jl -using Test, Sockets, LanguageServer, CSTParser, SymbolServer, SymbolServer.Pkg, StaticLint, LanguageServer.JSON, LanguageServer.JSONRPC -using LanguageServer: Document, get_text, get_offset, get_line_offsets, get_position_at, get_open_in_editor, set_open_in_editor, is_workspace_file, applytextdocumentchanges - -init_request = LanguageServer.InitializeParams( - 9902, - missing, - nothing, - nothing, - missing, - LanguageServer.ClientCapabilities( - LanguageServer.WorkspaceClientCapabilities( - true, - LanguageServer.WorkspaceEditClientCapabilities(true, missing, missing), - LanguageServer.DidChangeConfigurationClientCapabilities(false), - LanguageServer.DidChangeWatchedFilesClientCapabilities(false,), - LanguageServer.WorkspaceSymbolClientCapabilities(true, missing), - LanguageServer.ExecuteCommandClientCapabilities(true), - missing, - missing - ), - LanguageServer.TextDocumentClientCapabilities( - LanguageServer.TextDocumentSyncClientCapabilities(true, true, true, true), - LanguageServer.CompletionClientCapabilities(true, LanguageServer.CompletionItemClientCapabilities(true, missing, missing, missing, missing, missing), missing, missing), - LanguageServer.HoverClientCapabilities(true, missing), - LanguageServer.SignatureHelpClientCapabilities(true, missing, missing), - LanguageServer.DeclarationClientCapabilities(false, missing), - missing, # DefinitionClientCapabilities(), - missing, # TypeDefinitionClientCapabilities(), - missing, # ImplementationClientCapabilities(), - missing, # ReferenceClientCapabilities(), - LanguageServer.DocumentHighlightClientCapabilities(true), - LanguageServer.DocumentSymbolClientCapabilities(true, missing, missing), - LanguageServer.CodeActionClientCapabilities(true, missing, missing), - LanguageServer.CodeLensClientCapabilities(true), - missing, # DocumentLinkClientCapabilities(), - missing, # DocumentColorClientCapabilities(), - LanguageServer.DocumentFormattingClientCapabilities(true), - missing, # DocumentRangeFormattingClientCapabilities(), - missing, # DocumentOnTypeFormattingClientCapabilities(), - LanguageServer.RenameClientCapabilities(true, true), - missing, # PublishDiagnosticsClientCapabilities(), - missing, # FoldingRangeClientCapabilities(), - missing, # SelectionRangeClientCapabilities() - ), - missing, - missing - ), - "off", - missing, - missing -) - -server = LanguageServerInstance(IOBuffer(), IOBuffer(), dirname(Pkg.Types.Context().env.project_file), first(Base.DEPOT_PATH)) -server.runlinter = true -server.jr_endpoint = nothing -LanguageServer.initialize_request(init_request, server, nothing) - -JSONRPC.send(::Nothing, ::Any, ::Any) = nothing -function settestdoc(text) - empty!(server._documents) - LanguageServer.textDocument_didOpen_notification(LanguageServer.DidOpenTextDocumentParams(LanguageServer.TextDocumentItem("testdoc", "julia", 0, text)), server, nothing) - - doc = LanguageServer.getdocument(server, LanguageServer.URI2("testdoc")) - LanguageServer.parse_all(doc, server) - doc -end - -completion_test(line, char) = LanguageServer.textDocument_completion_request(LanguageServer.CompletionParams(LanguageServer.TextDocumentIdentifier("testdoc"), LanguageServer.Position(line, char), missing), server, server.jr_endpoint) - - -## A completion that is working -settestdoc("import Base: r") -labels = [item.label for item in completion_test(0, 14).items] - -## Another completion -settestdoc("using ") -labels = [item.label for item in completion_test(0, 6).items] - -## Another completion -settestdoc("me") -labels = [item.label for item in completion_test(0, 2).items] - -## Another completion -settestdoc("""phi = 1 - (phi,""") -labels = [item.label for item in completion_test(0, 13).items] -println(labels) - -## Another completion -doctext = """ -struct Foo - bar - baz -end - -phi = Foo(1, 2) -(phi,""" -settestdoc(doctext) -labels = [item.label for item in completion_test(0, length(doctext)).items] -println(labels) - -## Another completion -doctext = """ -struct Foo - bar - baz -end - -function do_something(x::Foo) - x -end - -phi = Foo(1, 2) -(phi,""" -settestdoc(doctext) -labels = [item.label for item in completion_test(0, length(doctext)).items] -println(labels) diff --git a/src/requests/completions.jl b/src/requests/completions.jl index 4a6f7b9c..e5b67599 100644 --- a/src/requests/completions.jl +++ b/src/requests/completions.jl @@ -583,7 +583,7 @@ function method_completion(x, state, xlen) state.range.stop.character - xlen - 2)), n) if siglen_max == 1 # need to close bracket right away - additionalEdits = [TextEdit(Range( + additional_edits = [TextEdit(Range( Position(state.range.start.line, state.range.start.character - 1), Position(state.range.stop.line, @@ -591,7 +591,7 @@ function method_completion(x, state, xlen) inplace_text = "" else inplace_text = " " - additionalEdits = [prefix_edit] + additional_edits = [prefix_edit] end inplace_edit = TextEdit(Range( @@ -601,7 +601,7 @@ function method_completion(x, state, xlen) item = CompletionItem(n, 2, missing, missing, n, missing, missing, missing, missing, missing, - InsertTextFormats.PlainText, inplace_edit, additionalEdits, + InsertTextFormats.PlainText, inplace_edit, additional_edits, missing, missing, missing) add_completion_item(state, item) end