Skip to content

Commit

Permalink
fix(lsp): ensure insert_text is passed back on completions
Browse files Browse the repository at this point in the history
  • Loading branch information
kitsonk committed Apr 1, 2021
1 parent fec1b2a commit 1737d58
Show file tree
Hide file tree
Showing 6 changed files with 165 additions and 2 deletions.
50 changes: 50 additions & 0 deletions cli/dts/config.d.ts
@@ -0,0 +1,50 @@
interface DenoCompilerOptions {
//
}

interface DenoPermissions {
/** Allow all permissions. */
all?: boolean;
/** Allow environment access. */
env?: boolean;
/** Allow high resolution time measurement. */
hrtime?: boolean;
/** Allow network access. If an array of strings, only those hosts specified
* will be allowed access to
*/
net?: boolean | string[];
plugin?: boolean;
read?: boolean | string[];
write?: boolean | string[];
}

interface DenoSettings {
cachedOnly?: boolean;
cert?: string;
noCheck?: boolean;
noRemote?: boolean;
location?: string;
lock?: string;
logLevel?: "debug" | "info";
quiet?: boolean;
tsconfig?: string;
unstable?: boolean;
v8Flags?: string[];
watch?: boolean;
}

interface DenoInspector {
host?: string;
port?: number;
breakOnStart?: boolean;
}

interface DenoConfiguration {
allow?: DenoPermissions;
compilerOptions?: DenoCompilerOptions;
imports?: Record<string, string>;
inspector?: boolean | DenoInspector;
root?: string;
scopes?: Record<string, Record<string, string>>;
settings?: DenoSettings;
}
62 changes: 62 additions & 0 deletions cli/lsp/language_server.rs
Expand Up @@ -3025,6 +3025,68 @@ mod tests {
harness.run().await;
}

#[tokio::test]
async fn test_completions_optional() {
let mut harness = LspTestHarness::new(vec![
("initialize_request.json", LspResponse::RequestAny),
("initialized_notification.json", LspResponse::None),
(
"did_open_notification_completion_optional.json",
LspResponse::None,
),
(
"completion_request_optional.json",
LspResponse::Request(
2,
json!({
"isIncomplete": false,
"items": [
{
"label": "b?",
"kind": 5,
"sortText": "1",
"filterText": "b",
"insertText": "b",
"data": {
"tsc": {
"specifier": "file:///a/file.ts",
"position": 79,
"name": "b",
"useCodeSnippet": false
}
}
}
]
}),
),
),
(
"completion_resolve_request_optional.json",
LspResponse::Request(
4,
json!({
"label": "b?",
"kind": 5,
"detail": "(property) A.b?: string | undefined",
"documentation": {
"kind": "markdown",
"value": ""
},
"sortText": "1",
"filterText": "b",
"insertText": "b"
}),
),
),
(
"shutdown_request.json",
LspResponse::Request(3, json!(null)),
),
("exit_notification.json", LspResponse::None),
]);
harness.run().await;
}

#[derive(Deserialize)]
struct PerformanceAverages {
averages: Vec<PerformanceAverage>,
Expand Down
5 changes: 3 additions & 2 deletions cli/lsp/tsc.rs
Expand Up @@ -1188,10 +1188,10 @@ impl CompletionEntry {
}

let text_edit =
if let (Some(text_span), Some(new_text)) = (range, insert_text) {
if let (Some(text_span), Some(new_text)) = (range, &insert_text) {
let range = text_span.to_range(line_index);
let insert_replace_edit = lsp::InsertReplaceEdit {
new_text,
new_text: new_text.clone(),
insert: range,
replace: range,
};
Expand All @@ -1216,6 +1216,7 @@ impl CompletionEntry {
preselect,
text_edit,
filter_text,
insert_text,
detail,
tags,
data: Some(json!({
Expand Down
18 changes: 18 additions & 0 deletions cli/tests/lsp/completion_request_optional.json
@@ -0,0 +1,18 @@
{
"jsonrpc": "2.0",
"id": 2,
"method": "textDocument/completion",
"params": {
"textDocument": {
"uri": "file:///a/file.ts"
},
"position": {
"line": 8,
"character": 4
},
"context": {
"triggerKind": 2,
"triggerCharacter": "."
}
}
}
20 changes: 20 additions & 0 deletions cli/tests/lsp/completion_resolve_request_optional.json
@@ -0,0 +1,20 @@
{
"jsonrpc": "2.0",
"id": 4,
"method": "completionItem/resolve",
"params": {
"label": "b?",
"kind": 5,
"sortText": "1",
"filterText": "b",
"insertText": "b",
"data": {
"tsc": {
"specifier": "file:///a/file.ts",
"position": 79,
"name": "b",
"useCodeSnippet": false
}
}
}
}
12 changes: 12 additions & 0 deletions cli/tests/lsp/did_open_notification_completion_optional.json
@@ -0,0 +1,12 @@
{
"jsonrpc": "2.0",
"method": "textDocument/didOpen",
"params": {
"textDocument": {
"uri": "file:///a/file.ts",
"languageId": "typescript",
"version": 1,
"text": "interface A {\n b?: string;\n}\n\nconst o: A = {};\n\nfunction c(s: string) {}\n\nc(o.)"
}
}
}

0 comments on commit 1737d58

Please sign in to comment.