@@ -738,52 +738,88 @@ async function buildTestDriverAndReportErrors(
738
738
739
739
const buildTasks = [ ] ;
740
740
if ( coverage ) {
741
- const adaTP = adaExtState . getAdaTaskProvider ( ) ! ;
741
+ const adaTP = adaExtState . getAdaTaskProvider ( ) ;
742
+ assert ( adaTP ) ;
742
743
743
- const instTaskDef : SimpleTaskDef = {
744
- type : TASK_TYPE_ADA ,
745
- command : 'gnatcov' ,
746
- args : [ 'instrument' , '--level=stmt' , '-P' , await getGnatTestDriverProjectPath ( ) ] . concat (
747
- getScenarioArgs ( ) ,
748
- ) ,
749
- } ;
750
- const instTask = ( await adaTP . resolveTask (
751
- new vscode . Task (
752
- instTaskDef ,
753
- vscode . TaskScope . Workspace ,
754
- `GNATcoverage - Generate instrumented sources for coverage analysis` ,
755
- TASK_TYPE_ADA ,
756
- undefined ,
757
- DEFAULT_PROBLEM_MATCHER ,
758
- ) ,
759
- ) ) ! ;
760
- instTask . presentationOptions . reveal = vscode . TaskRevealKind . Never ;
761
-
762
- const buildTaskDef : SimpleTaskDef = {
763
- type : TASK_TYPE_ADA ,
764
- command : 'gprbuild' ,
765
- args : [
766
- '-m' ,
767
- '-s' ,
768
- '--src-subdirs=gnatcov-instr' ,
769
- '--implicit-with=gnatcov_rts.gpr' ,
770
- '-P' ,
771
- await getGnatTestDriverProjectPath ( ) ,
772
- ]
773
- . concat ( getScenarioArgs ( ) )
774
- . concat ( [ '-cargs' , '-g' , '-fdump-scos' , '-fpreserve-control-flow' ] ) ,
775
- } ;
776
- const buildTask = ( await adaTP . resolveTask (
777
- new vscode . Task (
778
- buildTaskDef ,
779
- vscode . TaskScope . Workspace ,
780
- `GNATcoverage - Build GNATtest harness project in coverage mode` ,
781
- TASK_TYPE_ADA ,
782
- undefined ,
783
- DEFAULT_PROBLEM_MATCHER ,
784
- ) ,
785
- ) ) ! ;
786
- buildTask . presentationOptions . reveal = vscode . TaskRevealKind . Never ;
744
+ const instTaskName = `GNATcoverage - Generate instrumented sources for coverage analysis` ;
745
+ /**
746
+ * First try to fetch an existing task of the corresponding name. The
747
+ * User may have defined a homonym in tasks.json to customize this
748
+ * step.
749
+ */
750
+ const instExistingTask = await findTaskByName ( `${ TASK_TYPE_ADA } : ${ instTaskName } ` ) . then (
751
+ undefined ,
752
+ /**
753
+ * Return undefined in case of errors when searching for the task.
754
+ */
755
+ ( ) => undefined ,
756
+ ) ;
757
+ let instTask ;
758
+ if ( instExistingTask ) {
759
+ instTask = instExistingTask ;
760
+ } else {
761
+ /**
762
+ * If there's no existing task of that name, create one on the fly.
763
+ */
764
+ const instTaskDef : SimpleTaskDef = {
765
+ type : TASK_TYPE_ADA ,
766
+ command : 'gnatcov' ,
767
+ args : [
768
+ 'instrument' ,
769
+ '--level=stmt' ,
770
+ '-P' ,
771
+ await getGnatTestDriverProjectPath ( ) ,
772
+ ] . concat ( getScenarioArgs ( ) ) ,
773
+ } ;
774
+ instTask = ( await adaTP . resolveTask (
775
+ new vscode . Task (
776
+ instTaskDef ,
777
+ vscode . TaskScope . Workspace ,
778
+ instTaskName ,
779
+ TASK_TYPE_ADA ,
780
+ undefined ,
781
+ DEFAULT_PROBLEM_MATCHER ,
782
+ ) ,
783
+ ) ) ! ;
784
+ instTask . presentationOptions . reveal =
785
+ instTask . presentationOptions . reveal ?? vscode . TaskRevealKind . Never ;
786
+ }
787
+
788
+ const buildTaskName = `GNATcoverage - Build GNATtest harness project in coverage mode` ;
789
+ const buildExistingTask = await findTaskByName ( `${ TASK_TYPE_ADA } : ${ buildTaskName } ` ) . then (
790
+ undefined ,
791
+ ( ) => undefined ,
792
+ ) ;
793
+ let buildTask ;
794
+ if ( buildExistingTask ) {
795
+ buildTask = buildExistingTask ;
796
+ } else {
797
+ const buildTaskDef : SimpleTaskDef = {
798
+ type : TASK_TYPE_ADA ,
799
+ command : 'gprbuild' ,
800
+ args : [
801
+ '-m' ,
802
+ '-s' ,
803
+ '--src-subdirs=gnatcov-instr' ,
804
+ '--implicit-with=gnatcov_rts.gpr' ,
805
+ '-P' ,
806
+ await getGnatTestDriverProjectPath ( ) ,
807
+ ]
808
+ . concat ( getScenarioArgs ( ) )
809
+ . concat ( [ '-cargs' , '-g' , '-fdump-scos' , '-fpreserve-control-flow' ] ) ,
810
+ } ;
811
+ buildTask = ( await adaTP . resolveTask (
812
+ new vscode . Task (
813
+ buildTaskDef ,
814
+ vscode . TaskScope . Workspace ,
815
+ buildTaskName ,
816
+ TASK_TYPE_ADA ,
817
+ undefined ,
818
+ DEFAULT_PROBLEM_MATCHER ,
819
+ ) ,
820
+ ) ) ! ;
821
+ buildTask . presentationOptions . reveal = vscode . TaskRevealKind . Never ;
822
+ }
787
823
788
824
buildTasks . push ( instTask , buildTask ) ;
789
825
} else {
0 commit comments