Description
Feature request
When copy and pasting code between two TS/JS files, we should support adding the required imports on paste. For example, with the following code:
import fs from 'fs';
import http from 'http';
http.createServer((req, res) => {
const data = fs.readFileSync('bla');
res.write(data);
res.end()
})
If I copy fs.readFileSync('bla')
and paste it into a new file, an import for fs
should also be added to the top of that file:
TS Server Protocol changes
VS Code is actively working on an API that lets extensions hook into copy and paste: microsoft/vscode#30066
Using this api, here's what I imagine the flow between VS Code and TS server would look like:
-
User copies code
-
VS Code tells TS Server about the copied range
-
TS Server goes and writes whatever state it needs to re-create the imports. This state needs to be JSON serializable (so that TS Server can send it to VS Code). Just as an example, this could be something like (note! just for demonstration purposes, not intended to be what this actually looks like):
{ "referencedSymbols": [ {"name": "default", "from": "node:fs"}, {"name": "mySymbol", "from": "/full/path/to/file"} ] }
-
TS Server returns this state to the VS Code extension which attaches it to the copied text (this can happen asynchronously)
-
The user now pastes the code in another file
-
VS Code sends TS Server a request with the following:
- The paste location
- The saved off state from step 3 / 4 (note that we may actually have to await this data if the server was slow to return here
-
TS Server returns a text edit that adds the imports to the file