The new parameter makes it possible, while processing aggregate projects, to stop the processing as soon as an error is found in one of the aggregated projects.
Tested on x86_64-pc-linux-gnu, committed on trunk 2011-08-03 Emmanuel Briot <br...@adacore.com> * prj-part.adb, prj-part.ads, prj-makr.adb, prj-pars.adb, prj-conf.adb, prj-env.adb (Prj.Part.Parse): change parameter Always_Errout_Finalize to Errout_Handling.
Index: prj-part.adb =================================================================== --- prj-part.adb (revision 177243) +++ prj-part.adb (working copy) @@ -443,7 +443,7 @@ (In_Tree : Project_Node_Tree_Ref; Project : out Project_Node_Id; Project_File_Name : String; - Always_Errout_Finalize : Boolean; + Errout_Handling : Errout_Mode := Always_Finalize; Packages_To_Check : String_List_Access := All_Packages; Store_Comments : Boolean := False; Current_Directory : String := ""; @@ -477,7 +477,10 @@ Path => Path_Name_Id); Free (Real_Project_File_Name); - Prj.Err.Initialize; + if Errout_Handling /= Never_Finalize then + Prj.Err.Initialize; + end if; + Prj.Err.Scanner.Set_Comment_As_Token (Store_Comments); Prj.Err.Scanner.Set_End_Of_Line_As_Token (Store_Comments); @@ -607,14 +610,23 @@ Project := Empty_Node; end if; - if No (Project) or else Always_Errout_Finalize then - Prj.Err.Finalize; + case Errout_Handling is + when Always_Finalize => + Prj.Err.Finalize; - -- Reinitialize to avoid duplicate warnings later on + -- Reinitialize to avoid duplicate warnings later on + Prj.Err.Initialize; - Prj.Err.Initialize; - end if; + when Finalize_If_Error => + if No (Project) then + Prj.Err.Finalize; + Prj.Err.Initialize; + end if; + when Never_Finalize => + null; + end case; + exception when X : others => Index: prj-part.ads =================================================================== --- prj-part.ads (revision 177241) +++ prj-part.ads (working copy) @@ -29,11 +29,19 @@ package Prj.Part is + type Errout_Mode is + (Always_Finalize, + Finalize_If_Error, + Never_Finalize); + -- Whether Parse should call Errout.Finalize (which prints the error + -- messages on stdout). When Never_Finalize is used, Errout is not reset + -- either at the beginning of Parse. + procedure Parse (In_Tree : Project_Node_Tree_Ref; Project : out Project_Node_Id; Project_File_Name : String; - Always_Errout_Finalize : Boolean; + Errout_Handling : Errout_Mode := Always_Finalize; Packages_To_Check : String_List_Access := All_Packages; Store_Comments : Boolean := False; Current_Directory : String := ""; Index: prj-makr.adb =================================================================== --- prj-makr.adb (revision 177241) +++ prj-makr.adb (working copy) @@ -863,7 +863,7 @@ (In_Tree => Tree, Project => Project_Node, Project_File_Name => Output_Name.all, - Always_Errout_Finalize => False, + Errout_Handling => Part.Finalize_If_Error, Store_Comments => True, Is_Config_File => False, Flags => Flags, Index: prj-pars.adb =================================================================== --- prj-pars.adb (revision 177241) +++ prj-pars.adb (working copy) @@ -72,7 +72,7 @@ (In_Tree => Project_Node_Tree, Project => Project_Node, Project_File_Name => Project_File_Name, - Always_Errout_Finalize => False, + Errout_Handling => Prj.Part.Finalize_If_Error, Packages_To_Check => Packages_To_Check, Current_Directory => Current_Dir, Flags => Flags, Index: prj-conf.adb =================================================================== --- prj-conf.adb (revision 177241) +++ prj-conf.adb (working copy) @@ -1119,7 +1119,7 @@ (In_Tree => Project_Node_Tree, Project => Config_Project_Node, Project_File_Name => Config_File_Path.all, - Always_Errout_Finalize => False, + Errout_Handling => Prj.Part.Finalize_If_Error, Packages_To_Check => Packages_To_Check, Current_Directory => Current_Directory, Is_Config_File => True, @@ -1212,7 +1212,7 @@ (In_Tree => Project_Node_Tree, Project => User_Project_Node, Project_File_Name => Project_File_Name, - Always_Errout_Finalize => False, + Errout_Handling => Prj.Part.Finalize_If_Error, Packages_To_Check => Packages_To_Check, Current_Directory => Current_Directory, Is_Config_File => False,