@@ -5,15 +5,13 @@ import * as vscode from "vscode";
55import { ExecException , ExecOptions , exec } from "child_process" ;
66import { Result , err , ok } from "./result" ;
77import { existsSync , rmSync } from "fs" ;
8- import Parser from "tree-sitter" ;
8+ import type { Language } from "tree-sitter" ;
99import { getLogger } from "./outputChannel" ;
1010import { mkdir } from "fs/promises" ;
1111import which from "which" ;
1212
1313const NPM_INSTALL_URL = "https://nodejs.org/en/download" ;
1414
15- export type Language = Parser . Language ;
16-
1715export function getAbsoluteParserDir ( parsersDir : string , parserName : string ) : string {
1816 return path . resolve ( path . join ( parsersDir , parserName ) ) ;
1917}
@@ -22,11 +20,11 @@ export function getAbsoluteBindingsDir(parsersDir: string, parserName: string):
2220 return path . resolve ( path . join ( parsersDir , parserName , "bindings" , "node" , "index.js" ) ) ;
2321}
2422
25- export function loadParser (
23+ export async function loadParser (
2624 parsersDir : string ,
2725 parserName : string ,
2826 subdirectory ?: string
29- ) : Result < Language , string > {
27+ ) : Promise < Result < Language , string > > {
3028 const logger = getLogger ( ) ;
3129
3230 const bindingsDir = getAbsoluteBindingsDir ( parsersDir , parserName ) ;
@@ -39,13 +37,14 @@ export function loadParser(
3937 try {
4038 logger . log ( `Loading parser from ${ bindingsDir } ` ) ;
4139
42- // using dynamic import causes issues on windows
43- // make sure to test well on windows before changing this
44- // TODO(02/11/24): change to dynamic import
45- // let { default: language } = (await import(bindingsDir)) as { default: Language };
46-
47- // eslint-disable-next-line @typescript-eslint/no-var-requires
48- let language = require ( bindingsDir ) as Language ;
40+ let language : Language ;
41+ try {
42+ language = ( ( await import ( bindingsDir ) ) as { default : Language } ) . default ;
43+ } catch ( error ) {
44+ // TODO(1/11/25): Always use import and remove this backup
45+ // eslint-disable-next-line @typescript-eslint/no-var-requires
46+ language = require ( bindingsDir ) as Language ;
47+ }
4948
5049 logger . log ( `Got language: ${ JSON . stringify ( Object . keys ( language ) ) } ` ) ;
5150
@@ -118,7 +117,7 @@ export async function downloadAndBuildParser(
118117 }
119118
120119 // try to load parser optimistically
121- const loadResult = loadParser ( parsersDir , parserName ) ;
120+ const loadResult = await loadParser ( parsersDir , parserName ) ;
122121 if ( loadResult . status === "ok" ) {
123122 return ok ( undefined ) ;
124123 }
@@ -137,7 +136,7 @@ export async function downloadAndBuildParser(
137136 }
138137
139138 // if it fails, try to build it
140- const buildResult = await runCmd ( `${ treeSitterCli } generate ` , { cwd : parserDir } , ( d ) =>
139+ const buildResult = await runCmd ( `${ treeSitterCli } build ` , { cwd : parserDir } , ( d ) =>
141140 onData ?.( d . toString ( ) )
142141 ) ;
143142 if ( buildResult . status === "err" ) {
@@ -273,7 +272,7 @@ export async function getLanguage(
273272 }
274273 }
275274
276- const loadResult = loadParser ( parsersDir , parserName , subdirectory ) ;
275+ const loadResult = await loadParser ( parsersDir , parserName , subdirectory ) ;
277276 if ( loadResult . status === "err" ) {
278277 const msg = `Failed to load parser for language ${ languageId } > ${ loadResult . result } ` ;
279278
0 commit comments