diff --git a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts index abc16f32b275911f00f5acc083ffac31bb11211c..f383a01177819f3ea7d2c60fdd14c4fd811f53ec 100644 --- a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts +++ b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts @@ -12,12 +12,14 @@ export interface WorkspaceMarkdownDocumentProvider { getAllMarkdownDocuments(): Thenable; readonly onDidChangeMarkdownDocument: vscode.Event; + readonly onDidCreateMarkdownDocument: vscode.Event; readonly onDidDeleteMarkdownDocument: vscode.Event; } class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocumentProvider { private readonly _onDidChangeMarkdownDocumentEmitter = new vscode.EventEmitter(); + private readonly _onDidCreateMarkdownDocumentEmitter = new vscode.EventEmitter(); private readonly _onDidDeleteMarkdownDocumentEmitter = new vscode.EventEmitter(); private _watcher: vscode.FileSystemWatcher | undefined; @@ -46,6 +48,11 @@ class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocume return this._onDidChangeMarkdownDocumentEmitter.event; } + public get onDidCreateMarkdownDocument() { + this.ensureWatcher(); + return this._onDidCreateMarkdownDocumentEmitter.event; + } + public get onDidDeleteMarkdownDocument() { this.ensureWatcher(); return this._onDidDeleteMarkdownDocumentEmitter.event; @@ -65,6 +72,13 @@ class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocume } }, this, this._disposables); + this._watcher.onDidCreate(async resource => { + const document = await vscode.workspace.openTextDocument(resource); + if (isMarkdownFile(document)) { + this._onDidCreateMarkdownDocumentEmitter.fire(document); + } + }, this, this._disposables); + this._watcher.onDidDelete(async resource => { this._onDidDeleteMarkdownDocumentEmitter.fire(resource); }, this, this._disposables); @@ -88,6 +102,7 @@ export default class MarkdownWorkspaceSymbolProvider implements vscode.Workspace this._symbolCachePopulated = true; this._workspaceMarkdownDocumentProvider.onDidChangeMarkdownDocument(this.onDidChangeDocument, this, this._disposables); + this._workspaceMarkdownDocumentProvider.onDidCreateMarkdownDocument(this.onDidChangeDocument, this, this._disposables); this._workspaceMarkdownDocumentProvider.onDidDeleteMarkdownDocument(this.onDidDeleteDocument, this, this._disposables); } diff --git a/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts b/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts index be51bf5773b27cecbfed9d95db654d78f677469c..2ee12a7979c9a92e27f9fdb20ca1d1fc6b94e60b 100644 --- a/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts +++ b/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts @@ -75,7 +75,6 @@ suite('markdown.WorkspaceSymbolProvider', () => { ]); const provider = new MarkdownWorkspaceSymbolProvider(symbolProvider, workspaceFileProvider); - assert.strictEqual((await provider.provideWorkspaceSymbols('')).length, 1); // delete file @@ -83,6 +82,22 @@ suite('markdown.WorkspaceSymbolProvider', () => { const newSymbols = await provider.provideWorkspaceSymbols(''); assert.strictEqual(newSymbols.length, 0); }); + + test('Should update results when markdown file is created', async () => { + const testFileName = vscode.Uri.parse('test.md'); + + const workspaceFileProvider = new InMemoryWorkspaceMarkdownDocumentProvider([ + new InMemoryDocument(testFileName, `# header1`) + ]); + + const provider = new MarkdownWorkspaceSymbolProvider(symbolProvider, workspaceFileProvider); + assert.strictEqual((await provider.provideWorkspaceSymbols('')).length, 1); + + // Creat file + workspaceFileProvider.createDocument(new InMemoryDocument(vscode.Uri.parse('test2.md'), `# new header\nabc\n## header2`)); + const newSymbols = await provider.provideWorkspaceSymbols(''); + assert.strictEqual(newSymbols.length, 3); + }); }); @@ -102,6 +117,9 @@ class InMemoryWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocu private readonly _onDidChangeMarkdownDocumentEmitter = new vscode.EventEmitter(); public onDidChangeMarkdownDocument = this._onDidChangeMarkdownDocumentEmitter.event; + private readonly _onDidCreateMarkdownDocumentEmitter = new vscode.EventEmitter(); + public onDidCreateMarkdownDocument = this._onDidCreateMarkdownDocumentEmitter.event; + private readonly _onDidDeleteMarkdownDocumentEmitter = new vscode.EventEmitter(); public onDidDeleteMarkdownDocument = this._onDidDeleteMarkdownDocumentEmitter.event; @@ -110,6 +128,13 @@ class InMemoryWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocu this._onDidChangeMarkdownDocumentEmitter.fire(document); } + public createDocument(document: vscode.TextDocument) { + assert.ok(!this._documents.has(document.uri.fsPath)); + + this._documents.set(document.uri.fsPath, document); + this._onDidCreateMarkdownDocumentEmitter.fire(document); + } + public deleteDocument(resource: vscode.Uri) { this._documents.delete(resource.fsPath); this._onDidDeleteMarkdownDocumentEmitter.fire(resource);