Skip to content

Commit 76e8a3d

Browse files
Jonathan D.A. Jewellclaude
andcommitted
fix: convert VSCode extension from TypeScript to ReScript
Replaced TypeScript with ReScript following hyperpolymath language policy. **Language Policy Compliance:** - ✅ ReScript (allowed) replaces TypeScript (banned) - ✅ ES6 module output for VSCode compatibility - ✅ Type-safe bindings for VSCode API **Changes:** - Removed: extension.ts, tsconfig.json - Added: Extension.res, VSCode.res (ReScript sources) - Added: Extension.res.js, VSCode.res.js (compiled output) - Added: rescript.json configuration - Updated: package.json (rescript deps instead of typescript) **VSCode Bindings (VSCode.res):** - Type-safe bindings for VSCode API - LanguageClient bindings for LSP - Workspace, Window, Commands modules **Extension (Extension.res):** - LSP client initialization for woke-lsp - Command registration (restart server) - Clean functional ReScript code - Compiles with zero errors/warnings **Build:** - `npm run compile` → rescript build - Output: in-source .res.js files - Main entry: src/Extension.res.js All functionality preserved, now using approved language! Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 1f16889 commit 76e8a3d

8 files changed

Lines changed: 279 additions & 74 deletions

File tree

editors/vscode/package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"activationEvents": [
2626
"onLanguage:wokelang"
2727
],
28-
"main": "./out/extension.js",
28+
"main": "./src/Extension.res.js",
2929
"contributes": {
3030
"languages": [
3131
{
@@ -70,16 +70,16 @@
7070
}
7171
},
7272
"scripts": {
73-
"vscode:prepublish": "npm run compile",
74-
"compile": "tsc -p ./",
75-
"watch": "tsc -watch -p ./"
73+
"vscode:prepublish": "rescript build",
74+
"compile": "rescript build",
75+
"watch": "rescript build -w",
76+
"clean": "rescript clean"
7677
},
7778
"devDependencies": {
78-
"@types/node": "^16.0.0",
79-
"@types/vscode": "^1.60.0",
80-
"typescript": "^4.9.0"
79+
"rescript": "^11.0.0"
8180
},
8281
"dependencies": {
83-
"vscode-languageclient": "^8.0.0"
82+
"vscode-languageclient": "^9.0.0",
83+
"@rescript/core": "^1.5.0"
8484
}
8585
}

editors/vscode/rescript.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"name": "wokelang-vscode",
3+
"version": "0.1.0",
4+
"sources": [
5+
{
6+
"dir": "src",
7+
"subdirs": true
8+
}
9+
],
10+
"package-specs": [
11+
{
12+
"module": "esmodule",
13+
"in-source": true
14+
}
15+
],
16+
"suffix": ".res.js",
17+
"bs-dependencies": [],
18+
"warnings": {
19+
"error": "+101"
20+
}
21+
}

editors/vscode/src/Extension.res

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// SPDX-License-Identifier: PMPL-1.0-or-later
2+
// WokeLang VSCode Extension - ReScript Implementation
3+
4+
open VSCode
5+
6+
let client: ref<option<LanguageClient.t>> = ref(None)
7+
8+
let startLanguageClient = (_context: extensionContext) => {
9+
let config = Workspace.getConfiguration("wokelang")
10+
let serverPath = switch Workspace.get(config, "serverPath") {
11+
| Some(path) => path
12+
| None => "woke-lsp"
13+
}
14+
15+
let serverOptions: LanguageClient.serverOptions = {
16+
run: {
17+
command: serverPath,
18+
transport: Stdio,
19+
},
20+
debug: {
21+
command: serverPath,
22+
transport: Stdio,
23+
options: {env: Js.Dict.fromArray([("RUST_BACKTRACE", "1")])},
24+
},
25+
}
26+
27+
let clientOptions: LanguageClient.clientOptions = {
28+
documentSelector: [{scheme: "file", language: "wokelang"}],
29+
synchronize: {
30+
fileEvents: Workspace.createFileSystemWatcher("**/*.woke"),
31+
},
32+
}
33+
34+
let languageClient = LanguageClient.make(
35+
"wokelang",
36+
"WokeLang Language Server",
37+
serverOptions,
38+
clientOptions,
39+
)
40+
41+
client := Some(languageClient)
42+
let _ = LanguageClient.start(languageClient)
43+
()
44+
}
45+
46+
let restartServer = (context: extensionContext) => {
47+
switch client.contents {
48+
| Some(c) =>
49+
let _ = LanguageClient.stop(c)
50+
startLanguageClient(context)
51+
| None => startLanguageClient(context)
52+
}
53+
}
54+
55+
let activate = (context: extensionContext) => {
56+
startLanguageClient(context)
57+
58+
// Register commands
59+
let restartCmd = Commands.registerCommand("wokelang.restartServer", () =>
60+
Js.Promise.make((~resolve, ~reject as _) => {
61+
restartServer(context)
62+
resolve(.)
63+
})
64+
)
65+
66+
let _ = Js.Array2.push(context.subscriptions, restartCmd)
67+
()
68+
}
69+
70+
let deactivate = () => {
71+
switch client.contents {
72+
| Some(c) => Some(LanguageClient.stop(c))
73+
| None => None
74+
}
75+
}

editors/vscode/src/Extension.res.js

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

editors/vscode/src/VSCode.res

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// SPDX-License-Identifier: MIT OR Apache-2.0
2+
// VSCode API bindings for ReScript
3+
4+
type disposable
5+
type fileSystemWatcher
6+
7+
type extensionContext = {
8+
subscriptions: array<disposable>,
9+
}
10+
11+
module Workspace = {
12+
type configuration
13+
14+
@module("vscode") @scope("workspace")
15+
external getConfiguration: string => configuration = "getConfiguration"
16+
17+
@send external get: (configuration, string) => option<string> = "get"
18+
19+
@module("vscode") @scope("workspace")
20+
external createFileSystemWatcher: string => fileSystemWatcher = "createFileSystemWatcher"
21+
}
22+
23+
module Window = {
24+
@module("vscode") @scope("window")
25+
external showInformationMessage: string => promise<option<string>> = "showInformationMessage"
26+
27+
@module("vscode") @scope("window")
28+
external showErrorMessage: string => promise<option<string>> = "showErrorMessage"
29+
}
30+
31+
module Commands = {
32+
@module("vscode") @scope("commands")
33+
external registerCommand: (string, unit => promise<unit>) => disposable = "registerCommand"
34+
}
35+
36+
module LanguageClient = {
37+
type transportKind = | @as(0) Stdio
38+
39+
type optionsType = {env?: Js.Dict.t<string>}
40+
41+
type runOptions = {
42+
command: string,
43+
transport: transportKind,
44+
options?: optionsType,
45+
}
46+
47+
type serverOptions = {
48+
run: runOptions,
49+
debug: runOptions,
50+
}
51+
52+
type documentFilter = {
53+
scheme: string,
54+
language: string,
55+
}
56+
57+
type synchronizeOptions = {fileEvents: fileSystemWatcher}
58+
59+
type clientOptions = {
60+
documentSelector: array<documentFilter>,
61+
synchronize: synchronizeOptions,
62+
}
63+
64+
type t
65+
66+
@module("vscode-languageclient/node") @new
67+
external make: (string, string, serverOptions, clientOptions) => t = "LanguageClient"
68+
69+
@send external start: t => promise<unit> = "start"
70+
@send external stop: t => promise<unit> = "stop"
71+
}

editors/vscode/src/VSCode.res.js

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

editors/vscode/src/extension.ts

Lines changed: 0 additions & 54 deletions
This file was deleted.

editors/vscode/tsconfig.json

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)