Skip to content

Commit 0c92963

Browse files
committed
Fix tree-sitter
1 parent b0f4ea7 commit 0c92963

File tree

1 file changed

+60
-44
lines changed

1 file changed

+60
-44
lines changed
Lines changed: 60 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as path from "path"
2-
import { Parser, Query, Language } from "web-tree-sitter"
2+
import { Parser as ParserT, Language as LanguageT, Query as QueryT } from "web-tree-sitter"
33
import {
44
javascriptQuery,
55
typescriptQuery,
@@ -32,24 +32,25 @@ import {
3232

3333
export interface LanguageParser {
3434
[key: string]: {
35-
parser: Parser
36-
query: Query
35+
parser: ParserT
36+
query: QueryT
3737
}
3838
}
3939

4040
async function loadLanguage(langName: string) {
41-
return await Language.load(path.join(__dirname, `tree-sitter-${langName}.wasm`))
42-
}
43-
44-
let isParserInitialized = false
41+
const wasmPath = path.join(__dirname, `tree-sitter-${langName}.wasm`)
4542

46-
async function initializeParser() {
47-
if (!isParserInitialized) {
48-
await Parser.init()
49-
isParserInitialized = true
43+
try {
44+
const { Language } = require("web-tree-sitter")
45+
return await Language.load(wasmPath)
46+
} catch (error) {
47+
console.error(`Error loading language: ${wasmPath}: ${error instanceof Error ? error.message : error}`)
48+
throw error
5049
}
5150
}
5251

52+
let isParserInitialized = false
53+
5354
/*
5455
Using node bindings for tree-sitter is problematic in vscode extensions
5556
because of incompatibility with electron. Going the .wasm route has the
@@ -72,142 +73,157 @@ Sources:
7273
- https://github.com/tree-sitter/tree-sitter/blob/master/lib/binding_web/README.md
7374
- https://github.com/tree-sitter/tree-sitter/blob/master/lib/binding_web/test/query-test.js
7475
*/
75-
export async function loadRequiredLanguageParsers(filesToParse: string[]): Promise<LanguageParser> {
76-
await initializeParser()
76+
export async function loadRequiredLanguageParsers(filesToParse: string[]) {
77+
const { Parser, Query } = require("web-tree-sitter")
78+
79+
if (!isParserInitialized) {
80+
try {
81+
await Parser.init()
82+
isParserInitialized = true
83+
} catch (error) {
84+
console.error(`Error initializing parser: ${error instanceof Error ? error.message : error}`)
85+
throw error
86+
}
87+
}
88+
7789
const extensionsToLoad = new Set(filesToParse.map((file) => path.extname(file).toLowerCase().slice(1)))
7890
const parsers: LanguageParser = {}
91+
7992
for (const ext of extensionsToLoad) {
80-
let language: Language
81-
let query: Query
93+
let language: LanguageT
94+
let query: QueryT
8295
let parserKey = ext // Default to using extension as key
96+
8397
switch (ext) {
8498
case "js":
8599
case "jsx":
86100
case "json":
87101
language = await loadLanguage("javascript")
88-
query = language.query(javascriptQuery)
102+
query = new Query(language, javascriptQuery)
89103
break
90104
case "ts":
91105
language = await loadLanguage("typescript")
92-
query = language.query(typescriptQuery)
106+
query = new Query(language, typescriptQuery)
93107
break
94108
case "tsx":
95109
language = await loadLanguage("tsx")
96-
query = language.query(tsxQuery)
110+
query = new Query(language, tsxQuery)
97111
break
98112
case "py":
99113
language = await loadLanguage("python")
100-
query = language.query(pythonQuery)
114+
query = new Query(language, pythonQuery)
101115
break
102116
case "rs":
103117
language = await loadLanguage("rust")
104-
query = language.query(rustQuery)
118+
query = new Query(language, rustQuery)
105119
break
106120
case "go":
107121
language = await loadLanguage("go")
108-
query = language.query(goQuery)
122+
query = new Query(language, goQuery)
109123
break
110124
case "cpp":
111125
case "hpp":
112126
language = await loadLanguage("cpp")
113-
query = language.query(cppQuery)
127+
query = new Query(language, cppQuery)
114128
break
115129
case "c":
116130
case "h":
117131
language = await loadLanguage("c")
118-
query = language.query(cQuery)
132+
query = new Query(language, cQuery)
119133
break
120134
case "cs":
121135
language = await loadLanguage("c_sharp")
122-
query = language.query(csharpQuery)
136+
query = new Query(language, csharpQuery)
123137
break
124138
case "rb":
125139
language = await loadLanguage("ruby")
126-
query = language.query(rubyQuery)
140+
query = new Query(language, rubyQuery)
127141
break
128142
case "java":
129143
language = await loadLanguage("java")
130-
query = language.query(javaQuery)
144+
query = new Query(language, javaQuery)
131145
break
132146
case "php":
133147
language = await loadLanguage("php")
134-
query = language.query(phpQuery)
148+
query = new Query(language, phpQuery)
135149
break
136150
case "swift":
137151
language = await loadLanguage("swift")
138-
query = language.query(swiftQuery)
152+
query = new Query(language, swiftQuery)
139153
break
140154
case "kt":
141155
case "kts":
142156
language = await loadLanguage("kotlin")
143-
query = language.query(kotlinQuery)
157+
query = new Query(language, kotlinQuery)
144158
break
145159
case "css":
146160
language = await loadLanguage("css")
147-
query = language.query(cssQuery)
161+
query = new Query(language, cssQuery)
148162
break
149163
case "html":
150164
language = await loadLanguage("html")
151-
query = language.query(htmlQuery)
165+
query = new Query(language, htmlQuery)
152166
break
153167
case "ml":
154168
case "mli":
155169
language = await loadLanguage("ocaml")
156-
query = language.query(ocamlQuery)
170+
query = new Query(language, ocamlQuery)
157171
break
158172
case "scala":
159173
language = await loadLanguage("scala")
160-
query = language.query(luaQuery) // Temporarily use Lua query until Scala is implemented
174+
query = new Query(language, luaQuery) // Temporarily use Lua query until Scala is implemented
161175
break
162176
case "sol":
163177
language = await loadLanguage("solidity")
164-
query = language.query(solidityQuery)
178+
query = new Query(language, solidityQuery)
165179
break
166180
case "toml":
167181
language = await loadLanguage("toml")
168-
query = language.query(tomlQuery)
182+
query = new Query(language, tomlQuery)
169183
break
170184
case "vue":
171185
language = await loadLanguage("vue")
172-
query = language.query(vueQuery)
186+
query = new Query(language, vueQuery)
173187
break
174188
case "lua":
175189
language = await loadLanguage("lua")
176-
query = language.query(luaQuery)
190+
query = new Query(language, luaQuery)
177191
break
178192
case "rdl":
179193
language = await loadLanguage("systemrdl")
180-
query = language.query(systemrdlQuery)
194+
query = new Query(language, systemrdlQuery)
181195
break
182196
case "tla":
183197
language = await loadLanguage("tlaplus")
184-
query = language.query(tlaPlusQuery)
198+
query = new Query(language, tlaPlusQuery)
185199
break
186200
case "zig":
187201
language = await loadLanguage("zig")
188-
query = language.query(zigQuery)
202+
query = new Query(language, zigQuery)
189203
break
190204
case "ejs":
191205
case "erb":
206+
parserKey = "embedded_template" // Use same key for both extensions.
192207
language = await loadLanguage("embedded_template")
193-
parserKey = "embedded_template" // Use same key for both extensions
194-
query = language.query(embeddedTemplateQuery)
208+
query = new Query(language, embeddedTemplateQuery)
195209
break
196210
case "el":
197211
language = await loadLanguage("elisp")
198-
query = language.query(elispQuery)
212+
query = new Query(language, elispQuery)
199213
break
200214
case "ex":
201215
case "exs":
202216
language = await loadLanguage("elixir")
203-
query = language.query(elixirQuery)
217+
query = new Query(language, elixirQuery)
204218
break
205219
default:
206220
throw new Error(`Unsupported language: ${ext}`)
207221
}
222+
208223
const parser = new Parser()
209224
parser.setLanguage(language)
210225
parsers[parserKey] = { parser, query }
211226
}
227+
212228
return parsers
213229
}

0 commit comments

Comments
 (0)