prj.ads, [...] (Recursive_Process): Remove duplicated code.
authorEmmanuel Briot <briot@adacore.com>
Wed, 22 Apr 2009 10:57:10 +0000 (10:57 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 22 Apr 2009 10:57:10 +0000 (12:57 +0200)
2009-04-22  Emmanuel Briot  <briot@adacore.com>

* prj.ads, prj.adb, prj-nmsc.adb, prj-proc.adb (Recursive_Process):
Remove duplicated code.
(Canonical_Case_File_Name): new subprogram
(Check_And_Normalize_Unit_Names): new subprogram
(Write_Attr): new subprogram
Better sharing of code
(Check_Naming_Ada_Only, Check_Naming_Multi_Lang): new subprogram, to
split Check_Naming and help find duplicated code
(Check_Common): new subprogram, sharing code between ada_only and
multi_language mode.
(Naming_Data.Dot_Repl_Loc): field removed

From-SVN: r146567

gcc/ada/ChangeLog
gcc/ada/prj-nmsc.adb
gcc/ada/prj-proc.adb
gcc/ada/prj.adb
gcc/ada/prj.ads

index 79a7fa4781e63d7a6f7f52dcda4709078efa725b..18cfd872bd9cb386721a6284430264412447dfb7 100644 (file)
@@ -1,3 +1,17 @@
+2009-04-22  Emmanuel Briot  <briot@adacore.com>
+
+       * prj.ads, prj.adb, prj-nmsc.adb, prj-proc.adb (Recursive_Process):
+       Remove duplicated code.
+       (Canonical_Case_File_Name): new subprogram
+       (Check_And_Normalize_Unit_Names): new subprogram
+       (Write_Attr): new subprogram
+       Better sharing of code
+       (Check_Naming_Ada_Only, Check_Naming_Multi_Lang): new subprogram, to
+       split Check_Naming and help find duplicated code
+       (Check_Common): new subprogram, sharing code between ada_only and
+       multi_language mode.
+       (Naming_Data.Dot_Repl_Loc): field removed
+
 2009-04-22  Emmanuel Briot  <briot@adacore.com>
 
        * prj-proc.adb, prj-nmsc.adb (Load_Naming_Exceptions): New subprogram.
index 31e5bdfd9cdbc1fa456f41e2d639eff6322d069b..952098584e3b87a8833c354bb00412db2d43d027 100644 (file)
@@ -250,6 +250,10 @@ package body Prj.Nmsc is
    --  If Source_To_Replace is specified, it points to the source in the
    --  extended project that the new file is overriding.
 
+   function Canonical_Case_File_Name (Name : Name_Id) return File_Name_Type;
+   --  Same as Osint.Canonical_Case_File_Name but applies to Name_Id.
+   --  This alters Name_Buffer
+
    function ALI_File_Name (Source : String) return String;
    --  Return the ALI file name corresponding to a source
 
@@ -332,6 +336,16 @@ package body Prj.Nmsc is
    --  Current_Dir should represent the current directory, and is passed for
    --  efficiency to avoid system calls to recompute it.
 
+   procedure Check_And_Normalize_Unit_Names
+     (Project    : Project_Id;
+      In_Tree    : Project_Tree_Ref;
+      List       : Array_Element_Id;
+      Debug_Name : String);
+   --  Check that a list of unit names contains only valid names. Casing
+   --  is normalized where appropriate.
+   --  Debug_Name is the name representing the list, and is used for debug
+   --  output only.
+
    procedure Get_Path_Names_And_Record_Ada_Sources
      (Project     : Project_Id;
       In_Tree     : Project_Tree_Ref;
@@ -510,7 +524,8 @@ package body Prj.Nmsc is
       Current_Dir : String);
    --  Find all the sources of project Project in project tree In_Tree and
    --  update its Data accordingly. This assumes that Data.First_Source has
-   --  been initialized with the list of excluded sources.
+   --  been initialized with the list of excluded sources and special naming
+   --  exceptions.
    --
    --  Current_Dir should represent the current directory, and is passed for
    --  efficiency to avoid system calls to recompute it.
@@ -574,6 +589,24 @@ package body Prj.Nmsc is
    --  Check that individual naming conventions apply to immediate sources of
    --  the project. If not, issue a warning.
 
+   procedure Write_Attr (Name, Value : String);
+   --  Debug print a value for a specific property. Does nothing when not in
+   --  debug mode
+
+   ----------------
+   -- Write_Attr --
+   ----------------
+
+   procedure Write_Attr (Name, Value : String) is
+   begin
+      if Current_Verbosity = High then
+         Write_Str  ("  " & Name & " = """);
+         Write_Str  (Value);
+         Write_Char ('"');
+         Write_Eol;
+      end if;
+   end Write_Attr;
+
    ----------------
    -- Add_Source --
    ----------------
@@ -718,6 +751,21 @@ package body Prj.Nmsc is
       return Source & ALI_Suffix;
    end ALI_File_Name;
 
+   ------------------------------
+   -- Canonical_Case_File_Name --
+   ------------------------------
+
+   function Canonical_Case_File_Name (Name : Name_Id) return File_Name_Type is
+   begin
+      if Osint.File_Names_Case_Sensitive then
+         return File_Name_Type (Name);
+      else
+         Get_Name_String (Name);
+         Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
+         return Name_Find;
+      end if;
+   end Canonical_Case_File_Name;
+
    -----------
    -- Check --
    -----------
@@ -1097,37 +1145,6 @@ package body Prj.Nmsc is
                                   (Naming.Separate_Suffix);
 
          begin
-            --  Dot_Replacement cannot
-
-            --   - be empty
-            --   - start or end with an alphanumeric
-            --   - be a single '_'
-            --   - start with an '_' followed by an alphanumeric
-            --   - contain a '.' except if it is "."
-
-            if Dot_Replacement'Length = 0
-              or else Is_Alphanumeric
-                        (Dot_Replacement (Dot_Replacement'First))
-              or else Is_Alphanumeric
-                        (Dot_Replacement (Dot_Replacement'Last))
-              or else (Dot_Replacement (Dot_Replacement'First) = '_'
-                        and then
-                        (Dot_Replacement'Length = 1
-                          or else
-                           Is_Alphanumeric
-                             (Dot_Replacement (Dot_Replacement'First + 1))))
-              or else (Dot_Replacement'Length > 1
-                         and then
-                           Index (Source => Dot_Replacement,
-                                  Pattern => ".") /= 0)
-            then
-               Error_Msg
-                 (Project, In_Tree,
-                  '"' & Dot_Replacement &
-                  """ is illegal for Dot_Replacement.",
-                  Naming.Dot_Repl_Loc);
-            end if;
-
             --  Suffixes cannot
             --   - be empty
 
@@ -2655,9 +2672,7 @@ package body Prj.Nmsc is
          List := Interfaces.Values;
          while List /= Nil_String loop
             Element := In_Tree.String_Elements.Table (List);
-            Get_Name_String (Element.Value);
-            Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-            Name := Name_Find;
+            Name := Canonical_Case_File_Name (Element.Value);
 
             Project_2 := Project;
             Data_2 := Data;
@@ -2744,6 +2759,55 @@ package body Prj.Nmsc is
       end if;
    end Check_Interfaces;
 
+   ------------------------------------
+   -- Check_And_Normalize_Unit_Names --
+   ------------------------------------
+
+   procedure Check_And_Normalize_Unit_Names
+     (Project    : Project_Id;
+      In_Tree    : Project_Tree_Ref;
+      List       : Array_Element_Id;
+      Debug_Name : String)
+   is
+      Current   : Array_Element_Id := List;
+      Element   : Array_Element;
+      Unit_Name : Name_Id;
+   begin
+      if Current_Verbosity = High then
+         Write_Line ("  Checking unit names in " & Debug_Name);
+      end if;
+
+      while Current /= No_Array_Element loop
+         Element := In_Tree.Array_Elements.Table (Current);
+         Element.Value.Value :=
+           Name_Id (Canonical_Case_File_Name (Element.Value.Value));
+
+         --  Check that it contains a valid unit name
+
+         Get_Name_String (Element.Index);
+         Check_Ada_Name (Name_Buffer (1 .. Name_Len), Unit_Name);
+
+         if Unit_Name = No_Name then
+            Err_Vars.Error_Msg_Name_1 := Element.Index;
+            Error_Msg
+              (Project, In_Tree,
+               "%% is not a valid unit name.",
+               Element.Value.Location);
+
+         else
+            if Current_Verbosity = High then
+               Write_Str ("    for unit: ");
+               Write_Line (Get_Name_String (Unit_Name));
+            end if;
+
+            Element.Index := Unit_Name;
+            In_Tree.Array_Elements.Table (Current) := Element;
+         end if;
+
+         Current := Element.Next;
+      end loop;
+   end Check_And_Normalize_Unit_Names;
+
    --------------------------
    -- Check_Naming_Schemes --
    --------------------------
@@ -2757,65 +2821,148 @@ package body Prj.Nmsc is
                     Util.Value_Of (Name_Naming, Data.Decl.Packages, In_Tree);
       Naming    : Package_Element;
 
-      procedure Check_Unit_Names (List : Array_Element_Id);
-      --  Check that a list of unit names contains only valid names
-
       procedure Get_Exceptions (Kind : Source_Kind);
       --  Comment required ???
 
       procedure Get_Unit_Exceptions (Kind : Source_Kind);
       --  Comment required ???
 
-      ----------------------
-      -- Check_Unit_Names --
-      ----------------------
+      procedure Check_Naming_Ada_Only;
+      --  Does Check_Naming_Schemes processing in Ada_Only mode.
+      --  If there is a package Naming, puts in Data.Naming the contents of
+      --  this package.
+
+      procedure Check_Naming_Multi_Lang;
+      --  Does Check_Naming_Schemes processing for Multi_Language mode.
+
+      procedure Check_Common
+        (Dot_Replacement : in out File_Name_Type;
+         Casing          : in out Casing_Type;
+         Casing_Defined  : out Boolean;
+         Separate_Suffix : in out File_Name_Type;
+         Sep_Suffix_Loc  : in out Source_Ptr);
+      --  Check attributes common to Ada_Only and Multi_Lang modes
+
+      ------------------
+      -- Check_Common --
+      ------------------
+
+      procedure Check_Common
+        (Dot_Replacement : in out File_Name_Type;
+         Casing          : in out Casing_Type;
+         Casing_Defined  : out Boolean;
+         Separate_Suffix : in out File_Name_Type;
+         Sep_Suffix_Loc  : in out Source_Ptr)
+      is
+         Dot_Repl        : constant Variable_Value :=
+           Util.Value_Of
+             (Name_Dot_Replacement, Naming.Decl.Attributes, In_Tree);
+         Casing_String : constant Variable_Value :=
+           Util.Value_Of (Name_Casing, Naming.Decl.Attributes, In_Tree);
+         Sep_Suffix : constant Variable_Value :=
+           Util.Value_Of
+             (Name_Separate_Suffix, Naming.Decl.Attributes, In_Tree);
 
-      procedure Check_Unit_Names (List : Array_Element_Id) is
-         Current   : Array_Element_Id;
-         Element   : Array_Element;
-         Unit_Name : Name_Id;
+         Dot_Repl_Loc    : Source_Ptr;
 
       begin
-         --  Loop through elements of the string list
+         if not Dot_Repl.Default then
+            pragma Assert
+              (Dot_Repl.Kind = Single, "Dot_Replacement is not a string");
+            if Length_Of_Name (Dot_Repl.Value) = 0 then
+               Error_Msg
+                 (Project, In_Tree,
+                  "Dot_Replacement cannot be empty",
+                  Dot_Repl.Location);
+            end if;
 
-         Current := List;
-         while Current /= No_Array_Element loop
-            Element := In_Tree.Array_Elements.Table (Current);
+            Dot_Replacement := Canonical_Case_File_Name (Dot_Repl.Value);
+            Dot_Repl_Loc    := Dot_Repl.Location;
 
-            --  Put file name in canonical case
+            declare
+               Repl : constant String := Get_Name_String (Dot_Replacement);
+            begin
+               --  Dot_Replacement cannot
+               --   - be empty
+               --   - start or end with an alphanumeric
+               --   - be a single '_'
+               --   - start with an '_' followed by an alphanumeric
+               --   - contain a '.' except if it is "."
+
+               if Repl'Length = 0
+                 or else Is_Alphanumeric (Repl (Repl'First))
+                 or else Is_Alphanumeric (Repl (Repl'Last))
+                 or else (Repl (Repl'First) = '_'
+                          and then
+                            (Repl'Length = 1
+                             or else Is_Alphanumeric (Repl (Repl'First + 1))))
+                 or else (Repl'Length > 1
+                          and then Index (Source => Repl, Pattern => ".") /= 0)
+               then
+                  Error_Msg
+                    (Project, In_Tree,
+                     '"' & Repl &
+                     """ is illegal for Dot_Replacement.",
+                     Dot_Repl_Loc);
+               end if;
+            end;
+         end if;
 
-            if not Osint.File_Names_Case_Sensitive then
-               Get_Name_String (Element.Value.Value);
-               Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-               Element.Value.Value := Name_Find;
-            end if;
+         Write_Attr
+           ("Dot_Replacement", Get_Name_String (Dot_Replacement));
 
-            --  Check that it contains a valid unit name
+         Casing_Defined := False;
 
-            Get_Name_String (Element.Index);
-            Check_Ada_Name (Name_Buffer (1 .. Name_Len), Unit_Name);
+         if not Casing_String.Default then
+            pragma Assert
+              (Casing_String.Kind = Single, "Casing is not a string");
 
-            if Unit_Name = No_Name then
-               Err_Vars.Error_Msg_Name_1 := Element.Index;
+            declare
+               Casing_Image : constant String :=
+                 Get_Name_String (Casing_String.Value);
+            begin
+               if Casing_Image'Length = 0 then
+                  Error_Msg
+                    (Project, In_Tree,
+                     "Casing cannot be an empty string",
+                     Casing_String.Location);
+               end if;
+
+               Casing := Value (Casing_Image);
+               Casing_Defined := True;
+
+            exception
+               when Constraint_Error =>
+                  Name_Len := Casing_Image'Length;
+                  Name_Buffer (1 .. Name_Len) := Casing_Image;
+                  Err_Vars.Error_Msg_Name_1 := Name_Find;
+                  Error_Msg
+                    (Project, In_Tree,
+                     "%% is not a correct Casing",
+                     Casing_String.Location);
+            end;
+         end if;
+
+         Write_Attr ("Casing", Image (Casing));
+
+         if not Sep_Suffix.Default then
+            if Length_Of_Name (Sep_Suffix.Value) = 0 then
                Error_Msg
                  (Project, In_Tree,
-                  "%% is not a valid unit name.",
-                  Element.Value.Location);
+                  "Separate_Suffix cannot be empty",
+                  Sep_Suffix.Location);
 
             else
-               if Current_Verbosity = High then
-                  Write_Str ("    Unit (""");
-                  Write_Str (Get_Name_String (Unit_Name));
-                  Write_Line (""")");
-               end if;
-
-               Element.Index := Unit_Name;
-               In_Tree.Array_Elements.Table (Current) := Element;
+               Separate_Suffix := Canonical_Case_File_Name (Sep_Suffix.Value);
+               Sep_Suffix_Loc  := Sep_Suffix.Location;
             end if;
+         end if;
 
-            Current := Element.Next;
-         end loop;
-      end Check_Unit_Names;
+         if Separate_Suffix /= No_File then
+            Write_Attr
+              ("Separate_Suffix", Get_Name_String (Separate_Suffix));
+         end if;
+      end Check_Common;
 
       --------------------
       -- Get_Exceptions --
@@ -2866,14 +3013,7 @@ package body Prj.Nmsc is
                   Element_Id := Exception_List.Values;
                   while Element_Id /= Nil_String loop
                      Element := In_Tree.String_Elements.Table (Element_Id);
-
-                     if Osint.File_Names_Case_Sensitive then
-                        File_Name := File_Name_Type (Element.Value);
-                     else
-                        Get_Name_String (Element.Value);
-                        Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-                        File_Name := Name_Find;
-                     end if;
+                     File_Name := Canonical_Case_File_Name (Element.Value);
 
                      Source := Data.First_Source;
                      while Source /= No_Source
@@ -2995,14 +3135,7 @@ package body Prj.Nmsc is
 
          while Exceptions /= No_Array_Element loop
             Element := In_Tree.Array_Elements.Table (Exceptions);
-
-            if Osint.File_Names_Case_Sensitive then
-               File_Name := File_Name_Type (Element.Value.Value);
-            else
-               Get_Name_String (Element.Value.Value);
-               Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-               File_Name := Name_Find;
-            end if;
+            File_Name := Canonical_Case_File_Name (Element.Value.Value);
 
             Get_Name_String (Element.Index);
             To_Lower (Name_Buffer (1 .. Name_Len));
@@ -3101,524 +3234,255 @@ package body Prj.Nmsc is
 
             Exceptions := Element.Next;
          end loop;
-
       end Get_Unit_Exceptions;
 
-   --  Start of processing for Check_Naming_Schemes
-
-   begin
-      if Get_Mode = Ada_Only then
-
-         --  If there is a package Naming, we will put in Data.Naming what is
-         --  in this package Naming.
-
-         if Naming_Id /= No_Package then
-            Naming := In_Tree.Packages.Table (Naming_Id);
-
-            if Current_Verbosity = High then
-               Write_Line ("Checking ""Naming"" for Ada.");
-            end if;
-
-            declare
-               Bodies : constant Array_Element_Id :=
-                          Util.Value_Of
-                            (Name_Body, Naming.Decl.Arrays, In_Tree);
-
-               Specs  : constant Array_Element_Id :=
-                          Util.Value_Of
-                            (Name_Spec, Naming.Decl.Arrays, In_Tree);
-
-            begin
-               if Bodies /= No_Array_Element then
-
-                  --  We have elements in the array Body_Part
-
-                  if Current_Verbosity = High then
-                     Write_Line ("Found Bodies.");
-                  end if;
-
-                  Data.Naming.Bodies := Bodies;
-                  Check_Unit_Names (Bodies);
-
-               else
-                  if Current_Verbosity = High then
-                     Write_Line ("No Bodies.");
-                  end if;
-               end if;
-
-               if Specs /= No_Array_Element then
-
-                  --  We have elements in the array Specs
-
-                  if Current_Verbosity = High then
-                     Write_Line ("Found Specs.");
-                  end if;
-
-                  Data.Naming.Specs := Specs;
-                  Check_Unit_Names (Specs);
-
-               else
-                  if Current_Verbosity = High then
-                     Write_Line ("No Specs.");
-                  end if;
-               end if;
-            end;
-
-            --  We are now checking if variables Dot_Replacement, Casing,
-            --  Spec_Suffix, Body_Suffix and/or Separate_Suffix exist.
-
-            --  For each variable, if it does not exist, we do nothing,
-            --  because we already have the default.
-
-            --  Check Dot_Replacement
-
-            declare
-               Dot_Replacement : constant Variable_Value :=
-                                   Util.Value_Of
-                                     (Name_Dot_Replacement,
-                                      Naming.Decl.Attributes, In_Tree);
-
-            begin
-               pragma Assert (Dot_Replacement.Kind = Single,
-                              "Dot_Replacement is not a single string");
-
-               if not Dot_Replacement.Default then
-                  Get_Name_String (Dot_Replacement.Value);
-
-                  if Name_Len = 0 then
-                     Error_Msg
-                       (Project, In_Tree,
-                        "Dot_Replacement cannot be empty",
-                        Dot_Replacement.Location);
-
-                  else
-                     if Osint.File_Names_Case_Sensitive then
-                        Data.Naming.Dot_Replacement :=
-                          File_Name_Type (Dot_Replacement.Value);
-                     else
-                        Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-                        Data.Naming.Dot_Replacement := Name_Find;
-                     end if;
-                     Data.Naming.Dot_Repl_Loc := Dot_Replacement.Location;
-                  end if;
-               end if;
-            end;
-
-            if Current_Verbosity = High then
-               Write_Str  ("  Dot_Replacement = """);
-               Write_Str  (Get_Name_String (Data.Naming.Dot_Replacement));
-               Write_Char ('"');
-               Write_Eol;
-            end if;
-
-            --  Check Casing
-
-            declare
-               Casing_String : constant Variable_Value :=
-                                 Util.Value_Of
-                                   (Name_Casing,
-                                    Naming.Decl.Attributes,
-                                    In_Tree);
-
-            begin
-               pragma Assert (Casing_String.Kind = Single,
-                              "Casing is not a single string");
-
-               if not Casing_String.Default then
-                  declare
-                     Casing_Image : constant String :=
-                                      Get_Name_String (Casing_String.Value);
-                  begin
-                     declare
-                        Casing_Value : constant Casing_Type :=
-                                         Value (Casing_Image);
-                     begin
-                        Data.Naming.Casing := Casing_Value;
-                     end;
-
-                  exception
-                     when Constraint_Error =>
-                        if Casing_Image'Length = 0 then
-                           Error_Msg
-                             (Project, In_Tree,
-                              "Casing cannot be an empty string",
-                              Casing_String.Location);
-
-                        else
-                           Name_Len := Casing_Image'Length;
-                           Name_Buffer (1 .. Name_Len) := Casing_Image;
-                           Err_Vars.Error_Msg_Name_1 := Name_Find;
-                           Error_Msg
-                             (Project, In_Tree,
-                              "%% is not a correct Casing",
-                              Casing_String.Location);
-                        end if;
-                  end;
-               end if;
-            end;
-
-            if Current_Verbosity = High then
-               Write_Str  ("  Casing = ");
-               Write_Str  (Image (Data.Naming.Casing));
-               Write_Char ('.');
-               Write_Eol;
-            end if;
-
-            --  Check Spec_Suffix
-
-            declare
-               Ada_Spec_Suffix : constant Variable_Value :=
-                                   Prj.Util.Value_Of
-                                     (Index     => Name_Ada,
-                                      Src_Index => 0,
-                                      In_Array  => Data.Naming.Spec_Suffix,
-                                      In_Tree   => In_Tree);
-
-            begin
-               if Ada_Spec_Suffix.Kind = Single
-                 and then Get_Name_String (Ada_Spec_Suffix.Value) /= ""
-               then
-                  Get_Name_String (Ada_Spec_Suffix.Value);
-                  Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-                  Set_Spec_Suffix (In_Tree, "ada", Data.Naming, Name_Find);
-                  Data.Naming.Ada_Spec_Suffix_Loc := Ada_Spec_Suffix.Location;
-
-               else
-                  Set_Spec_Suffix
-                    (In_Tree,
-                     "ada",
-                     Data.Naming,
-                     Default_Ada_Spec_Suffix);
-               end if;
-            end;
-
-            if Current_Verbosity = High then
-               Write_Str  ("  Spec_Suffix = """);
-               Write_Str  (Spec_Suffix_Of (In_Tree, "ada", Data.Naming));
-               Write_Char ('"');
-               Write_Eol;
-            end if;
-
-            --  Check Body_Suffix
-
-            declare
-               Ada_Body_Suffix : constant Variable_Value :=
-                                   Prj.Util.Value_Of
-                                     (Index     => Name_Ada,
-                                      Src_Index => 0,
-                                      In_Array  => Data.Naming.Body_Suffix,
-                                      In_Tree   => In_Tree);
-
-            begin
-               if Ada_Body_Suffix.Kind = Single
-                 and then Get_Name_String (Ada_Body_Suffix.Value) /= ""
-               then
-                  Get_Name_String (Ada_Body_Suffix.Value);
-                  Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-                  Set_Body_Suffix (In_Tree, "ada", Data.Naming, Name_Find);
-                  Data.Naming.Ada_Body_Suffix_Loc := Ada_Body_Suffix.Location;
-
-               else
-                  Set_Body_Suffix
-                    (In_Tree,
-                     "ada",
-                     Data.Naming,
-                     Default_Ada_Body_Suffix);
-               end if;
-            end;
-
-            if Current_Verbosity = High then
-               Write_Str  ("  Body_Suffix = """);
-               Write_Str  (Body_Suffix_Of (In_Tree, "ada", Data.Naming));
-               Write_Char ('"');
-               Write_Eol;
-            end if;
-
-            --  Check Separate_Suffix
-
-            declare
-               Ada_Sep_Suffix : constant Variable_Value :=
-                                  Prj.Util.Value_Of
-                                    (Variable_Name => Name_Separate_Suffix,
-                                     In_Variables  => Naming.Decl.Attributes,
-                                     In_Tree       => In_Tree);
-
-            begin
-               if Ada_Sep_Suffix.Default then
-                  Data.Naming.Separate_Suffix :=
-                    Body_Suffix_Id_Of (In_Tree, Name_Ada, Data.Naming);
-
-               else
-                  Get_Name_String (Ada_Sep_Suffix.Value);
-
-                  if Name_Len = 0 then
-                     Error_Msg
-                       (Project, In_Tree,
-                        "Separate_Suffix cannot be empty",
-                        Ada_Sep_Suffix.Location);
+      ---------------------------
+      -- Check_Naming_Ada_Only --
+      ---------------------------
 
-                  else
-                     Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-                     Data.Naming.Separate_Suffix := Name_Find;
-                     Data.Naming.Sep_Suffix_Loc  := Ada_Sep_Suffix.Location;
-                  end if;
-               end if;
-            end;
+      procedure Check_Naming_Ada_Only is
+         Casing_Defined : Boolean;
+      begin
+         Data.Naming.Bodies :=
+           Util.Value_Of (Name_Body, Naming.Decl.Arrays, In_Tree);
 
-            if Current_Verbosity = High then
-               Write_Str  ("  Separate_Suffix = """);
-               Write_Str  (Get_Name_String (Data.Naming.Separate_Suffix));
-               Write_Char ('"');
-               Write_Eol;
-            end if;
+         if Data.Naming.Bodies /= No_Array_Element then
+            Check_And_Normalize_Unit_Names
+              (Project, In_Tree, Data.Naming.Bodies, "Naming.Bodies");
+         end if;
 
-            --  Check if Data.Naming is valid
+         Data.Naming.Specs :=
+           Util.Value_Of (Name_Spec, Naming.Decl.Arrays, In_Tree);
 
-            Check_Ada_Naming_Scheme_Validity (Project, In_Tree, Data.Naming);
+         if Data.Naming.Specs /= No_Array_Element then
+            Check_And_Normalize_Unit_Names
+              (Project, In_Tree, Data.Naming.Specs, "Naming.Specs");
          end if;
 
-      elsif not In_Configuration then
+         --  Check Spec_Suffix
 
-         --  Look into package Naming, if there is one
+         declare
+            Ada_Spec_Suffix : constant Variable_Value :=
+              Prj.Util.Value_Of
+                (Index     => Name_Ada,
+                 Src_Index => 0,
+                 In_Array  => Data.Naming.Spec_Suffix,
+                 In_Tree   => In_Tree);
 
-         if Naming_Id /= No_Package then
-            Naming := In_Tree.Packages.Table (Naming_Id);
+         begin
+            if Ada_Spec_Suffix.Kind = Single
+              and then Get_Name_String (Ada_Spec_Suffix.Value) /= ""
+            then
+               Set_Spec_Suffix
+                 (In_Tree, "ada", Data.Naming,
+                  Canonical_Case_File_Name (Ada_Spec_Suffix.Value));
+               Data.Naming.Ada_Spec_Suffix_Loc := Ada_Spec_Suffix.Location;
 
-            if Current_Verbosity = High then
-               Write_Line ("Checking package Naming.");
+            else
+               Set_Spec_Suffix
+                 (In_Tree, "ada", Data.Naming, Default_Ada_Spec_Suffix);
             end if;
 
-            --  We are now checking if attribute Dot_Replacement, Casing,
-            --  and/or Separate_Suffix exist.
+            Write_Attr
+              ("Spec_Suffix", Spec_Suffix_Of (In_Tree, "ada", Data.Naming));
+         end;
 
-            --  For each attribute, if it does not exist, we do nothing,
-            --  because we already have the default.
-            --  Otherwise, for all unit-based languages, we put the declared
-            --  value in the language config.
+         --  Check Body_Suffix
 
-            declare
-               Dot_Repl        : constant Variable_Value :=
-                                   Util.Value_Of
-                                     (Name_Dot_Replacement,
-                                      Naming.Decl.Attributes, In_Tree);
-               Dot_Replacement : File_Name_Type := No_File;
+         declare
+            Ada_Body_Suffix : constant Variable_Value :=
+              Prj.Util.Value_Of
+                (Index     => Name_Ada,
+                 Src_Index => 0,
+                 In_Array  => Data.Naming.Body_Suffix,
+                 In_Tree   => In_Tree);
 
-               Casing_String : constant Variable_Value :=
-                                 Util.Value_Of
-                                   (Name_Casing,
-                                    Naming.Decl.Attributes,
-                                    In_Tree);
+         begin
+            if Ada_Body_Suffix.Kind = Single
+              and then Get_Name_String (Ada_Body_Suffix.Value) /= ""
+            then
+               Data.Naming.Separate_Suffix :=
+                 Canonical_Case_File_Name (Ada_Body_Suffix.Value);
+               Set_Body_Suffix
+                 (In_Tree, "ada", Data.Naming, Data.Naming.Separate_Suffix);
+               Data.Naming.Ada_Body_Suffix_Loc := Ada_Body_Suffix.Location;
 
-               Casing : Casing_Type := All_Lower_Case;
-               --  Casing type (junk initialization to stop bad gcc warning)
+            else
+               Data.Naming.Separate_Suffix := Default_Ada_Body_Suffix;
+               Set_Body_Suffix
+                 (In_Tree, "ada", Data.Naming, Default_Ada_Body_Suffix);
+            end if;
 
-               Casing_Defined : Boolean := False;
+            Write_Attr
+              ("Body_Suffix", Body_Suffix_Of (In_Tree, "ada", Data.Naming));
+         end;
 
-               Sep_Suffix : constant Variable_Value :=
-                              Prj.Util.Value_Of
-                                (Variable_Name => Name_Separate_Suffix,
-                                 In_Variables  => Naming.Decl.Attributes,
-                                 In_Tree       => In_Tree);
+         Check_Common
+           (Dot_Replacement => Data.Naming.Dot_Replacement,
+            Casing          => Data.Naming.Casing,
+            Casing_Defined  => Casing_Defined,
+            Separate_Suffix => Data.Naming.Separate_Suffix,
+            Sep_Suffix_Loc  => Data.Naming.Sep_Suffix_Loc);
 
-               Separate_Suffix : File_Name_Type := No_File;
-               Lang_Id         : Language_Index;
+         Check_Ada_Naming_Scheme_Validity (Project, In_Tree, Data.Naming);
+      end Check_Naming_Ada_Only;
 
-            begin
-               --  Check attribute Dot_Replacement
+      -----------------------------
+      -- Check_Naming_Multi_Lang --
+      -----------------------------
 
-               if not Dot_Repl.Default then
-                  Get_Name_String (Dot_Repl.Value);
+      procedure Check_Naming_Multi_Lang is
+      begin
+         --  We are now checking if attribute Dot_Replacement, Casing,
+         --  and/or Separate_Suffix exist.
 
-                  if Name_Len = 0 then
-                     Error_Msg
-                       (Project, In_Tree,
-                        "Dot_Replacement cannot be empty",
-                        Dot_Repl.Location);
+         --  For each attribute, if it does not exist, we do nothing,
+         --  because we already have the default.
+         --  Otherwise, for all unit-based languages, we put the declared
+         --  value in the language config.
 
-                  else
-                     Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-                     Dot_Replacement := Name_Find;
+         declare
+            Dot_Replacement : File_Name_Type := No_File;
+            Separate_Suffix : File_Name_Type := No_File;
+            Sep_Suffix_Loc  : Source_Ptr     := No_Location;
+            Casing          : Casing_Type    := All_Lower_Case;
+            Casing_Defined  : Boolean;
+            Lang_Id         : Language_Index;
 
-                     if Current_Verbosity = High then
-                        Write_Str  ("  Dot_Replacement = """);
-                        Write_Str  (Get_Name_String (Dot_Replacement));
-                        Write_Char ('"');
-                        Write_Eol;
+         begin
+            Check_Common
+              (Dot_Replacement => Dot_Replacement,
+               Casing          => Casing,
+               Casing_Defined  => Casing_Defined,
+               Separate_Suffix => Separate_Suffix,
+               Sep_Suffix_Loc  => Sep_Suffix_Loc);
+
+            --  For all unit based languages, if any, set the specified
+            --  value of Dot_Replacement, Casing and/or Separate_Suffix. Do not
+            --  systematically overwrite, since the defaults come from the
+            --  configuration file
+
+            if Dot_Replacement /= No_File
+              or else Casing_Defined
+              or else Separate_Suffix /= No_File
+            then
+               Lang_Id := Data.First_Language_Processing;
+               while Lang_Id /= No_Language_Index loop
+                  if In_Tree.Languages_Data.Table
+                    (Lang_Id).Config.Kind = Unit_Based
+                  then
+                     if Dot_Replacement /= No_File then
+                        In_Tree.Languages_Data.Table
+                          (Lang_Id).Config.Naming_Data.Dot_Replacement :=
+                          Dot_Replacement;
                      end if;
-                  end if;
-               end if;
-
-               --  Check attribute Casing
-
-               if not Casing_String.Default then
-                  declare
-                     Casing_Image : constant String :=
-                                      Get_Name_String (Casing_String.Value);
-                  begin
-                     declare
-                        Casing_Value : constant Casing_Type :=
-                                         Value (Casing_Image);
-                     begin
-                        Casing := Casing_Value;
-                        Casing_Defined := True;
-
-                        if Current_Verbosity = High then
-                           Write_Str  ("  Casing = ");
-                           Write_Str  (Image (Casing));
-                           Write_Char ('.');
-                           Write_Eol;
-                        end if;
-                     end;
 
-                  exception
-                     when Constraint_Error =>
-                        if Casing_Image'Length = 0 then
-                           Error_Msg
-                             (Project, In_Tree,
-                              "Casing cannot be an empty string",
-                              Casing_String.Location);
-
-                        else
-                           Name_Len := Casing_Image'Length;
-                           Name_Buffer (1 .. Name_Len) := Casing_Image;
-                           Err_Vars.Error_Msg_Name_1 := Name_Find;
-                           Error_Msg
-                             (Project, In_Tree,
-                              "%% is not a correct Casing",
-                              Casing_String.Location);
-                        end if;
-                  end;
-               end if;
-
-               if not Sep_Suffix.Default then
-                  Get_Name_String (Sep_Suffix.Value);
-
-                  if Name_Len = 0 then
-                     Error_Msg
-                       (Project, In_Tree,
-                        "Separate_Suffix cannot be empty",
-                        Sep_Suffix.Location);
-
-                  else
-                     Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-                     Separate_Suffix := Name_Find;
+                     if Casing_Defined then
+                        In_Tree.Languages_Data.Table
+                          (Lang_Id).Config.Naming_Data.Casing := Casing;
+                     end if;
 
-                     if Current_Verbosity = High then
-                        Write_Str ("  Separate_Suffix = """);
-                        Write_Str (Get_Name_String (Separate_Suffix));
-                        Write_Char ('"');
-                        Write_Eol;
+                     if Separate_Suffix /= No_File then
+                        In_Tree.Languages_Data.Table
+                          (Lang_Id).Config.Naming_Data.Separate_Suffix :=
+                          Separate_Suffix;
                      end if;
                   end if;
-               end if;
-
-               --  For all unit based languages, if any, set the specified
-               --  value of Dot_Replacement, Casing and/or Separate_Suffix.
 
-               if Dot_Replacement /= No_File
-                 or else Casing_Defined
-                 or else Separate_Suffix /= No_File
-               then
-                  Lang_Id := Data.First_Language_Processing;
-                  while Lang_Id /= No_Language_Index loop
-                     if In_Tree.Languages_Data.Table
-                       (Lang_Id).Config.Kind = Unit_Based
-                     then
-                        if Dot_Replacement /= No_File then
-                           In_Tree.Languages_Data.Table
-                             (Lang_Id).Config.Naming_Data.Dot_Replacement :=
-                             Dot_Replacement;
-                        end if;
-
-                        if Casing_Defined then
-                           In_Tree.Languages_Data.Table
-                             (Lang_Id).Config.Naming_Data.Casing := Casing;
-                        end if;
-
-                        if Separate_Suffix /= No_File then
-                           In_Tree.Languages_Data.Table
-                             (Lang_Id).Config.Naming_Data.Separate_Suffix :=
-                               Separate_Suffix;
-                        end if;
-                     end if;
+                  Lang_Id :=
+                    In_Tree.Languages_Data.Table (Lang_Id).Next;
+               end loop;
+            end if;
+         end;
 
-                     Lang_Id :=
-                       In_Tree.Languages_Data.Table (Lang_Id).Next;
-                  end loop;
-               end if;
-            end;
+         --  Next, get the spec and body suffixes
 
-            --  Next, get the spec and body suffixes
+         declare
+            Suffix  : Variable_Value;
+            Lang_Id : Language_Index;
+            Lang    : Name_Id;
 
-            declare
-               Suffix  : Variable_Value;
-               Lang_Id : Language_Index;
-               Lang    : Name_Id;
+         begin
+            Lang_Id := Data.First_Language_Processing;
+            while Lang_Id /= No_Language_Index loop
+               Lang := In_Tree.Languages_Data.Table (Lang_Id).Name;
 
-            begin
-               Lang_Id := Data.First_Language_Processing;
-               while Lang_Id /= No_Language_Index loop
-                  Lang := In_Tree.Languages_Data.Table (Lang_Id).Name;
+               --  Spec_Suffix
 
-                  --  Spec_Suffix
+               Suffix := Value_Of
+                 (Name                    => Lang,
+                  Attribute_Or_Array_Name => Name_Spec_Suffix,
+                  In_Package              => Naming_Id,
+                  In_Tree                 => In_Tree);
 
+               if Suffix = Nil_Variable_Value then
                   Suffix := Value_Of
                     (Name                    => Lang,
-                     Attribute_Or_Array_Name => Name_Spec_Suffix,
+                     Attribute_Or_Array_Name => Name_Specification_Suffix,
                      In_Package              => Naming_Id,
                      In_Tree                 => In_Tree);
+               end if;
 
-                  if Suffix = Nil_Variable_Value then
-                     Suffix := Value_Of
-                       (Name                    => Lang,
-                        Attribute_Or_Array_Name => Name_Specification_Suffix,
-                        In_Package              => Naming_Id,
-                        In_Tree                 => In_Tree);
-                  end if;
+               if Suffix /= Nil_Variable_Value then
+                  In_Tree.Languages_Data.Table (Lang_Id).
+                    Config.Naming_Data.Spec_Suffix :=
+                      File_Name_Type (Suffix.Value);
+               end if;
 
-                  if Suffix /= Nil_Variable_Value then
-                     In_Tree.Languages_Data.Table (Lang_Id).
-                       Config.Naming_Data.Spec_Suffix :=
-                         File_Name_Type (Suffix.Value);
-                  end if;
+               --  Body_Suffix
 
-                  --  Body_Suffix
+               Suffix := Value_Of
+                 (Name                    => Lang,
+                  Attribute_Or_Array_Name => Name_Body_Suffix,
+                  In_Package              => Naming_Id,
+                  In_Tree                 => In_Tree);
 
+               if Suffix = Nil_Variable_Value then
                   Suffix := Value_Of
                     (Name                    => Lang,
-                     Attribute_Or_Array_Name => Name_Body_Suffix,
+                     Attribute_Or_Array_Name => Name_Implementation_Suffix,
                      In_Package              => Naming_Id,
                      In_Tree                 => In_Tree);
+               end if;
 
-                  if Suffix = Nil_Variable_Value then
-                     Suffix := Value_Of
-                       (Name                    => Lang,
-                        Attribute_Or_Array_Name => Name_Implementation_Suffix,
-                        In_Package              => Naming_Id,
-                        In_Tree                 => In_Tree);
-                  end if;
+               if Suffix /= Nil_Variable_Value then
+                  In_Tree.Languages_Data.Table (Lang_Id).
+                    Config.Naming_Data.Body_Suffix :=
+                      File_Name_Type (Suffix.Value);
+               end if;
 
-                  if Suffix /= Nil_Variable_Value then
-                     In_Tree.Languages_Data.Table (Lang_Id).
-                       Config.Naming_Data.Body_Suffix :=
-                         File_Name_Type (Suffix.Value);
-                  end if;
+               Lang_Id := In_Tree.Languages_Data.Table (Lang_Id).Next;
+            end loop;
+         end;
 
-                  Lang_Id := In_Tree.Languages_Data.Table (Lang_Id).Next;
-               end loop;
-            end;
+         --  Get the exceptions for file based languages
+
+         Get_Exceptions (Spec);
+         Get_Exceptions (Impl);
 
-            --  Get the exceptions for file based languages
+         --  Get the exceptions for unit based languages
 
-            Get_Exceptions (Spec);
-            Get_Exceptions (Impl);
+         Get_Unit_Exceptions (Spec);
+         Get_Unit_Exceptions (Impl);
+      end Check_Naming_Multi_Lang;
 
-            --  Get the exceptions for unit based languages
+   --  Start of processing for Check_Naming_Schemes
 
-            Get_Unit_Exceptions (Spec);
-            Get_Unit_Exceptions (Impl);
+   begin
+      --  No Naming package or parsing a configuration file ? nothing to do
+      if Naming_Id /= No_Package and not In_Configuration then
+         Naming := In_Tree.Packages.Table (Naming_Id);
 
+         if Current_Verbosity = High then
+            Write_Line ("Checking package Naming.");
          end if;
+
+         case Get_Mode is
+            when Ada_Only =>
+               Check_Naming_Ada_Only;
+            when Multi_Language =>
+               Check_Naming_Multi_Lang;
+         end case;
       end if;
    end Check_Naming_Schemes;
 
@@ -3819,9 +3683,7 @@ package body Prj.Nmsc is
 
       if Data.Library_Name /= No_Name then
          if Current_Verbosity = High then
-            Write_Str ("Library name = """);
-            Write_Str (Get_Name_String (Data.Library_Name));
-            Write_Line ("""");
+            Write_Attr ("Library name", Get_Name_String (Data.Library_Name));
          end if;
 
          pragma Assert (Lib_Dir.Kind = Single);
@@ -3969,10 +3831,9 @@ package body Prj.Nmsc is
 
                      --  Display the Library directory in high verbosity
 
-                     Write_Str ("Library directory =""");
-                     Write_Str
-                       (Get_Name_String (Data.Library_Dir.Display_Name));
-                     Write_Line ("""");
+                     Write_Attr
+                       ("Library directory",
+                        Get_Name_String (Data.Library_Dir.Display_Name));
                   end if;
                end;
             end if;
@@ -4185,11 +4046,10 @@ package body Prj.Nmsc is
                            --  Display the Library ALI directory in high
                            --  verbosity.
 
-                           Write_Str ("Library ALI directory =""");
-                           Write_Str
-                             (Get_Name_String
+                           Write_Attr
+                             ("Library ALI dir",
+                              Get_Name_String
                                 (Data.Library_ALI_Dir.Display_Name));
-                           Write_Line ("""");
                         end if;
                      end;
                   end if;
@@ -4242,8 +4102,7 @@ package body Prj.Nmsc is
                   end if;
 
                   if Current_Verbosity = High and then OK then
-                     Write_Str ("Library kind = ");
-                     Write_Line (Kind_Name);
+                     Write_Attr ("Library kind", Kind_Name);
                   end if;
 
                   if Data.Library_Kind /= Static then
@@ -5351,9 +5210,9 @@ package body Prj.Nmsc is
                   if Data.Library_Src_Dir /= No_Path_Information
                     and then Current_Verbosity = High
                   then
-                     Write_Str ("Directory to copy interfaces =""");
-                     Write_Str (Get_Name_String (Data.Library_Src_Dir.Name));
-                     Write_Line ("""");
+                     Write_Attr
+                       ("Directory to copy interfaces",
+                        Get_Name_String (Data.Library_Src_Dir.Name));
                   end if;
                end if;
             end;
@@ -5766,8 +5625,7 @@ package body Prj.Nmsc is
 
                begin
                   if Current_Verbosity = High then
-                     Write_Str ("Source_Dir = ");
-                     Write_Line (Source_Directory);
+                     Write_Attr ("Source_Dir", Source_Directory);
                   end if;
 
                   --  We look at every entry in the source directory
@@ -5957,14 +5815,8 @@ package body Prj.Nmsc is
             Name_Buffer (1 .. Name_Len) :=
               The_Path (The_Path'First .. The_Path_Last);
             Non_Canonical_Path := Name_Find;
-
-            if Osint.File_Names_Case_Sensitive then
-               Canonical_Path := Non_Canonical_Path;
-            else
-               Get_Name_String (Non_Canonical_Path);
-               Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-               Canonical_Path := Name_Find;
-            end if;
+            Canonical_Path :=
+              Name_Id (Canonical_Case_File_Name (Non_Canonical_Path));
 
             --  To avoid processing the same directory several times, check
             --  if the directory is already in Recursive_Dirs. If it is, then
@@ -6386,15 +6238,8 @@ package body Prj.Nmsc is
 
                Data.Object_Directory.Display_Name :=
                  Path_Name_Type (Object_Dir.Value);
-
-               if Osint.File_Names_Case_Sensitive then
-                  Data.Object_Directory.Name :=
-                    Path_Name_Type (Object_Dir.Value);
-               else
-                  Get_Name_String (Object_Dir.Value);
-                  Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-                  Data.Object_Directory.Name := Name_Find;
-               end if;
+               Data.Object_Directory.Name :=
+                 Path_Name_Type (Canonical_Case_File_Name (Object_Dir.Value));
             end if;
          end if;
 
@@ -6420,9 +6265,9 @@ package body Prj.Nmsc is
          if Data.Object_Directory = No_Path_Information then
             Write_Line ("No object directory");
          else
-            Write_Str ("Object directory: """);
-            Write_Str (Get_Name_String (Data.Object_Directory.Display_Name));
-            Write_Line ("""");
+            Write_Attr
+              ("Object directory",
+               Get_Name_String (Data.Object_Directory.Display_Name));
          end if;
       end if;
 
@@ -6515,10 +6360,9 @@ package body Prj.Nmsc is
             Index         => 0);
 
          if Current_Verbosity = High then
-            Write_Line ("Single source directory:");
-            Write_Str ("    """);
-            Write_Str (Get_Name_String (Data.Directory.Display_Name));
-            Write_Line ("""");
+            Write_Attr
+              ("Single source directory",
+               Get_Name_String (Data.Directory.Display_Name));
          end if;
 
       elsif Source_Dirs.Values = Nil_String then
@@ -6584,12 +6428,8 @@ package body Prj.Nmsc is
          while Current /= Nil_String loop
             Element := In_Tree.String_Elements.Table (Current);
             if Element.Value /= No_Name then
-               if not Osint.File_Names_Case_Sensitive then
-                  Get_Name_String (Element.Value);
-                  Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-                  Element.Value := Name_Find;
-               end if;
-
+               Element.Value :=
+                 Name_Id (Canonical_Case_File_Name (Name_Id (Element.Value)));
                In_Tree.String_Elements.Table (Current) := Element;
             end if;
 
@@ -7256,32 +7096,20 @@ package body Prj.Nmsc is
       In_Tree : Project_Tree_Ref;
       Data    : Project_Data)
    is
-      Excluded_Sources : Variable_Value;
-
-      Excluded_Source_List_File : Variable_Value;
-
-      Current          : String_List_Id;
-
-      Element : String_Element;
-
-      Location : Source_Ptr;
-
-      Name : File_Name_Type;
-
-      File : Prj.Util.Text_File;
-      Line : String (1 .. 300);
-      Last : Natural;
-
-      Locally_Removed : Boolean := False;
+      Excluded_Source_List_File : constant Variable_Value := Util.Value_Of
+        (Name_Excluded_Source_List_File, Data.Decl.Attributes, In_Tree);
+      Excluded_Sources          : Variable_Value := Util.Value_Of
+        (Name_Excluded_Source_Files, Data.Decl.Attributes, In_Tree);
+
+      Current                   : String_List_Id;
+      Element                   : String_Element;
+      Location                  : Source_Ptr;
+      Name                      : File_Name_Type;
+      File                      : Prj.Util.Text_File;
+      Line                      : String (1 .. 300);
+      Last                      : Natural;
+      Locally_Removed           : Boolean := False;
    begin
-      Excluded_Source_List_File :=
-        Util.Value_Of
-          (Name_Excluded_Source_List_File, Data.Decl.Attributes, In_Tree);
-
-      Excluded_Sources :=
-        Util.Value_Of
-          (Name_Excluded_Source_Files, Data.Decl.Attributes, In_Tree);
-
       --  If Excluded_Source_Files is not declared, check
       --  Locally_Removed_Files.
 
@@ -7316,14 +7144,7 @@ package body Prj.Nmsc is
          Current := Excluded_Sources.Values;
          while Current /= Nil_String loop
             Element := In_Tree.String_Elements.Table (Current);
-
-            if Osint.File_Names_Case_Sensitive then
-               Name := File_Name_Type (Element.Value);
-            else
-               Get_Name_String (Element.Value);
-               Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-               Name := Name_Find;
-            end if;
+            Name := Canonical_Case_File_Name (Element.Value);
 
             --  If the element has no location, then use the location
             --  of Excluded_Sources to report possible errors.
@@ -7483,15 +7304,9 @@ package body Prj.Nmsc is
 
             while Current /= Nil_String loop
                Element := In_Tree.String_Elements.Table (Current);
+               Name := Canonical_Case_File_Name (Element.Value);
                Get_Name_String (Element.Value);
 
-               if Osint.File_Names_Case_Sensitive then
-                  Name := File_Name_Type (Element.Value);
-               else
-                  Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-                  Name := Name_Find;
-               end if;
-
                --  If the element has no location, then use the
                --  location of Sources to report possible errors.
 
@@ -8518,8 +8333,7 @@ package body Prj.Nmsc is
 
                begin
                   if Current_Verbosity = High then
-                     Write_Str ("Source_Dir = ");
-                     Write_Line (Source_Directory);
+                     Write_Attr ("Source_Dir", Source_Directory);
                   end if;
 
                   --  We look to every entry in the source directory
@@ -8900,21 +8714,21 @@ package body Prj.Nmsc is
       Source_Names.Reset;
       Find_Excluded_Sources (Project, In_Tree, Data);
 
-      case Get_Mode is
-         when Ada_Only =>
-            if Is_A_Language (In_Tree, Data, Name_Ada) then
-               Find_Explicit_Sources (Current_Dir, Project, In_Tree, Data);
-               Mark_Excluded_Sources;
-            end if;
+      if (Get_Mode = Ada_Only and then Is_A_Language (In_Tree, Data, Name_Ada))
+        or else (Get_Mode = Multi_Language
+                 and then Data.First_Language_Processing /= No_Language_Index)
+      then
+         if Get_Mode = Multi_Language then
+            Load_Naming_Exceptions (Project, In_Tree, Data);
+         end if;
 
-         when Multi_Language =>
-            if Data.First_Language_Processing /= No_Language_Index then
-               Load_Naming_Exceptions (Project, In_Tree, Data);
-               Find_Explicit_Sources (Current_Dir, Project, In_Tree, Data);
-               Mark_Excluded_Sources;
-               Process_Sources_In_Multi_Language_Mode;
-            end if;
-      end case;
+         Find_Explicit_Sources (Current_Dir, Project, In_Tree, Data);
+         Mark_Excluded_Sources;
+
+         if Get_Mode = Multi_Language then
+            Process_Sources_In_Multi_Language_Mode;
+         end if;
+      end if;
    end Look_For_Sources;
 
    ------------------
@@ -9024,14 +8838,11 @@ package body Prj.Nmsc is
       File_Name_Recorded : Boolean := False;
 
    begin
+      Canonical_File_Name := Canonical_Case_File_Name (Name_Id (File_Name));
+
       if Osint.File_Names_Case_Sensitive then
-         Canonical_File_Name := File_Name;
          Canonical_Path_Name := Path_Name;
       else
-         Get_Name_String (File_Name);
-         Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
-         Canonical_File_Name := Name_Find;
-
          declare
             Canonical_Path : constant String :=
                                Normalize_Pathname
index 933df7fd97ef8094e9e1ded55b7d9d499deab84f..a5cb0c85e1121d1c66b9f15bb589dd3fd2bca6fe 100644 (file)
@@ -2519,7 +2519,67 @@ package body Prj.Proc is
       From_Project_Node_Tree : Project_Node_Tree_Ref;
       Extended_By            : Project_Id)
    is
-      With_Clause : Project_Node_Id;
+      procedure Process_Imported_Projects
+        (Imported     : in out Project_List;
+         Limited_With : Boolean);
+      --  Process imported projects. If Limited_With is True, then only
+      --  projects processed through a "limited with" are processed, otherwise
+      --  only projects imported through a standard "with" are processed.
+      --  Imported is the id of the last imported project.
+
+      procedure Process_Imported_Projects
+        (Imported     : in out Project_List;
+         Limited_With : Boolean)
+      is
+         With_Clause : Project_Node_Id := First_With_Clause_Of
+           (From_Project_Node, From_Project_Node_Tree);
+         New_Project : Project_Id;
+         Proj_Node   : Project_Node_Id;
+      begin
+         while Present (With_Clause) loop
+            Proj_Node :=
+              Non_Limited_Project_Node_Of
+                (With_Clause, From_Project_Node_Tree);
+            New_Project := No_Project;
+
+            if (Limited_With and No (Proj_Node))
+              or (not Limited_With and Present (Proj_Node))
+            then
+               Recursive_Process
+                 (In_Tree                => In_Tree,
+                  Project                => New_Project,
+                  From_Project_Node      =>
+                    Project_Node_Of
+                      (With_Clause, From_Project_Node_Tree),
+                  From_Project_Node_Tree => From_Project_Node_Tree,
+                  Extended_By            => No_Project);
+
+               --  Add this project to our list of imported projects
+
+               Project_List_Table.Increment_Last (In_Tree.Project_Lists);
+
+               In_Tree.Project_Lists.Table
+                 (Project_List_Table.Last (In_Tree.Project_Lists)) :=
+                 (Project => New_Project, Next => Empty_Project_List);
+
+               --  Imported is the id of the last imported project. If
+               --  it is nil, then this imported project is our first.
+
+               if Imported = Empty_Project_List then
+                  In_Tree.Projects.Table (Project).Imported_Projects :=
+                    Project_List_Table.Last (In_Tree.Project_Lists);
+               else
+                  In_Tree.Project_Lists.Table (Imported).Next :=
+                    Project_List_Table.Last (In_Tree.Project_Lists);
+               end if;
+
+               Imported := Project_List_Table.Last (In_Tree.Project_Lists);
+            end if;
+
+            With_Clause :=
+              Next_With_Clause_Of (With_Clause, From_Project_Node_Tree);
+         end loop;
+      end Process_Imported_Projects;
 
    begin
       if No (From_Project_Node) then
@@ -2624,68 +2684,9 @@ package body Prj.Proc is
                Prj.Attr.Attribute_First,
                Project_Level => True);
 
-            --  Process non limited withed projects
-
-            With_Clause :=
-              First_With_Clause_Of (From_Project_Node, From_Project_Node_Tree);
-            while Present (With_Clause) loop
-               declare
-                  New_Project : Project_Id;
-                  New_Data    : Project_Data;
-                  pragma Unreferenced (New_Data);
-                  Proj_Node   : Project_Node_Id;
-
-               begin
-                  Proj_Node :=
-                    Non_Limited_Project_Node_Of
-                      (With_Clause, From_Project_Node_Tree);
-
-                  if Present (Proj_Node) then
-                     Recursive_Process
-                       (In_Tree                => In_Tree,
-                        Project                => New_Project,
-                        From_Project_Node      =>
-                          Project_Node_Of
-                            (With_Clause, From_Project_Node_Tree),
-                        From_Project_Node_Tree => From_Project_Node_Tree,
-                        Extended_By            => No_Project);
-
-                     New_Data :=
-                       In_Tree.Projects.Table (New_Project);
-
-                     --  Add this project to our list of imported projects
-
-                     Project_List_Table.Increment_Last
-                       (In_Tree.Project_Lists);
-
-                     In_Tree.Project_Lists.Table
-                       (Project_List_Table.Last
-                          (In_Tree.Project_Lists)) :=
-                       (Project => New_Project, Next => Empty_Project_List);
-
-                     --  Imported is the id of the last imported project. If it
-                     --  is nil, then this imported project is our first.
-
-                     if Imported = Empty_Project_List then
-                        Processed_Data.Imported_Projects :=
-                          Project_List_Table.Last
-                            (In_Tree.Project_Lists);
-
-                     else
-                        In_Tree.Project_Lists.Table
-                          (Imported).Next := Project_List_Table.Last
-                          (In_Tree.Project_Lists);
-                     end if;
-
-                     Imported := Project_List_Table.Last
-                       (In_Tree.Project_Lists);
-                  end if;
+            In_Tree.Projects.Table (Project) := Processed_Data;
 
-                  With_Clause :=
-                    Next_With_Clause_Of
-                      (With_Clause, From_Project_Node_Tree);
-               end;
-            end loop;
+            Process_Imported_Projects (Imported, Limited_With => False);
 
             Declaration_Node :=
               Project_Declaration_Of
@@ -2693,15 +2694,13 @@ package body Prj.Proc is
 
             Recursive_Process
               (In_Tree                => In_Tree,
-               Project                => Processed_Data.Extends,
+               Project            => In_Tree.Projects.Table (Project).Extends,
                From_Project_Node      => Extended_Project_Of
                                           (Declaration_Node,
                                            From_Project_Node_Tree),
                From_Project_Node_Tree => From_Project_Node_Tree,
                Extended_By            => Project);
 
-            In_Tree.Projects.Table (Project) := Processed_Data;
-
             Process_Declarative_Items
               (Project                => Project,
                In_Tree                => In_Tree,
@@ -2826,68 +2825,7 @@ package body Prj.Proc is
                In_Tree.Projects.Table (Project) := Processed_Data;
             end if;
 
-            --  Process limited withed projects
-
-            With_Clause :=
-              First_With_Clause_Of
-                (From_Project_Node, From_Project_Node_Tree);
-            while Present (With_Clause) loop
-               declare
-                  New_Project : Project_Id;
-                  New_Data    : Project_Data;
-                  pragma Unreferenced (New_Data);
-                  Proj_Node   : Project_Node_Id;
-
-               begin
-                  Proj_Node :=
-                    Non_Limited_Project_Node_Of
-                      (With_Clause, From_Project_Node_Tree);
-
-                  if No (Proj_Node) then
-                     Recursive_Process
-                       (In_Tree                => In_Tree,
-                        Project                => New_Project,
-                        From_Project_Node      =>
-                          Project_Node_Of
-                            (With_Clause, From_Project_Node_Tree),
-                        From_Project_Node_Tree => From_Project_Node_Tree,
-                        Extended_By            => No_Project);
-
-                     New_Data :=
-                       In_Tree.Projects.Table (New_Project);
-
-                     --  Add this project to our list of imported projects
-
-                     Project_List_Table.Increment_Last
-                       (In_Tree.Project_Lists);
-
-                     In_Tree.Project_Lists.Table
-                       (Project_List_Table.Last
-                          (In_Tree.Project_Lists)) :=
-                       (Project => New_Project, Next => Empty_Project_List);
-
-                     --  Imported is the id of the last imported project. If
-                     --  it is nil, then this imported project is our first.
-
-                     if Imported = Empty_Project_List then
-                        In_Tree.Projects.Table (Project).Imported_Projects :=
-                          Project_List_Table.Last
-                            (In_Tree.Project_Lists);
-                     else
-                        In_Tree.Project_Lists.Table
-                          (Imported).Next := Project_List_Table.Last
-                          (In_Tree.Project_Lists);
-                     end if;
-
-                     Imported := Project_List_Table.Last
-                       (In_Tree.Project_Lists);
-                  end if;
-
-                  With_Clause :=
-                    Next_With_Clause_Of
-                      (With_Clause, From_Project_Node_Tree);
-               end;
-            end loop;
+            Process_Imported_Projects (Imported, Limited_With => True);
          end;
       end if;
    end Recursive_Process;
index 5db41ff9089bd7d3d04e0105382722deeae1df2e..a1caea990fea036ffe1188780c8be7705e166fed 100644 (file)
@@ -73,7 +73,6 @@ package body Prj is
 
    Std_Naming_Data : constant Naming_Data :=
                        (Dot_Replacement           => Standard_Dot_Replacement,
-                        Dot_Repl_Loc              => No_Location,
                         Casing                    => All_Lower_Case,
                         Spec_Suffix               => No_Array_Element,
                         Ada_Spec_Suffix_Loc       => No_Location,
@@ -655,10 +654,9 @@ package body Prj is
       Extended  : Project_Id;
       In_Tree   : Project_Tree_Ref) return Boolean
    is
-      Proj : Project_Id;
+      Proj : Project_Id := Extending;
 
    begin
-      Proj := Extending;
       while Proj /= No_Project loop
          if Proj = Extended then
             return True;
index ab982ec4fcb2633161b4493a964e5e61e128ea1d..5282c38c088fec6b8e206efc960329bcc5338758 100644 (file)
@@ -870,8 +870,6 @@ package Prj is
       Dot_Replacement : File_Name_Type := No_File;
       --  The string to replace '.' in the source file name (for Ada)
 
-      Dot_Repl_Loc : Source_Ptr := No_Location;
-
       Casing : Casing_Type := All_Lower_Case;
       --  The casing of the source file name (for Ada)