From 43fa44887c2c48be326334b9dea403b6199a2ea5 Mon Sep 17 00:00:00 2001 From: Karl Kraus Date: Thu, 2 Feb 2023 17:04:01 +0100 Subject: [PATCH 1/4] add failing test --- src/testRunner/tests.ts | 1 + .../tsserver/completionsJsxExpression.ts | 60 ++ .../should-not-complete-as-jsx-attribute.js | 552 ++++++++++++++++++ 3 files changed, 613 insertions(+) create mode 100644 src/testRunner/unittests/tsserver/completionsJsxExpression.ts create mode 100644 tests/baselines/reference/tsserver/completionsJsxExpression/should-not-complete-as-jsx-attribute.js diff --git a/src/testRunner/tests.ts b/src/testRunner/tests.ts index b177391f8ce95..41243b2df39bc 100644 --- a/src/testRunner/tests.ts +++ b/src/testRunner/tests.ts @@ -129,6 +129,7 @@ import "./unittests/tsserver/cancellationToken"; import "./unittests/tsserver/compileOnSave"; import "./unittests/tsserver/completions"; import "./unittests/tsserver/completionsIncomplete"; +import "./unittests/tsserver/completionsJsxExpression"; import "./unittests/tsserver/configFileSearch"; import "./unittests/tsserver/configuredProjects"; import "./unittests/tsserver/declarationFileMaps"; diff --git a/src/testRunner/unittests/tsserver/completionsJsxExpression.ts b/src/testRunner/unittests/tsserver/completionsJsxExpression.ts new file mode 100644 index 0000000000000..90bdb67a44d88 --- /dev/null +++ b/src/testRunner/unittests/tsserver/completionsJsxExpression.ts @@ -0,0 +1,60 @@ +import * as ts from "../../_namespaces/ts"; +import { + createServerHost, +} from "../virtualFileSystemWithWatch"; +import { + baselineTsserverLogs, + createLoggerWithInMemoryLogs, + createSession, +} from "./helpers"; + +describe("unittests:: tsserver:: completionsJsxExpression", () => { + it("should not error", () => { + const host = createServerHost([]); + const session = createSession(host, { + canUseEvents: true, + noGetErrOnBackgroundUpdate: true, + logger: createLoggerWithInMemoryLogs(host), + }); + session.executeCommandSeq({ + command: ts.server.protocol.CommandTypes.Configure, + arguments: { + preferences: { + jsxAttributeCompletionStyle: "auto", + includeCompletionsWithSnippetText: true, + } + } + }); + session.executeCommandSeq({ + command: ts.server.protocol.CommandTypes.UpdateOpen, + arguments: { + changedFiles: [], + closedFiles: [], + openFiles: [ + { + file: "^/untitled/ts-nul-authority/Untitled-1", + fileContent: `interface IntrinsicElements { div: { foo?: number } }\n
`, + scriptKindName: "TSX" + } + ] + } + }); + const completion = session.executeCommandSeq({ + command: ts.server.protocol.CommandTypes.CompletionInfo, + arguments: { + file: "^/untitled/ts-nul-authority/Untitled-1", + line: 2, + offset: 19, + includeInsertTextCompletions: true, + } + }).response as ts.server.protocol.CompletionInfo | undefined; + baselineTsserverLogs("completionsJsxExpression", "should not complete as jsx attribute", session); + ts.Debug.assertIsDefined(completion) + for (const entry of completion.entries) { + ts.Debug.assert(!entry.isSnippet) + if (entry.insertText) { + ts.Debug.assert(!entry.insertText.includes("=")) + } + } + }); +}); \ No newline at end of file diff --git a/tests/baselines/reference/tsserver/completionsJsxExpression/should-not-complete-as-jsx-attribute.js b/tests/baselines/reference/tsserver/completionsJsxExpression/should-not-complete-as-jsx-attribute.js new file mode 100644 index 0000000000000..1d9d98f5a67de --- /dev/null +++ b/tests/baselines/reference/tsserver/completionsJsxExpression/should-not-complete-as-jsx-attribute.js @@ -0,0 +1,552 @@ +Info 0 [00:00:02.000] Provided types map file "/a/lib/typesMap.json" doesn't exist +Info 1 [00:00:03.000] request: + { + "command": "configure", + "arguments": { + "preferences": { + "jsxAttributeCompletionStyle": "auto", + "includeCompletionsWithSnippetText": true + } + }, + "seq": 1, + "type": "request" + } +Before request + +PolledWatches:: + +FsWatches:: + +FsWatchesRecursive:: + +Info 2 [00:00:04.000] response: + {"seq":0,"type":"response","command":"configure","request_seq":1,"success":true} +After request + +PolledWatches:: + +FsWatches:: + +FsWatchesRecursive:: + +Info 3 [00:00:05.000] response: + { + "responseRequired": false + } +Info 4 [00:00:06.000] request: + { + "command": "updateOpen", + "arguments": { + "changedFiles": [], + "closedFiles": [], + "openFiles": [ + { + "file": "^/untitled/ts-nul-authority/Untitled-1", + "fileContent": "interface IntrinsicElements { div: { foo?: number } }\n
", + "scriptKindName": "TSX" + } + ] + }, + "seq": 2, + "type": "request" + } +Before request + +PolledWatches:: + +FsWatches:: + +FsWatchesRecursive:: + +Info 5 [00:00:07.000] Search path: ^/untitled/ts-nul-authority +Info 6 [00:00:08.000] For info: ^/untitled/ts-nul-authority/Untitled-1 :: No config files found. +Info 7 [00:00:09.000] Starting updateGraphWorker: Project: /dev/null/inferredProject1* +Info 8 [00:00:10.000] FileWatcher:: Added:: WatchInfo: /a/lib/lib.d.ts 500 undefined Project: /dev/null/inferredProject1* WatchType: Missing file +Info 9 [00:00:11.000] Finishing updateGraphWorker: Project: /dev/null/inferredProject1* Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms +Info 10 [00:00:12.000] Project '/dev/null/inferredProject1*' (Inferred) +Info 11 [00:00:13.000] Files (1) + ^/untitled/ts-nul-authority/Untitled-1 + + + ^/untitled/ts-nul-authority/Untitled-1 + Root file specified for compilation + +Info 12 [00:00:14.000] ----------------------------------------------- +Info 13 [00:00:15.000] Project '/dev/null/inferredProject1*' (Inferred) +Info 13 [00:00:16.000] Files (1) + +Info 13 [00:00:17.000] ----------------------------------------------- +Info 13 [00:00:18.000] Open files: +Info 13 [00:00:19.000] FileName: ^/untitled/ts-nul-authority/Untitled-1 ProjectRootPath: undefined +Info 13 [00:00:20.000] Projects: /dev/null/inferredProject1* +After request + +PolledWatches:: +/a/lib/lib.d.ts: + {"pollingInterval":500} + +FsWatches:: + +FsWatchesRecursive:: + +Info 13 [00:00:21.000] response: + { + "response": true, + "responseRequired": true + } +Info 14 [00:00:22.000] request: + { + "command": "completionInfo", + "arguments": { + "file": "^/untitled/ts-nul-authority/Untitled-1", + "line": 2, + "offset": 19, + "includeInsertTextCompletions": true + }, + "seq": 3, + "type": "request" + } +Before request + +PolledWatches:: +/a/lib/lib.d.ts: + {"pollingInterval":500} + +FsWatches:: + +FsWatchesRecursive:: + +Info 15 [00:00:23.000] getCompletionData: Get current token: * +Info 16 [00:00:24.000] getCompletionData: Is inside comment: * +Info 17 [00:00:25.000] getCompletionData: Get previous token: * +Info 18 [00:00:26.000] getCompletionsAtPosition: isCompletionListBlocker: * +Info 19 [00:00:27.000] getCompletionData: Semantic work: * +Info 20 [00:00:28.000] getCompletionsAtPosition: getCompletionEntriesFromSymbols: * +After request + +PolledWatches:: +/a/lib/lib.d.ts: + {"pollingInterval":500} + +FsWatches:: + +FsWatchesRecursive:: + +Info 21 [00:00:29.000] response: + { + "response": { + "flags": 0, + "isGlobalCompletion": true, + "isMemberCompletion": false, + "isNewIdentifierLocation": false, + "optionalReplacementSpan": { + "start": { + "line": 2, + "offset": 11 + }, + "end": { + "line": 2, + "offset": 19 + } + }, + "entries": [ + { + "name": "abstract", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "any", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "as", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "asserts", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "async", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "await", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "bigint", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "boolean", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "break", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "case", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "catch", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "class", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "const", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "continue", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "debugger", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "declare", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "default", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "delete", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "do", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "else", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "enum", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "export", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "extends", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "false", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "finally", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "for", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "function", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "globalThis", + "kind": "module", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "if", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "implements", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "import", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "in", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "infer", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "instanceof", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "interface", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "keyof", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "let", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "module", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "namespace", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "never", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "new", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "null", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "number", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "object", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "package", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "readonly", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "return", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "satisfies", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "string", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "super", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "switch", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "symbol", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "this", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "throw", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "true", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "try", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "type", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "typeof", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "undefined", + "kind": "var", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "unique", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "unknown", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "var", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "void", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "while", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "with", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + }, + { + "name": "yield", + "kind": "keyword", + "kindModifiers": "", + "sortText": "15" + } + ] + }, + "responseRequired": true + } \ No newline at end of file From 64acceaf8a8dba1f59939c7445d83cdbc5120dc6 Mon Sep 17 00:00:00 2001 From: Karl Kraus Date: Thu, 2 Feb 2023 17:05:03 +0100 Subject: [PATCH 2/4] Fix completion entry for identifier in JsxExpression --- src/services/completions.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 4193e651a037f..f8cd16953ef29 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -2898,7 +2898,8 @@ function getCompletionData( // First case is for `
` or `
`, // `parent` will be `{true}` and `previousToken` will be `}` // Second case is for `
` - if (previousToken.kind === SyntaxKind.CloseBraceToken || (previousToken.kind === SyntaxKind.Identifier || previousToken.parent.kind === SyntaxKind.JsxAttribute)) { + // Second case must not match for `
` + if (previousToken.kind === SyntaxKind.CloseBraceToken || (previousToken.kind === SyntaxKind.Identifier && previousToken.parent.kind === SyntaxKind.JsxAttribute)) { isJsxIdentifierExpected = true; } break; From 40faef909d284017499751f35819d2700234a873 Mon Sep 17 00:00:00 2001 From: Karl Kraus Date: Thu, 2 Feb 2023 17:20:01 +0100 Subject: [PATCH 3/4] fix lint --- .../unittests/tsserver/completionsJsxExpression.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/testRunner/unittests/tsserver/completionsJsxExpression.ts b/src/testRunner/unittests/tsserver/completionsJsxExpression.ts index 90bdb67a44d88..5e90ccb18e408 100644 --- a/src/testRunner/unittests/tsserver/completionsJsxExpression.ts +++ b/src/testRunner/unittests/tsserver/completionsJsxExpression.ts @@ -49,11 +49,11 @@ describe("unittests:: tsserver:: completionsJsxExpression", () => { } }).response as ts.server.protocol.CompletionInfo | undefined; baselineTsserverLogs("completionsJsxExpression", "should not complete as jsx attribute", session); - ts.Debug.assertIsDefined(completion) + ts.Debug.assertIsDefined(completion); for (const entry of completion.entries) { - ts.Debug.assert(!entry.isSnippet) + ts.Debug.assert(!entry.isSnippet); if (entry.insertText) { - ts.Debug.assert(!entry.insertText.includes("=")) + ts.Debug.assert(!entry.insertText.includes("=")); } } }); From 6fe126eef2ce9e3ff4aad2fd38898bd1d7bf7134 Mon Sep 17 00:00:00 2001 From: Gabriela Araujo Britto Date: Fri, 3 Feb 2023 16:06:25 -0800 Subject: [PATCH 4/4] add fourslash test, remove unit test --- src/testRunner/tests.ts | 3 +- .../tsserver/completionsJsxExpression.ts | 60 -- .../should-not-complete-as-jsx-attribute.js | 552 ------------------ .../fourslash/completionsJsxExpression.ts | 30 + 4 files changed, 31 insertions(+), 614 deletions(-) delete mode 100644 src/testRunner/unittests/tsserver/completionsJsxExpression.ts delete mode 100644 tests/baselines/reference/tsserver/completionsJsxExpression/should-not-complete-as-jsx-attribute.js create mode 100644 tests/cases/fourslash/completionsJsxExpression.ts diff --git a/src/testRunner/tests.ts b/src/testRunner/tests.ts index 41243b2df39bc..01f8bd7465b15 100644 --- a/src/testRunner/tests.ts +++ b/src/testRunner/tests.ts @@ -129,7 +129,6 @@ import "./unittests/tsserver/cancellationToken"; import "./unittests/tsserver/compileOnSave"; import "./unittests/tsserver/completions"; import "./unittests/tsserver/completionsIncomplete"; -import "./unittests/tsserver/completionsJsxExpression"; import "./unittests/tsserver/configFileSearch"; import "./unittests/tsserver/configuredProjects"; import "./unittests/tsserver/declarationFileMaps"; @@ -191,4 +190,4 @@ import "./unittests/tsserver/typingsInstaller"; import "./unittests/tsserver/versionCache"; import "./unittests/tsserver/watchEnvironment"; import "./unittests/debugDeprecation"; -import "./unittests/tsserver/inconsistentErrorInEditor"; \ No newline at end of file +import "./unittests/tsserver/inconsistentErrorInEditor"; diff --git a/src/testRunner/unittests/tsserver/completionsJsxExpression.ts b/src/testRunner/unittests/tsserver/completionsJsxExpression.ts deleted file mode 100644 index 5e90ccb18e408..0000000000000 --- a/src/testRunner/unittests/tsserver/completionsJsxExpression.ts +++ /dev/null @@ -1,60 +0,0 @@ -import * as ts from "../../_namespaces/ts"; -import { - createServerHost, -} from "../virtualFileSystemWithWatch"; -import { - baselineTsserverLogs, - createLoggerWithInMemoryLogs, - createSession, -} from "./helpers"; - -describe("unittests:: tsserver:: completionsJsxExpression", () => { - it("should not error", () => { - const host = createServerHost([]); - const session = createSession(host, { - canUseEvents: true, - noGetErrOnBackgroundUpdate: true, - logger: createLoggerWithInMemoryLogs(host), - }); - session.executeCommandSeq({ - command: ts.server.protocol.CommandTypes.Configure, - arguments: { - preferences: { - jsxAttributeCompletionStyle: "auto", - includeCompletionsWithSnippetText: true, - } - } - }); - session.executeCommandSeq({ - command: ts.server.protocol.CommandTypes.UpdateOpen, - arguments: { - changedFiles: [], - closedFiles: [], - openFiles: [ - { - file: "^/untitled/ts-nul-authority/Untitled-1", - fileContent: `interface IntrinsicElements { div: { foo?: number } }\n
`, - scriptKindName: "TSX" - } - ] - } - }); - const completion = session.executeCommandSeq({ - command: ts.server.protocol.CommandTypes.CompletionInfo, - arguments: { - file: "^/untitled/ts-nul-authority/Untitled-1", - line: 2, - offset: 19, - includeInsertTextCompletions: true, - } - }).response as ts.server.protocol.CompletionInfo | undefined; - baselineTsserverLogs("completionsJsxExpression", "should not complete as jsx attribute", session); - ts.Debug.assertIsDefined(completion); - for (const entry of completion.entries) { - ts.Debug.assert(!entry.isSnippet); - if (entry.insertText) { - ts.Debug.assert(!entry.insertText.includes("=")); - } - } - }); -}); \ No newline at end of file diff --git a/tests/baselines/reference/tsserver/completionsJsxExpression/should-not-complete-as-jsx-attribute.js b/tests/baselines/reference/tsserver/completionsJsxExpression/should-not-complete-as-jsx-attribute.js deleted file mode 100644 index 1d9d98f5a67de..0000000000000 --- a/tests/baselines/reference/tsserver/completionsJsxExpression/should-not-complete-as-jsx-attribute.js +++ /dev/null @@ -1,552 +0,0 @@ -Info 0 [00:00:02.000] Provided types map file "/a/lib/typesMap.json" doesn't exist -Info 1 [00:00:03.000] request: - { - "command": "configure", - "arguments": { - "preferences": { - "jsxAttributeCompletionStyle": "auto", - "includeCompletionsWithSnippetText": true - } - }, - "seq": 1, - "type": "request" - } -Before request - -PolledWatches:: - -FsWatches:: - -FsWatchesRecursive:: - -Info 2 [00:00:04.000] response: - {"seq":0,"type":"response","command":"configure","request_seq":1,"success":true} -After request - -PolledWatches:: - -FsWatches:: - -FsWatchesRecursive:: - -Info 3 [00:00:05.000] response: - { - "responseRequired": false - } -Info 4 [00:00:06.000] request: - { - "command": "updateOpen", - "arguments": { - "changedFiles": [], - "closedFiles": [], - "openFiles": [ - { - "file": "^/untitled/ts-nul-authority/Untitled-1", - "fileContent": "interface IntrinsicElements { div: { foo?: number } }\n
", - "scriptKindName": "TSX" - } - ] - }, - "seq": 2, - "type": "request" - } -Before request - -PolledWatches:: - -FsWatches:: - -FsWatchesRecursive:: - -Info 5 [00:00:07.000] Search path: ^/untitled/ts-nul-authority -Info 6 [00:00:08.000] For info: ^/untitled/ts-nul-authority/Untitled-1 :: No config files found. -Info 7 [00:00:09.000] Starting updateGraphWorker: Project: /dev/null/inferredProject1* -Info 8 [00:00:10.000] FileWatcher:: Added:: WatchInfo: /a/lib/lib.d.ts 500 undefined Project: /dev/null/inferredProject1* WatchType: Missing file -Info 9 [00:00:11.000] Finishing updateGraphWorker: Project: /dev/null/inferredProject1* Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms -Info 10 [00:00:12.000] Project '/dev/null/inferredProject1*' (Inferred) -Info 11 [00:00:13.000] Files (1) - ^/untitled/ts-nul-authority/Untitled-1 - - - ^/untitled/ts-nul-authority/Untitled-1 - Root file specified for compilation - -Info 12 [00:00:14.000] ----------------------------------------------- -Info 13 [00:00:15.000] Project '/dev/null/inferredProject1*' (Inferred) -Info 13 [00:00:16.000] Files (1) - -Info 13 [00:00:17.000] ----------------------------------------------- -Info 13 [00:00:18.000] Open files: -Info 13 [00:00:19.000] FileName: ^/untitled/ts-nul-authority/Untitled-1 ProjectRootPath: undefined -Info 13 [00:00:20.000] Projects: /dev/null/inferredProject1* -After request - -PolledWatches:: -/a/lib/lib.d.ts: - {"pollingInterval":500} - -FsWatches:: - -FsWatchesRecursive:: - -Info 13 [00:00:21.000] response: - { - "response": true, - "responseRequired": true - } -Info 14 [00:00:22.000] request: - { - "command": "completionInfo", - "arguments": { - "file": "^/untitled/ts-nul-authority/Untitled-1", - "line": 2, - "offset": 19, - "includeInsertTextCompletions": true - }, - "seq": 3, - "type": "request" - } -Before request - -PolledWatches:: -/a/lib/lib.d.ts: - {"pollingInterval":500} - -FsWatches:: - -FsWatchesRecursive:: - -Info 15 [00:00:23.000] getCompletionData: Get current token: * -Info 16 [00:00:24.000] getCompletionData: Is inside comment: * -Info 17 [00:00:25.000] getCompletionData: Get previous token: * -Info 18 [00:00:26.000] getCompletionsAtPosition: isCompletionListBlocker: * -Info 19 [00:00:27.000] getCompletionData: Semantic work: * -Info 20 [00:00:28.000] getCompletionsAtPosition: getCompletionEntriesFromSymbols: * -After request - -PolledWatches:: -/a/lib/lib.d.ts: - {"pollingInterval":500} - -FsWatches:: - -FsWatchesRecursive:: - -Info 21 [00:00:29.000] response: - { - "response": { - "flags": 0, - "isGlobalCompletion": true, - "isMemberCompletion": false, - "isNewIdentifierLocation": false, - "optionalReplacementSpan": { - "start": { - "line": 2, - "offset": 11 - }, - "end": { - "line": 2, - "offset": 19 - } - }, - "entries": [ - { - "name": "abstract", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "any", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "as", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "asserts", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "async", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "await", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "bigint", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "boolean", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "break", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "case", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "catch", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "class", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "const", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "continue", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "debugger", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "declare", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "default", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "delete", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "do", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "else", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "enum", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "export", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "extends", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "false", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "finally", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "for", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "function", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "globalThis", - "kind": "module", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "if", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "implements", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "import", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "in", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "infer", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "instanceof", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "interface", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "keyof", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "let", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "module", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "namespace", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "never", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "new", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "null", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "number", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "object", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "package", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "readonly", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "return", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "satisfies", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "string", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "super", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "switch", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "symbol", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "this", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "throw", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "true", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "try", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "type", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "typeof", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "undefined", - "kind": "var", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "unique", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "unknown", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "var", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "void", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "while", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "with", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - }, - { - "name": "yield", - "kind": "keyword", - "kindModifiers": "", - "sortText": "15" - } - ] - }, - "responseRequired": true - } \ No newline at end of file diff --git a/tests/cases/fourslash/completionsJsxExpression.ts b/tests/cases/fourslash/completionsJsxExpression.ts new file mode 100644 index 0000000000000..b21e0d08c37b9 --- /dev/null +++ b/tests/cases/fourslash/completionsJsxExpression.ts @@ -0,0 +1,30 @@ +/// + +// @Filename: /a.tsx +// @jsx: react +//// declare namespace JSX { +//// interface IntrinsicElements { +//// div: { a: string, b: string } +//// } +//// } +//// const value = "test"; +////
+ +verify.completions( + { + marker: "", + isNewIdentifierLocation: false, + preferences: { + includeCompletionsWithSnippetText: true, + includeCompletionsWithInsertText: true, + jsxAttributeCompletionStyle: "auto", + }, + includes: { + name: "value", + kind: "const", + kindModifiers: "", + sortText: completion.SortText.LocationPriority, + insertText: undefined, + }, + }, +); \ No newline at end of file