Skip to content

Commit d650041

Browse files
committed
feat: ✨ establish communication between VS Code extension and language server
1 parent 5f8dbfc commit d650041

File tree

8 files changed

+112
-10
lines changed

8 files changed

+112
-10
lines changed

.vscode/launch.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@
1616
],
1717
"outFiles": ["${workspaceFolder}/extensions/vscode/dist/*.js"],
1818
"sourceMaps": true
19+
},
20+
{
21+
"name": "Attach to Server",
22+
"type": "node",
23+
"request": "attach",
24+
"port": 6009,
25+
"restart": true,
26+
"outFiles": ["${workspaceRoot}/*/*/dist/**/*.js"],
27+
"skipFiles": ["<node_internals>/**"]
1928
}
2029
]
2130
}

bun.lock

Lines changed: 15 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extensions/vscode/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"reactive-vscode": "^0.3.0"
3636
},
3737
"scripts": {
38-
"build": "tsdown"
38+
"build": "tsdown",
39+
"link-server": "mkdir node_modules/@valype && ln -s ../../../../language-tools/language-server node_modules/@valype/language-server"
3940
}
4041
}

extensions/vscode/src/extension.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createLabsInfo } from '@volar/vscode'
1+
import { createLabsInfo, getTsdk } from '@volar/vscode'
22
import {
33
defineExtension,
44
onDeactivate,
@@ -16,14 +16,18 @@ import * as serverProtocol from '@volar/language-server/protocol'
1616

1717
let client: BaseLanguageClient
1818

19+
interface InitializationOptions {
20+
tsdk?: string
21+
}
22+
1923
const LANGUAGE_SERVER_NAME = 'Valype Language Server'
2024
export const { activate, deactivate } = defineExtension(async (context) => {
2125
const serverModule = Uri.joinPath(
2226
context.extensionUri,
2327
'node_modules',
2428
'@valype/language-server',
2529
'dist',
26-
'server.js',
30+
'index.js',
2731
)
2832

2933
const serverOptions: ServerOptions = {
@@ -39,9 +43,15 @@ export const { activate, deactivate } = defineExtension(async (context) => {
3943
},
4044
}
4145

46+
const tsdk = (await getTsdk(context))?.tsdk
47+
48+
console.log(`tsdk ==>`, tsdk)
49+
4250
const clientOptions: LanguageClientOptions = {
4351
documentSelector: [{ language: 'valype' }],
44-
initializationOptions: {},
52+
initializationOptions: {
53+
tsdk,
54+
} satisfies InitializationOptions,
4555
outputChannel: useOutputChannel(LANGUAGE_SERVER_NAME),
4656
}
4757

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/usr/bin/env node
2+
import { readFileSync } from 'fs'
3+
import { fileURLToPath } from 'url'
4+
import { dirname, join } from 'path'
5+
6+
const __filename = fileURLToPath(import.meta.url)
7+
const __dirname = dirname(__filename)
8+
9+
if (process.argv.includes('--version')) {
10+
const pkgJSON = JSON.parse(
11+
readFileSync(join(__dirname, '../package.json'), 'utf8'),
12+
)
13+
console.log(`${pkgJSON['version']}`)
14+
} else {
15+
await import('../dist/index.js')
16+
}
Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
{
22
"name": "@valype/language-server",
3-
"module": "src/index.ts",
3+
"bin": {
4+
"valype-language-server": "./bin/valype-language-server.js"
5+
},
6+
"dependencies": {
7+
"@valype/language-core": "workspace:*",
8+
"@volar/language-server": "^2.4.17"
9+
},
410
"devDependencies": {
5-
"@types/bun": "latest"
11+
"@types/bun": "latest",
12+
"vscode-uri": "^3.1.0"
613
},
714
"peerDependencies": {
815
"typescript": "^5"
916
},
10-
"type": "module"
17+
"type": "module",
18+
"scripts": {
19+
"build": "tsdown",
20+
"dev": "bun run --watch src/index.ts"
21+
}
1122
}
Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,37 @@
1-
console.log("Hello via Bun!");
1+
import { createPlugin } from '@valype/language-core'
2+
import {
3+
createConnection,
4+
createServer,
5+
createTypeScriptProject,
6+
loadTsdkByPath,
7+
} from '@volar/language-server/node.js'
8+
import { URI } from 'vscode-uri'
9+
10+
const connection = createConnection()
11+
const server = createServer(connection)
12+
13+
connection.listen()
14+
15+
connection.onInitialize((params) => {
16+
const tsdk = params.initializationOptions.tsdk
17+
18+
if (!tsdk) {
19+
throw new Error(
20+
'The `tsdk` init option is required. It should point ot a directory containing a `js` or `tsserverlibrary.js` file, such as `node_modules/typescript/lib`.',
21+
)
22+
}
23+
24+
const { typescript, diagnosticMessages } = loadTsdkByPath(tsdk, params.locale)
25+
26+
return server.initialize(
27+
params,
28+
createTypeScriptProject(typescript, diagnosticMessages, () => ({
29+
languagePlugins: [createPlugin<URI>((scriptId) => scriptId.fsPath)],
30+
})),
31+
[],
32+
)
33+
})
34+
35+
connection.onInitialized(server.initialized)
36+
37+
connection.onShutdown(server.shutdown)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { defineConfig } from 'tsdown'
2+
3+
export default defineConfig({
4+
dts: true,
5+
sourcemap: true,
6+
})

0 commit comments

Comments
 (0)