11import * 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"
33import {
44 javascriptQuery ,
55 typescriptQuery ,
@@ -32,24 +32,25 @@ import {
3232
3333export interface LanguageParser {
3434 [ key : string ] : {
35- parser : Parser
36- query : Query
35+ parser : ParserT
36+ query : QueryT
3737 }
3838}
3939
4040async 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/*
5455Using node bindings for tree-sitter is problematic in vscode extensions
5556because 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