@@ -710,24 +710,44 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
710710 this . workspaceFolders . forEach ( folder => {
711711 folderMap [ folder . uri . toString ( ) ] = folder ;
712712 } ) ;
713+ const folderToTasksMap : Map < string , any > = new Map ( ) ;
713714 const recentlyUsedTasks = this . getRecentlyUsedTasks ( ) ;
714715 const tasks : ( Task | ConfiguringTask ) [ ] = [ ] ;
715- for ( let key of recentlyUsedTasks . keys ( ) ) {
716+ for ( const key of recentlyUsedTasks . keys ( ) ) {
716717 const folder = this . getFolderFromTaskKey ( key ) ;
717718 const task = JSON . parse ( recentlyUsedTasks . get ( key ) ! ) ;
718-
719+ if ( folder && ! folderToTasksMap . has ( folder ) ) {
720+ folderToTasksMap . set ( folder , [ ] ) ;
721+ }
719722 if ( folder && ( folderMap [ folder ] || ( folder === USER_TASKS_GROUP_KEY ) ) && task ) {
720- let custom : CustomTask [ ] = [ ] ;
721- let customized : IStringDictionary < ConfiguringTask > = Object . create ( null ) ;
722- await this . computeTasksForSingleConfig ( folderMap [ folder ] ?? this . workspaceFolders [ 0 ] , {
723- version : '2.0.0' ,
724- tasks : [ task ]
725- } , TaskRunSource . System , custom , customized , folderMap [ folder ] ? TaskConfig . TaskConfigSource . TasksJson : TaskConfig . TaskConfigSource . User ) ;
726- tasks . push ( ...custom ) ;
727- for ( const configuration in customized ) {
728- tasks . push ( customized [ configuration ] ) ;
723+ folderToTasksMap . get ( folder ) . push ( task ) ;
724+ }
725+ }
726+ const readTasksMap : Map < string , ( Task | ConfiguringTask ) > = new Map ( ) ;
727+ for ( const key of folderToTasksMap . keys ( ) ) {
728+ let custom : CustomTask [ ] = [ ] ;
729+ let customized : IStringDictionary < ConfiguringTask > = Object . create ( null ) ;
730+ await this . computeTasksForSingleConfig ( folderMap [ key ] ?? this . workspaceFolders [ 0 ] , {
731+ version : '2.0.0' ,
732+ tasks : folderToTasksMap . get ( key )
733+ } , TaskRunSource . System , custom , customized , folderMap [ key ] ? TaskConfig . TaskConfigSource . TasksJson : TaskConfig . TaskConfigSource . User , true ) ;
734+ custom . forEach ( task => {
735+ const taskKey = task . getRecentlyUsedKey ( ) ;
736+ if ( taskKey ) {
737+ readTasksMap . set ( taskKey , task ) ;
729738 }
739+ } ) ;
740+ for ( const configuration in customized ) {
741+ const taskKey = customized [ configuration ] . getRecentlyUsedKey ( ) ;
742+ if ( taskKey ) {
743+ readTasksMap . set ( taskKey , customized [ configuration ] ) ;
744+ }
745+ }
746+ }
730747
748+ for ( const key of recentlyUsedTasks . keys ( ) ) {
749+ if ( readTasksMap . has ( key ) ) {
750+ tasks . push ( readTasksMap . get ( key ) ! ) ;
731751 }
732752 }
733753 return tasks ;
@@ -1811,13 +1831,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
18111831 return { workspaceFolder, set : undefined , configurations : undefined , hasErrors : false } ;
18121832 }
18131833
1814- private async computeTasksForSingleConfig ( workspaceFolder : IWorkspaceFolder , config : TaskConfig . ExternalTaskRunnerConfiguration | undefined , runSource : TaskRunSource , custom : CustomTask [ ] , customized : IStringDictionary < ConfiguringTask > , source : TaskConfig . TaskConfigSource ) : Promise < boolean > {
1834+ private async computeTasksForSingleConfig ( workspaceFolder : IWorkspaceFolder , config : TaskConfig . ExternalTaskRunnerConfiguration | undefined , runSource : TaskRunSource , custom : CustomTask [ ] , customized : IStringDictionary < ConfiguringTask > , source : TaskConfig . TaskConfigSource , isRecentTask : boolean = false ) : Promise < boolean > {
18151835 if ( ! config ) {
18161836 return false ;
18171837 }
18181838 let taskSystemInfo : TaskSystemInfo | undefined = workspaceFolder ? this . _taskSystemInfos . get ( workspaceFolder . uri . scheme ) : undefined ;
18191839 let problemReporter = new ProblemReporter ( this . _outputChannel ) ;
1820- let parseResult = TaskConfig . parse ( workspaceFolder , this . _workspace , taskSystemInfo ? taskSystemInfo . platform : Platform . platform , config , problemReporter , source ) ;
1840+ let parseResult = TaskConfig . parse ( workspaceFolder , this . _workspace , taskSystemInfo ? taskSystemInfo . platform : Platform . platform , config , problemReporter , source , isRecentTask ) ;
18211841 let hasErrors = false ;
18221842 if ( ! parseResult . validationStatus . isOK ( ) ) {
18231843 this . showOutput ( runSource ) ;
@@ -2061,12 +2081,11 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
20612081 }
20622082 const TaskQuickPickEntry = ( task : Task ) : TaskQuickPickEntry => {
20632083 let entryLabel = task . _label ;
2064- let commonKey = task . _id . split ( '|' ) [ 0 ] ;
2065- if ( count [ commonKey ] ) {
2066- entryLabel = entryLabel + ' (' + count [ commonKey ] . toString ( ) + ')' ;
2067- count [ commonKey ] ++ ;
2084+ if ( count [ task . _id ] ) {
2085+ entryLabel = entryLabel + ' (' + count [ task . _id ] . toString ( ) + ')' ;
2086+ count [ task . _id ] ++ ;
20682087 } else {
2069- count [ commonKey ] = 1 ;
2088+ count [ task . _id ] = 1 ;
20702089 }
20712090 return { label : entryLabel , description : this . getTaskDescription ( task ) , task, detail : this . showDetail ( ) ? task . configurationProperties . detail : undefined } ;
20722091
0 commit comments