11import * as vscode from "vscode" ;
2- import * as Parser from "web-tree-sitter" ;
2+ import * as treeSitter from "web-tree-sitter" ;
33import * as path from "path" ;
44import * as fs from "fs" ;
55import { LanguageStillLoadingError , UnsupportedLanguageError } from "./errors" ;
66
77interface Language {
88 module : string ;
9- parser ?: Parser ;
9+ parser ?: treeSitter . Parser ;
1010}
1111
1212// Be sure to declare the language in package.json and include a minimalist grammar.
@@ -59,13 +59,13 @@ const languages: {
5959} ;
6060
6161// For some reason this crashes if we put it inside activate
62- const initParser = Parser . init ( ) ; // TODO this isn't a field, suppress package member coloring like Go
62+ const initParser = treeSitter . Parser . init ( ) ; // TODO this isn't a field, suppress package member coloring like Go
6363
6464// Called when the extension is first activated by user opening a file with the appropriate language
6565export async function activate ( context : vscode . ExtensionContext ) {
6666 console . debug ( "Activating tree-sitter..." ) ;
6767 // Parse of all visible documents
68- const trees : { [ uri : string ] : Parser . Tree } = { } ;
68+ const trees : { [ uri : string ] : treeSitter . Tree } = { } ;
6969
7070 /**
7171 * Load the parser model for a given language
@@ -98,8 +98,8 @@ export async function activate(context: vscode.ExtensionContext) {
9898
9999 const wasm = path . relative ( process . cwd ( ) , absolute ) ;
100100 await initParser ;
101- const lang = await Parser . Language . load ( wasm ) ;
102- const parser = new Parser ( ) ;
101+ const lang = await treeSitter . Language . load ( wasm ) ;
102+ const parser = new treeSitter . Parser ( ) ;
103103 parser . setLanguage ( lang ) ;
104104 language . parser = parser ;
105105
@@ -117,7 +117,10 @@ export async function activate(context: vscode.ExtensionContext) {
117117 }
118118
119119 const language = languages [ document . languageId ] ;
120- const t = language . parser ! . parse ( document . getText ( ) ) ; // TODO don't use getText, use Parser.Input
120+ const t = language . parser ?. parse ( document . getText ( ) ) ;
121+ if ( t == null ) {
122+ throw Error ( `Failed to parse ${ document . uri } ` ) ;
123+ }
121124 trees [ uriString ] = t ;
122125 }
123126
@@ -128,14 +131,14 @@ export async function activate(context: vscode.ExtensionContext) {
128131 }
129132
130133 const language = languages [ document . languageId ] ;
131- if ( language == null ) {
132- return null ;
133- }
134- if ( language . parser == null ) {
134+ if ( language ?. parser == null ) {
135135 return null ;
136136 }
137137
138- const t = language . parser . parse ( document . getText ( ) ) ; // TODO don't use getText, use Parser.Input
138+ const t = language . parser . parse ( document . getText ( ) ) ;
139+ if ( t == null ) {
140+ throw Error ( `Failed to parse ${ document . uri } ` ) ;
141+ }
139142 trees [ uriString ] = t ;
140143 return t ;
141144 }
@@ -149,7 +152,10 @@ export async function activate(context: vscode.ExtensionContext) {
149152 updateTree ( language . parser , edit ) ;
150153 }
151154
152- function updateTree ( parser : Parser , edit : vscode . TextDocumentChangeEvent ) {
155+ function updateTree (
156+ parser : treeSitter . Parser ,
157+ edit : vscode . TextDocumentChangeEvent
158+ ) {
153159 if ( edit . contentChanges . length === 0 ) {
154160 return ;
155161 }
@@ -174,12 +180,17 @@ export async function activate(context: vscode.ExtensionContext) {
174180 } ;
175181 old . edit ( delta ) ;
176182 }
177- const t = parser . parse ( edit . document . getText ( ) , old ) ; // TODO don't use getText, use Parser.Input
183+ const t = parser . parse ( edit . document . getText ( ) , old ) ;
184+ if ( t == null ) {
185+ throw Error ( `Failed to parse ${ edit . document . uri } ` ) ;
186+ }
178187 trees [ edit . document . uri . toString ( ) ] = t ;
179188 }
180- function asPoint ( pos : vscode . Position ) : Parser . Point {
189+
190+ function asPoint ( pos : vscode . Position ) : treeSitter . Point {
181191 return { row : pos . line , column : pos . character } ;
182192 }
193+
183194 function close ( document : vscode . TextDocument ) {
184195 delete trees [ document . uri . toString ( ) ] ;
185196 }
@@ -244,8 +255,25 @@ export async function activate(context: vscode.ExtensionContext) {
244255 return {
245256 loadLanguage,
246257
247- getLanguage ( languageId : string ) : Parser . Language | undefined {
248- return languages [ languageId ] ?. parser ?. getLanguage ( ) ;
258+ /**
259+ * @deprecated
260+ */
261+ getLanguage ( languageId : string ) : treeSitter . Language | undefined {
262+ console . warn (
263+ "vscode-parse-tree: getLanguage is deprecated, use createQuery(languageId, source) instead."
264+ ) ;
265+ return languages [ languageId ] ?. parser ?. language ?? undefined ;
266+ } ,
267+
268+ createQuery (
269+ languageId : string ,
270+ source : string
271+ ) : treeSitter . Query | undefined {
272+ const language = languages [ languageId ] ?. parser ?. language ;
273+ if ( language == null ) {
274+ return undefined ;
275+ }
276+ return new treeSitter . Query ( language , source ) ;
249277 } ,
250278
251279 /**
0 commit comments