1
1
import * as vscode from "vscode" ;
2
- import * as Parser from "web-tree-sitter" ;
2
+ import * as treeSitter from "web-tree-sitter" ;
3
3
import * as path from "path" ;
4
4
import * as fs from "fs" ;
5
5
import { LanguageStillLoadingError , UnsupportedLanguageError } from "./errors" ;
6
6
7
7
interface Language {
8
8
module : string ;
9
- parser ?: Parser ;
9
+ parser ?: treeSitter . Parser ;
10
10
}
11
11
12
12
// Be sure to declare the language in package.json and include a minimalist grammar.
@@ -59,13 +59,13 @@ const languages: {
59
59
} ;
60
60
61
61
// 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
63
63
64
64
// Called when the extension is first activated by user opening a file with the appropriate language
65
65
export async function activate ( context : vscode . ExtensionContext ) {
66
66
console . debug ( "Activating tree-sitter..." ) ;
67
67
// Parse of all visible documents
68
- const trees : { [ uri : string ] : Parser . Tree } = { } ;
68
+ const trees : { [ uri : string ] : treeSitter . Tree } = { } ;
69
69
70
70
/**
71
71
* Load the parser model for a given language
@@ -98,8 +98,8 @@ export async function activate(context: vscode.ExtensionContext) {
98
98
99
99
const wasm = path . relative ( process . cwd ( ) , absolute ) ;
100
100
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 ( ) ;
103
103
parser . setLanguage ( lang ) ;
104
104
language . parser = parser ;
105
105
@@ -117,7 +117,10 @@ export async function activate(context: vscode.ExtensionContext) {
117
117
}
118
118
119
119
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
+ }
121
124
trees [ uriString ] = t ;
122
125
}
123
126
@@ -128,14 +131,14 @@ export async function activate(context: vscode.ExtensionContext) {
128
131
}
129
132
130
133
const language = languages [ document . languageId ] ;
131
- if ( language == null ) {
132
- return null ;
133
- }
134
- if ( language . parser == null ) {
134
+ if ( language ?. parser == null ) {
135
135
return null ;
136
136
}
137
137
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
+ }
139
142
trees [ uriString ] = t ;
140
143
return t ;
141
144
}
@@ -149,7 +152,10 @@ export async function activate(context: vscode.ExtensionContext) {
149
152
updateTree ( language . parser , edit ) ;
150
153
}
151
154
152
- function updateTree ( parser : Parser , edit : vscode . TextDocumentChangeEvent ) {
155
+ function updateTree (
156
+ parser : treeSitter . Parser ,
157
+ edit : vscode . TextDocumentChangeEvent
158
+ ) {
153
159
if ( edit . contentChanges . length === 0 ) {
154
160
return ;
155
161
}
@@ -174,12 +180,17 @@ export async function activate(context: vscode.ExtensionContext) {
174
180
} ;
175
181
old . edit ( delta ) ;
176
182
}
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
+ }
178
187
trees [ edit . document . uri . toString ( ) ] = t ;
179
188
}
180
- function asPoint ( pos : vscode . Position ) : Parser . Point {
189
+
190
+ function asPoint ( pos : vscode . Position ) : treeSitter . Point {
181
191
return { row : pos . line , column : pos . character } ;
182
192
}
193
+
183
194
function close ( document : vscode . TextDocument ) {
184
195
delete trees [ document . uri . toString ( ) ] ;
185
196
}
@@ -244,8 +255,25 @@ export async function activate(context: vscode.ExtensionContext) {
244
255
return {
245
256
loadLanguage,
246
257
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 ) ;
249
277
} ,
250
278
251
279
/**
0 commit comments