From fdde6152d28a4ae313a295e9df4d35d74762cde6 Mon Sep 17 00:00:00 2001 From: navya9singh Date: Tue, 28 May 2024 10:03:53 -0700 Subject: [PATCH 1/4] handling statements better from a known source file --- src/services/pasteEdits.ts | 11 ++++++-- .../pasteEdits_blankTargetFile.js | 27 ++++++++++++++++--- .../server/pasteEdits_blankTargetFile.ts | 5 +++- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/services/pasteEdits.ts b/src/services/pasteEdits.ts index 0434cf7106fd9..50889b28efe76 100644 --- a/src/services/pasteEdits.ts +++ b/src/services/pasteEdits.ts @@ -1,4 +1,7 @@ -import { addRange } from "../compiler/core.js"; +import { + addRange, + findIndex, +} from "../compiler/core.js"; import { CancellationToken, Program, @@ -77,7 +80,11 @@ function pasteEdits( if (copiedFrom?.range) { Debug.assert(copiedFrom.range.length === pastedText.length); copiedFrom.range.forEach(copy => { - addRange(statements, copiedFrom.file.statements, getLineOfLocalPosition(copiedFrom.file, copy.pos), getLineOfLocalPosition(copiedFrom.file, copy.end) + 1); + const statementsInSourceFile = copiedFrom.file.statements; + const startNodeIndex = findIndex(statementsInSourceFile, s => s.end > copy.pos); + if (startNodeIndex === -1) return undefined; + const endNodeIndex = findIndex(statementsInSourceFile, s => s.end >= copy.end, startNodeIndex); + statements.push(...statementsInSourceFile.slice(startNodeIndex, endNodeIndex === -1 ? statementsInSourceFile.length : endNodeIndex + 1)); }); const usage = getUsageInfo(copiedFrom.file, statements, originalProgram!.getTypeChecker(), getExistingLocals(updatedFile, statements, originalProgram!.getTypeChecker())); Debug.assertIsDefined(originalProgram); diff --git a/tests/baselines/reference/tsserver/fourslashServer/pasteEdits_blankTargetFile.js b/tests/baselines/reference/tsserver/fourslashServer/pasteEdits_blankTargetFile.js index d363d15a81c1c..0106d61b9fda3 100644 --- a/tests/baselines/reference/tsserver/fourslashServer/pasteEdits_blankTargetFile.js +++ b/tests/baselines/reference/tsserver/fourslashServer/pasteEdits_blankTargetFile.js @@ -5,7 +5,9 @@ export const abc = 10; //// [/b.ts] import { abc } from "./a"; -console.log(abc); + +console.log(abc); + //// [/c.ts] @@ -69,7 +71,7 @@ Info seq [hh:mm:ss:mss] Files (6) /lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text /c.ts SVC-1-0 "" /a.ts Text-1 "export const abc = 10;" - /b.ts Text-1 "import { abc } from \"./a\";\nconsole.log(abc);" + /b.ts Text-1 "import { abc } from \"./a\";\n\nconsole.log(abc);\n" lib.d.ts @@ -221,7 +223,22 @@ Info seq [hh:mm:ss:mss] request: "offset": 1 } } - ] + ], + "copiedFrom": { + "file": "b.ts", + "spans": [ + { + "start": { + "line": 3, + "offset": 1 + }, + "end": { + "line": 3, + "offset": 18 + } + } + ] + } }, "command": "getPasteEdits" } @@ -234,9 +251,11 @@ Info seq [hh:mm:ss:mss] Files (6) /lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text /c.ts SVC-1-1 "console.log(abc);" /a.ts Text-1 "export const abc = 10;" - /b.ts Text-1 "import { abc } from \"./a\";\nconsole.log(abc);" + /b.ts Text-1 "import { abc } from \"./a\";\n\nconsole.log(abc);\n" Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] getExportInfoMap: cache miss or empty; calculating new results +Info seq [hh:mm:ss:mss] getExportInfoMap: done in * ms Info seq [hh:mm:ss:mss] response: { "seq": 0, diff --git a/tests/cases/fourslash/server/pasteEdits_blankTargetFile.ts b/tests/cases/fourslash/server/pasteEdits_blankTargetFile.ts index 7d12562a84643..08d1a2cc3ad3a 100644 --- a/tests/cases/fourslash/server/pasteEdits_blankTargetFile.ts +++ b/tests/cases/fourslash/server/pasteEdits_blankTargetFile.ts @@ -8,7 +8,9 @@ // @Filename: /b.ts //// import { abc } from "./a"; -//// console.log(abc); +//// +//// [|console.log(abc);|] +//// // @Filename: /tsconfig.json ////{ "files": ["c.ts", "a.ts", "b.ts"] } @@ -18,6 +20,7 @@ verify.pasteEdits({ args: { pastedText: [`console.log(abc);`], pasteLocations: [range[0]], + copiedFrom: { file: "b.ts", range: [range[1]] }, }, newFileContents: { "/c.ts": From c10205ac31dfc675bcf013f8ac183fba0fa36294 Mon Sep 17 00:00:00 2001 From: navya9singh Date: Tue, 28 May 2024 10:12:42 -0700 Subject: [PATCH 2/4] removing unused imports --- src/services/pasteEdits.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/services/pasteEdits.ts b/src/services/pasteEdits.ts index 50889b28efe76..435e263d335a8 100644 --- a/src/services/pasteEdits.ts +++ b/src/services/pasteEdits.ts @@ -1,5 +1,4 @@ import { - addRange, findIndex, } from "../compiler/core.js"; import { @@ -11,7 +10,6 @@ import { TextRange, UserPreferences, } from "../compiler/types.js"; -import { getLineOfLocalPosition } from "../compiler/utilities.js"; import { codefix, Debug, From 453c2eba7c7e80d925b67de78b5e2760cd3c0673 Mon Sep 17 00:00:00 2001 From: navya9singh Date: Tue, 28 May 2024 10:15:26 -0700 Subject: [PATCH 3/4] fixing formatting --- src/services/pasteEdits.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/services/pasteEdits.ts b/src/services/pasteEdits.ts index 435e263d335a8..205e56178ce5d 100644 --- a/src/services/pasteEdits.ts +++ b/src/services/pasteEdits.ts @@ -1,6 +1,4 @@ -import { - findIndex, -} from "../compiler/core.js"; +import { findIndex } from "../compiler/core.js"; import { CancellationToken, Program, From 79597f73197d6c9b677179f12f86c8992f2027df Mon Sep 17 00:00:00 2001 From: navya9singh Date: Tue, 28 May 2024 13:18:05 -0700 Subject: [PATCH 4/4] fixing edge case --- src/services/pasteEdits.ts | 10 +++++++++- .../fourslashServer/pasteEdits_blankTargetFile.js | 12 +++++++----- .../fourslash/server/pasteEdits_blankTargetFile.ts | 6 ++++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/services/pasteEdits.ts b/src/services/pasteEdits.ts index 205e56178ce5d..9b67d62e96576 100644 --- a/src/services/pasteEdits.ts +++ b/src/services/pasteEdits.ts @@ -79,7 +79,15 @@ function pasteEdits( const statementsInSourceFile = copiedFrom.file.statements; const startNodeIndex = findIndex(statementsInSourceFile, s => s.end > copy.pos); if (startNodeIndex === -1) return undefined; - const endNodeIndex = findIndex(statementsInSourceFile, s => s.end >= copy.end, startNodeIndex); + let endNodeIndex = findIndex(statementsInSourceFile, s => s.end >= copy.end, startNodeIndex); + /** + * [|console.log(a); + * |] + * console.log(b); + */ + if (endNodeIndex !== -1 && copy.end <= statementsInSourceFile[endNodeIndex].getStart()) { + endNodeIndex--; + } statements.push(...statementsInSourceFile.slice(startNodeIndex, endNodeIndex === -1 ? statementsInSourceFile.length : endNodeIndex + 1)); }); const usage = getUsageInfo(copiedFrom.file, statements, originalProgram!.getTypeChecker(), getExistingLocals(updatedFile, statements, originalProgram!.getTypeChecker())); diff --git a/tests/baselines/reference/tsserver/fourslashServer/pasteEdits_blankTargetFile.js b/tests/baselines/reference/tsserver/fourslashServer/pasteEdits_blankTargetFile.js index 0106d61b9fda3..1fb90bbc74897 100644 --- a/tests/baselines/reference/tsserver/fourslashServer/pasteEdits_blankTargetFile.js +++ b/tests/baselines/reference/tsserver/fourslashServer/pasteEdits_blankTargetFile.js @@ -7,7 +7,9 @@ export const abc = 10; import { abc } from "./a"; console.log(abc); - + + +console.log("abc"); //// [/c.ts] @@ -71,7 +73,7 @@ Info seq [hh:mm:ss:mss] Files (6) /lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text /c.ts SVC-1-0 "" /a.ts Text-1 "export const abc = 10;" - /b.ts Text-1 "import { abc } from \"./a\";\n\nconsole.log(abc);\n" + /b.ts Text-1 "import { abc } from \"./a\";\n\nconsole.log(abc);\n\n\nconsole.log(\"abc\");" lib.d.ts @@ -233,8 +235,8 @@ Info seq [hh:mm:ss:mss] request: "offset": 1 }, "end": { - "line": 3, - "offset": 18 + "line": 5, + "offset": 1 } } ] @@ -251,7 +253,7 @@ Info seq [hh:mm:ss:mss] Files (6) /lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text /c.ts SVC-1-1 "console.log(abc);" /a.ts Text-1 "export const abc = 10;" - /b.ts Text-1 "import { abc } from \"./a\";\n\nconsole.log(abc);\n" + /b.ts Text-1 "import { abc } from \"./a\";\n\nconsole.log(abc);\n\n\nconsole.log(\"abc\");" Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] getExportInfoMap: cache miss or empty; calculating new results diff --git a/tests/cases/fourslash/server/pasteEdits_blankTargetFile.ts b/tests/cases/fourslash/server/pasteEdits_blankTargetFile.ts index 08d1a2cc3ad3a..d4fd49c285960 100644 --- a/tests/cases/fourslash/server/pasteEdits_blankTargetFile.ts +++ b/tests/cases/fourslash/server/pasteEdits_blankTargetFile.ts @@ -9,8 +9,10 @@ // @Filename: /b.ts //// import { abc } from "./a"; //// -//// [|console.log(abc);|] -//// +//// [|console.log(abc); +//// +//// |] +//// console.log("abc"); // @Filename: /tsconfig.json ////{ "files": ["c.ts", "a.ts", "b.ts"] }