@@ -14,12 +14,17 @@ import {
1414} from "./disabledLanguages" ;
1515import {
1616 DeprecatedError ,
17- LanguageFailedToLoad ,
17+ LanguageStillLoadingError ,
1818 UnsupportedLanguageError ,
1919} from "./errors" ;
2020import { languages } from "./languages" ;
2121import { Trees } from "./Trees" ;
22- import { getWasmPath , isDocumentVisible } from "./utils" ;
22+ import {
23+ getOpenDocument ,
24+ getWasmPath ,
25+ isDocumentVisible ,
26+ parseDocument ,
27+ } from "./utils" ;
2328
2429// For some reason this crashes if we put it inside activate
2530// Fix: this isn't a field, suppress package member coloring like Go
@@ -92,65 +97,60 @@ export function activate(context: ExtensionContext) {
9297 throw new Error ( `No parser for language ${ document . languageId } ` ) ;
9398 }
9499
95- tree = language . parser ?. parse ( document . getText ( ) ) ?? undefined ;
96-
97- if ( tree == null ) {
98- throw Error ( `Failed to parse ${ uriString } ` ) ;
99- }
100+ tree = parseDocument ( language . parser , document ) ;
100101
101102 trees . set ( uriString , tree ) ;
102103
103104 return tree ;
104105 }
105106
106- /**
107- * Create a tree-sitter query for a given language and query source
108- * @param languageId the vscode language id of the language to create the query for
109- * @param source the source of the query
110- * @returns the created query, or undefined if the language couldn't be loaded
111- */
112- function createQuery ( languageId : string , source : string ) : Query | undefined {
113- const language = languages [ languageId ] ?. parser ?. language ;
114- if ( language == null ) {
115- throwIfLanguageIsDisabled ( languageId ) ;
116- return undefined ;
117- }
118- return new Query ( language , source ) ;
119- }
120-
121107 /**
122108 * Get the parse tree for a given document, parsing it if necessary
123109 * @param document the document to get the tree for
124110 * @returns the parse tree for the document
125111 */
126- async function getTreeForUri ( uri : Uri ) : Promise < Tree > {
112+ function getTreeForUri ( uri : Uri ) : Tree {
127113 const uriString = uri . toString ( ) ;
128114 let tree = trees . get ( uriString ) ;
129115
116+ // Document is already opened
130117 if ( tree != null ) {
131118 return tree ;
132119 }
133120
134- const document = workspace . textDocuments . find (
135- ( textDocument ) => textDocument . uri . toString ( ) === uri . toString ( ) ,
136- ) ;
137-
138- if ( document == null ) {
139- throw new Error ( `Document ${ uriString } is not open` ) ;
140- }
141-
142- tree = await openDocument ( document ) ;
121+ const document = getOpenDocument ( uri ) ;
122+ const language = languages [ document . languageId ] ;
143123
144- if ( tree != null ) {
145- return tree ;
124+ // Language without a parser, e.g. plaintext
125+ if ( language == null ) {
126+ throw new UnsupportedLanguageError ( document . languageId ) ;
146127 }
147128
148- if ( document . languageId in languages ) {
129+ // Language definition exists, but the parser is not loaded. Could be a race
130+ // condition or a disabled language.
131+ if ( language . parser == null ) {
149132 throwIfLanguageIsDisabled ( document . languageId ) ;
150- throw new LanguageFailedToLoad ( document . languageId ) ;
133+ throw new LanguageStillLoadingError ( document . languageId ) ;
151134 }
152135
153- throw new UnsupportedLanguageError ( document . languageId ) ;
136+ tree = parseDocument ( language . parser , document ) ;
137+ trees . set ( uriString , tree ) ;
138+ return tree ;
139+ }
140+
141+ /**
142+ * Create a tree-sitter query for a given language and query source
143+ * @param languageId the vscode language id of the language to create the query for
144+ * @param source the source of the query
145+ * @returns the created query, or undefined if the language couldn't be loaded
146+ */
147+ function createQuery ( languageId : string , source : string ) : Query | undefined {
148+ const language = languages [ languageId ] ?. parser ?. language ;
149+ if ( language == null ) {
150+ throwIfLanguageIsDisabled ( languageId ) ;
151+ return undefined ;
152+ }
153+ return new Query ( language , source ) ;
154154 }
155155
156156 // NOTE: if you make this an async function, it seems to cause edit anomalies
0 commit comments