diff --git a/src/snippets/snippetLoader.ts b/src/snippets/snippetLoader.ts index d85b5b6..58cedee 100644 --- a/src/snippets/snippetLoader.ts +++ b/src/snippets/snippetLoader.ts @@ -90,13 +90,22 @@ export class SnippetLoader { ); snippetFiles.push(snippetFile); }); - await Promise.all(snippetFiles.map((file: SnippetFile) => this.getSnippets(file, extensionId))); + await Promise.all(snippetFiles.map((file: SnippetFile) => this.getFileSnippets(file))); } } return Promise.resolve(snippetFiles); } - async getSnippets(snippetFile: SnippetFile, extensionId?: string): Promise { + async getSnippets(snippetLanguage: SnippetLanguage): Promise { + const fileSnippets: Snippet[][] = await Promise.all( + snippetLanguage.snippetFiles.map((file: SnippetFile) => this.getFileSnippets(file)) + ); + const snippets: Snippet[] = []; + fileSnippets.forEach(file => file.map(snippet => snippets.push(snippet))); + return Promise.resolve(snippets); + } + + async getFileSnippets(snippetFile: SnippetFile): Promise { return new Promise((resolve, reject) => { fs.readFile(snippetFile.filePath, 'utf8', (error, snippetsConfig) => { if (error) { diff --git a/src/snippets/snippetTreeDataProvider.ts b/src/snippets/snippetTreeDataProvider.ts index fe728b4..2bfd5d0 100644 --- a/src/snippets/snippetTreeDataProvider.ts +++ b/src/snippets/snippetTreeDataProvider.ts @@ -32,13 +32,26 @@ export class SnippetTreeDataProvider implements TreeDataProvider { if (!element) { + // get languages from built-in extensions and snippets extensions return await this.snippetLoader.getSnippetLanguages(); } else if (element instanceof SnippetLanguage) { + const combineLanguageSnippets: boolean = + workspace.getConfiguration('snippets.viewer').get('combineLanguageSnippets'); + if (combineLanguageSnippets) { + const sortSnippetsByName: boolean = + workspace.getConfiguration('snippets.viewer').get('sortSnippetsByName'); + let snippets = await this.snippetLoader.getSnippets(element); + if (sortSnippetsByName) { + snippets = snippets.sort((a, b) => a.name.localeCompare(b.name)); + } + return snippets; + } return element.snippetFiles.sort((a, b) => a.label.localeCompare(b.label)); } else if (element instanceof SnippetFile) { - let snippets = await this.snippetLoader.getSnippets(element); + // get snippets for a snippet file + let snippets = await this.snippetLoader.getFileSnippets(element); const sortSnippetsByName: boolean = workspace.getConfiguration('snippets.viewer').get('sortSnippetsByName'); if (sortSnippetsByName) { diff --git a/test/.vscode/settings.json b/test/.vscode/settings.json index 95c04c6..f0ae6d2 100644 --- a/test/.vscode/settings.json +++ b/test/.vscode/settings.json @@ -1,4 +1,6 @@ { "editor.tabSize": 2, - "snippets.viewer.skipLanguageSnippets": "bat, c, csharp, cpp, coffeescript, fsharp, javascriptreact, typescriptreact, swift, vb, wat" + "snippets.viewer.skipLanguageSnippets": "bat, c, csharp, cpp, coffeescript, fsharp, javascriptreact, typescriptreact, swift, vb, wat", + "snippets.viewer.sortSnippetsByName": true, + "snippets.viewer.combineLanguageSnippets": true } \ No newline at end of file