@@ -66,6 +66,15 @@ export interface WorkspaceManager {
6666 initializeWorkspace ( folders : WorkspaceFolder [ ] , cancelToken ?: CancellationToken ) : Promise < void > ;
6767
6868}
69+ /**
70+ * The FileSelector provides file names and extensions used by this extension.
71+ */
72+ export interface FileSelector {
73+ /** Allowed file extensions (e.g., ["ts", "js"]). */
74+ fileExtensions : string [ ] ;
75+ /** Allowed file names (e.g., ["config", "settings"]). */
76+ fileNames : string [ ] ;
77+ }
6978
7079export class DefaultWorkspaceManager implements WorkspaceManager {
7180
@@ -119,6 +128,7 @@ export class DefaultWorkspaceManager implements WorkspaceManager {
119128 */
120129 protected async performStartup ( folders : WorkspaceFolder [ ] ) : Promise < LangiumDocument [ ] > {
121130 const fileExtensions = this . serviceRegistry . all . flatMap ( e => e . LanguageMetaData . fileExtensions ) ;
131+ const fileNames = this . serviceRegistry . all . flatMap ( e => e . LanguageMetaData . fileNames ?? [ ] ) ;
122132 const documents : LangiumDocument [ ] = [ ] ;
123133 const collector = ( document : LangiumDocument ) => {
124134 documents . push ( document ) ;
@@ -132,7 +142,7 @@ export class DefaultWorkspaceManager implements WorkspaceManager {
132142 await this . loadAdditionalDocuments ( folders , collector ) ;
133143 await Promise . all (
134144 folders . map ( wf => [ wf , this . getRootFolder ( wf ) ] as [ WorkspaceFolder , URI ] )
135- . map ( async entry => this . traverseFolder ( ...entry , fileExtensions , collector ) )
145+ . map ( async entry => this . traverseFolder ( ...entry , { fileExtensions, fileNames } , collector ) )
136146 ) ;
137147 this . _ready . resolve ( ) ;
138148 return documents ;
@@ -160,12 +170,12 @@ export class DefaultWorkspaceManager implements WorkspaceManager {
160170 * Traverse the file system folder identified by the given URI and its subfolders. All
161171 * contained files that match the file extensions are added to the collector.
162172 */
163- protected async traverseFolder ( workspaceFolder : WorkspaceFolder , folderPath : URI , fileExtensions : string [ ] , collector : ( document : LangiumDocument ) => void ) : Promise < void > {
173+ protected async traverseFolder ( workspaceFolder : WorkspaceFolder , folderPath : URI , selector : FileSelector , collector : ( document : LangiumDocument ) => void ) : Promise < void > {
164174 const content = await this . fileSystemProvider . readDirectory ( folderPath ) ;
165175 await Promise . all ( content . map ( async entry => {
166- if ( this . includeEntry ( workspaceFolder , entry , fileExtensions ) ) {
176+ if ( this . includeEntry ( workspaceFolder , entry , selector ) ) {
167177 if ( entry . isDirectory ) {
168- await this . traverseFolder ( workspaceFolder , entry . uri , fileExtensions , collector ) ;
178+ await this . traverseFolder ( workspaceFolder , entry . uri , selector , collector ) ;
169179 } else if ( entry . isFile ) {
170180 const document = await this . langiumDocuments . getOrCreateDocument ( entry . uri ) ;
171181 collector ( document ) ;
@@ -177,16 +187,16 @@ export class DefaultWorkspaceManager implements WorkspaceManager {
177187 /**
178188 * Determine whether the given folder entry shall be included while indexing the workspace.
179189 */
180- protected includeEntry ( _workspaceFolder : WorkspaceFolder , entry : FileSystemNode , fileExtensions : string [ ] ) : boolean {
190+ protected includeEntry ( _workspaceFolder : WorkspaceFolder , entry : FileSystemNode , selector : FileSelector ) : boolean {
181191 const name = UriUtils . basename ( entry . uri ) ;
182192 if ( name . startsWith ( '.' ) ) {
183193 return false ;
184194 }
185195 if ( entry . isDirectory ) {
186196 return name !== 'node_modules' && name !== 'out' ;
187197 } else if ( entry . isFile ) {
188- const extname = UriUtils . extname ( entry . uri ) ;
189- return fileExtensions . includes ( extname ) ;
198+ return selector . fileExtensions . includes ( UriUtils . extname ( entry . uri ) ) ||
199+ selector . fileNames . includes ( UriUtils . basename ( entry . uri ) ) ;
190200 }
191201 return false ;
192202 }
0 commit comments