@@ -81,7 +81,24 @@ export class ResultsProvider implements vscode.TreeDataProvider<ResultItem> {
8181 ) ;
8282 } else if ( element . type === 'language' ) {
8383 // Second level - group by severity within language
84- const severityGroups = this . groupBySeverity ( element . results ! ) ;
84+ if ( ! element . results || element . results . length === 0 ) {
85+ // Show "no results" for this language
86+ return Promise . resolve ( [
87+ new ResultItem (
88+ '✅ No security alerts found' ,
89+ vscode . TreeItemCollapsibleState . None ,
90+ 'noResults' ,
91+ element . language ,
92+ undefined ,
93+ undefined ,
94+ undefined ,
95+ undefined ,
96+ `No security vulnerabilities were found for ${ element . language } `
97+ )
98+ ] ) ;
99+ }
100+
101+ const severityGroups = this . groupBySeverity ( element . results ) ;
85102 const sortedSeverities = this . sortSeverityGroups ( severityGroups ) ;
86103 return Promise . resolve (
87104 sortedSeverities . map ( ( [ severity , results ] ) =>
@@ -145,14 +162,28 @@ export class ResultsProvider implements vscode.TreeDataProvider<ResultItem> {
145162 }
146163
147164 private groupByLanguage ( results : ScanResult [ ] ) : { [ language : string ] : ScanResult [ ] } {
148- return results . reduce ( ( groups , result ) => {
165+ // Get configured languages from settings
166+ const config = vscode . workspace . getConfiguration ( "codeql-scanner" ) ;
167+ const configuredLanguages = config . get < string [ ] > ( "languages" , [ ] ) ;
168+
169+ // Start with results grouped by language
170+ const groups = results . reduce ( ( groups , result ) => {
149171 const language = result . language || 'unknown' ;
150172 if ( ! groups [ language ] ) {
151173 groups [ language ] = [ ] ;
152174 }
153175 groups [ language ] . push ( result ) ;
154176 return groups ;
155177 } , { } as { [ language : string ] : ScanResult [ ] } ) ;
178+
179+ // Add configured languages that have no results
180+ configuredLanguages . forEach ( language => {
181+ if ( ! groups [ language ] ) {
182+ groups [ language ] = [ ] ;
183+ }
184+ } ) ;
185+
186+ return groups ;
156187 }
157188
158189 private groupBySeverity ( results : ScanResult [ ] ) : { [ severity : string ] : ScanResult [ ] } {
@@ -372,18 +403,34 @@ export class ResultItem extends vscode.TreeItem {
372403 private getIcon ( ) : vscode . ThemeIcon {
373404 if ( this . type === 'language' ) {
374405 switch ( this . language ) {
375- case 'javascript' :
376- return new vscode . ThemeIcon ( 'symbol-class' , new vscode . ThemeColor ( 'symbolIcon.classForeground' ) ) ;
377- case 'python' :
378- return new vscode . ThemeIcon ( 'symbol-function' , new vscode . ThemeColor ( 'symbolIcon.functionForeground' ) ) ;
379- case 'java' :
380- return new vscode . ThemeIcon ( 'symbol-interface' , new vscode . ThemeColor ( 'symbolIcon.interfaceForeground' ) ) ;
381- case 'csharp' :
382- return new vscode . ThemeIcon ( 'symbol-namespace' , new vscode . ThemeColor ( 'symbolIcon.namespaceForeground' ) ) ;
383- case 'cpp' :
384- return new vscode . ThemeIcon ( 'symbol-struct' , new vscode . ThemeColor ( 'symbolIcon.structForeground' ) ) ;
385- default :
386- return new vscode . ThemeIcon ( 'file-code' ) ;
406+ case 'javascript' :
407+ case 'typescript' :
408+ return new vscode . ThemeIcon ( 'symbol-class' , new vscode . ThemeColor ( 'symbolIcon.classForeground' ) ) ;
409+ case 'python' :
410+ return new vscode . ThemeIcon ( 'symbol-function' , new vscode . ThemeColor ( 'symbolIcon.functionForeground' ) ) ;
411+ case 'java' :
412+ return new vscode . ThemeIcon ( 'symbol-interface' , new vscode . ThemeColor ( 'symbolIcon.interfaceForeground' ) ) ;
413+ case 'csharp' :
414+ return new vscode . ThemeIcon ( 'symbol-namespace' , new vscode . ThemeColor ( 'symbolIcon.namespaceForeground' ) ) ;
415+ case 'cpp' :
416+ case 'c' :
417+ return new vscode . ThemeIcon ( 'symbol-struct' , new vscode . ThemeColor ( 'symbolIcon.structForeground' ) ) ;
418+ case 'go' :
419+ return new vscode . ThemeIcon ( 'symbol-module' , new vscode . ThemeColor ( 'symbolIcon.moduleForeground' ) ) ;
420+ case 'rust' :
421+ return new vscode . ThemeIcon ( 'symbol-package' , new vscode . ThemeColor ( 'symbolIcon.packageForeground' ) ) ;
422+ case 'ruby' :
423+ return new vscode . ThemeIcon ( 'symbol-property' , new vscode . ThemeColor ( 'symbolIcon.propertyForeground' ) ) ;
424+ case 'php' :
425+ return new vscode . ThemeIcon ( 'symbol-variable' , new vscode . ThemeColor ( 'symbolIcon.variableForeground' ) ) ;
426+ case 'swift' :
427+ return new vscode . ThemeIcon ( 'symbol-key' , new vscode . ThemeColor ( 'symbolIcon.keyForeground' ) ) ;
428+ case 'kotlin' :
429+ return new vscode . ThemeIcon ( 'symbol-constructor' , new vscode . ThemeColor ( 'symbolIcon.constructorForeground' ) ) ;
430+ case 'scala' :
431+ return new vscode . ThemeIcon ( 'symbol-operator' , new vscode . ThemeColor ( 'symbolIcon.operatorForeground' ) ) ;
432+ default :
433+ return new vscode . ThemeIcon ( 'file-code' ) ;
387434 }
388435 } else if ( this . type === 'severity' ) {
389436 switch ( this . severity ) {
0 commit comments