@@ -83,7 +83,7 @@ export class DatabaseManager extends DisposableObject {
8383 readonly onDidChangeCurrentDatabaseItem =
8484 this . _onDidChangeCurrentDatabaseItem . event ;
8585
86- private readonly _databaseItems : DatabaseItem [ ] = [ ] ;
86+ private readonly _databaseItems : DatabaseItemImpl [ ] = [ ] ;
8787 private _currentDatabaseItem : DatabaseItem | undefined = undefined ;
8888
8989 constructor (
@@ -127,8 +127,8 @@ export class DatabaseManager extends DisposableObject {
127127 *
128128 * Typically, the item will have been created by {@link createOrOpenDatabaseItem} or {@link openDatabase}.
129129 */
130- public async addExistingDatabaseItem (
131- databaseItem : DatabaseItem ,
130+ private async addExistingDatabaseItem (
131+ databaseItem : DatabaseItemImpl ,
132132 progress : ProgressCallback ,
133133 makeSelected : boolean ,
134134 token : vscode . CancellationToken ,
@@ -162,7 +162,7 @@ export class DatabaseManager extends DisposableObject {
162162 private async createDatabaseItem (
163163 uri : vscode . Uri ,
164164 displayName : string | undefined ,
165- ) : Promise < DatabaseItem > {
165+ ) : Promise < DatabaseItemImpl > {
166166 const contents = await DatabaseResolver . resolveDatabaseContents ( uri ) ;
167167 // Ignore the source archive for QLTest databases by default.
168168 const isQLTestDatabase = extname ( uri . fsPath ) === ".testproj" ;
@@ -173,14 +173,7 @@ export class DatabaseManager extends DisposableObject {
173173 dateAdded : Date . now ( ) ,
174174 language : await this . getPrimaryLanguage ( uri . fsPath ) ,
175175 } ;
176- const databaseItem = new DatabaseItemImpl (
177- uri ,
178- contents ,
179- fullOptions ,
180- ( event ) => {
181- this . _onDidChangeDatabaseItem . fire ( event ) ;
182- } ,
183- ) ;
176+ const databaseItem = new DatabaseItemImpl ( uri , contents , fullOptions ) ;
184177
185178 return databaseItem ;
186179 }
@@ -329,7 +322,7 @@ export class DatabaseManager extends DisposableObject {
329322 progress : ProgressCallback ,
330323 token : vscode . CancellationToken ,
331324 state : PersistedDatabaseItem ,
332- ) : Promise < DatabaseItem > {
325+ ) : Promise < DatabaseItemImpl > {
333326 let displayName : string | undefined = undefined ;
334327 let ignoreSourceArchive = false ;
335328 let dateAdded = undefined ;
@@ -359,14 +352,7 @@ export class DatabaseManager extends DisposableObject {
359352 dateAdded,
360353 language,
361354 } ;
362- const item = new DatabaseItemImpl (
363- dbBaseUri ,
364- undefined ,
365- fullOptions ,
366- ( event ) => {
367- this . _onDidChangeDatabaseItem . fire ( event ) ;
368- } ,
369- ) ;
355+ const item = new DatabaseItemImpl ( dbBaseUri , undefined , fullOptions ) ;
370356
371357 // Avoid persisting the database state after adding since that should happen only after
372358 // all databases have been added.
@@ -407,7 +393,7 @@ export class DatabaseManager extends DisposableObject {
407393 database ,
408394 ) ;
409395 try {
410- await databaseItem . refresh ( ) ;
396+ await this . refreshDatabase ( databaseItem ) ;
411397 await this . registerDatabase ( progress , token , databaseItem ) ;
412398 if ( currentDatabaseUri === database . uri ) {
413399 await this . setCurrentDatabaseItem ( databaseItem , true ) ;
@@ -449,8 +435,12 @@ export class DatabaseManager extends DisposableObject {
449435 item : DatabaseItem | undefined ,
450436 skipRefresh = false ,
451437 ) : Promise < void > {
452- if ( ! skipRefresh && item !== undefined ) {
453- await item . refresh ( ) ; // Will throw on invalid database.
438+ if (
439+ ! skipRefresh &&
440+ item !== undefined &&
441+ item instanceof DatabaseItemImpl
442+ ) {
443+ await this . refreshDatabase ( item ) ; // Will throw on invalid database.
454444 }
455445 if ( this . _currentDatabaseItem !== item ) {
456446 this . _currentDatabaseItem = item ;
@@ -499,7 +489,7 @@ export class DatabaseManager extends DisposableObject {
499489 private async addDatabaseItem (
500490 progress : ProgressCallback ,
501491 token : vscode . CancellationToken ,
502- item : DatabaseItem ,
492+ item : DatabaseItemImpl ,
503493 updatePersistedState = true ,
504494 ) {
505495 this . _databaseItems . push ( item ) ;
@@ -616,6 +606,34 @@ export class DatabaseManager extends DisposableObject {
616606 await this . qs . registerDatabase ( progress , token , dbItem ) ;
617607 }
618608
609+ /**
610+ * Resolves the contents of the database.
611+ *
612+ * @remarks
613+ * The contents include the database directory, source archive, and metadata about the database.
614+ * If the database is invalid, `databaseItem.error` is updated with the error object that describes why
615+ * the database is invalid. This error is also thrown.
616+ */
617+ private async refreshDatabase ( databaseItem : DatabaseItemImpl ) {
618+ try {
619+ try {
620+ databaseItem . contents = await DatabaseResolver . resolveDatabaseContents (
621+ databaseItem . databaseUri ,
622+ ) ;
623+ databaseItem . error = undefined ;
624+ } catch ( e ) {
625+ databaseItem . contents = undefined ;
626+ databaseItem . error = asError ( e ) ;
627+ throw e ;
628+ }
629+ } finally {
630+ this . _onDidChangeDatabaseItem . fire ( {
631+ kind : DatabaseEventKind . Refresh ,
632+ item : databaseItem ,
633+ } ) ;
634+ }
635+ }
636+
619637 private updatePersistedCurrentDatabaseItem ( ) : void {
620638 void this . ctx . workspaceState . update (
621639 CURRENT_DB ,
0 commit comments