annotate gcc/ada/xr_tabls.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- X R _ T A B L S --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 1998-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 with Types; use Types;
kono
parents:
diff changeset
27 with Osint;
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 with Ada.Unchecked_Conversion;
kono
parents:
diff changeset
30 with Ada.Unchecked_Deallocation;
kono
parents:
diff changeset
31 with Ada.Strings.Fixed;
kono
parents:
diff changeset
32 with Ada.Strings;
kono
parents:
diff changeset
33 with Ada.Text_IO;
kono
parents:
diff changeset
34 with Ada.Characters.Handling; use Ada.Characters.Handling;
kono
parents:
diff changeset
35 with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 with GNAT.OS_Lib; use GNAT.OS_Lib;
kono
parents:
diff changeset
38 with GNAT.Directory_Operations; use GNAT.Directory_Operations;
kono
parents:
diff changeset
39 with GNAT.HTable;
kono
parents:
diff changeset
40 with GNAT.Heap_Sort_G;
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 package body Xr_Tabls is
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 type HTable_Headers is range 1 .. 10000;
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 procedure Set_Next (E : File_Reference; Next : File_Reference);
kono
parents:
diff changeset
47 function Next (E : File_Reference) return File_Reference;
kono
parents:
diff changeset
48 function Get_Key (E : File_Reference) return Cst_String_Access;
kono
parents:
diff changeset
49 function Hash (F : Cst_String_Access) return HTable_Headers;
kono
parents:
diff changeset
50 function Equal (F1, F2 : Cst_String_Access) return Boolean;
kono
parents:
diff changeset
51 -- The five subprograms above are used to instantiate the static
kono
parents:
diff changeset
52 -- htable to store the files that should be processed.
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 package File_HTable is new GNAT.HTable.Static_HTable
kono
parents:
diff changeset
55 (Header_Num => HTable_Headers,
kono
parents:
diff changeset
56 Element => File_Record,
kono
parents:
diff changeset
57 Elmt_Ptr => File_Reference,
kono
parents:
diff changeset
58 Null_Ptr => null,
kono
parents:
diff changeset
59 Set_Next => Set_Next,
kono
parents:
diff changeset
60 Next => Next,
kono
parents:
diff changeset
61 Key => Cst_String_Access,
kono
parents:
diff changeset
62 Get_Key => Get_Key,
kono
parents:
diff changeset
63 Hash => Hash,
kono
parents:
diff changeset
64 Equal => Equal);
kono
parents:
diff changeset
65 -- A hash table to store all the files referenced in the
kono
parents:
diff changeset
66 -- application. The keys in this htable are the name of the files
kono
parents:
diff changeset
67 -- themselves, therefore it is assumed that the source path
kono
parents:
diff changeset
68 -- doesn't contain twice the same source or ALI file name
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 type Unvisited_Files_Record;
kono
parents:
diff changeset
71 type Unvisited_Files_Access is access Unvisited_Files_Record;
kono
parents:
diff changeset
72 type Unvisited_Files_Record is record
kono
parents:
diff changeset
73 File : File_Reference;
kono
parents:
diff changeset
74 Next : Unvisited_Files_Access;
kono
parents:
diff changeset
75 end record;
kono
parents:
diff changeset
76 -- A special list, in addition to File_HTable, that only stores
kono
parents:
diff changeset
77 -- the files that haven't been visited so far. Note that the File
kono
parents:
diff changeset
78 -- list points to some data in File_HTable, and thus should never be freed.
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 function Next (E : Declaration_Reference) return Declaration_Reference;
kono
parents:
diff changeset
81 procedure Set_Next (E, Next : Declaration_Reference);
kono
parents:
diff changeset
82 function Get_Key (E : Declaration_Reference) return Cst_String_Access;
kono
parents:
diff changeset
83 -- The subprograms above are used to instantiate the static
kono
parents:
diff changeset
84 -- htable to store the entities that have been found in the application
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 package Entities_HTable is new GNAT.HTable.Static_HTable
kono
parents:
diff changeset
87 (Header_Num => HTable_Headers,
kono
parents:
diff changeset
88 Element => Declaration_Record,
kono
parents:
diff changeset
89 Elmt_Ptr => Declaration_Reference,
kono
parents:
diff changeset
90 Null_Ptr => null,
kono
parents:
diff changeset
91 Set_Next => Set_Next,
kono
parents:
diff changeset
92 Next => Next,
kono
parents:
diff changeset
93 Key => Cst_String_Access,
kono
parents:
diff changeset
94 Get_Key => Get_Key,
kono
parents:
diff changeset
95 Hash => Hash,
kono
parents:
diff changeset
96 Equal => Equal);
kono
parents:
diff changeset
97 -- A hash table to store all the entities defined in the
kono
parents:
diff changeset
98 -- application. For each entity, we store a list of its reference
kono
parents:
diff changeset
99 -- locations as well.
kono
parents:
diff changeset
100 -- The keys in this htable should be created with Key_From_Ref,
kono
parents:
diff changeset
101 -- and are the file, line and column of the declaration, which are
kono
parents:
diff changeset
102 -- unique for every entity.
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 Entities_Count : Natural := 0;
kono
parents:
diff changeset
105 -- Number of entities in Entities_HTable. This is used in the end
kono
parents:
diff changeset
106 -- when sorting the table.
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 Longest_File_Name_In_Table : Natural := 0;
kono
parents:
diff changeset
109 Unvisited_Files : Unvisited_Files_Access := null;
kono
parents:
diff changeset
110 Directories : Project_File_Ptr;
kono
parents:
diff changeset
111 Default_Match : Boolean := False;
kono
parents:
diff changeset
112 -- The above need commenting ???
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 function Parse_Gnatls_Src return String;
kono
parents:
diff changeset
115 -- Return the standard source directories (taking into account the
kono
parents:
diff changeset
116 -- ADA_INCLUDE_PATH environment variable, if Osint.Add_Default_Search_Dirs
kono
parents:
diff changeset
117 -- was called first).
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 function Parse_Gnatls_Obj return String;
kono
parents:
diff changeset
120 -- Return the standard object directories (taking into account the
kono
parents:
diff changeset
121 -- ADA_OBJECTS_PATH environment variable).
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 function Key_From_Ref
kono
parents:
diff changeset
124 (File_Ref : File_Reference;
kono
parents:
diff changeset
125 Line : Natural;
kono
parents:
diff changeset
126 Column : Natural)
kono
parents:
diff changeset
127 return String;
kono
parents:
diff changeset
128 -- Return a key for the symbol declared at File_Ref, Line,
kono
parents:
diff changeset
129 -- Column. This key should be used for lookup in Entity_HTable
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 function Is_Less_Than (Decl1, Decl2 : Declaration_Reference) return Boolean;
kono
parents:
diff changeset
132 -- Compare two declarations (the comparison is case-insensitive)
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 function Is_Less_Than (Ref1, Ref2 : Reference) return Boolean;
kono
parents:
diff changeset
135 -- Compare two references
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 procedure Store_References
kono
parents:
diff changeset
138 (Decl : Declaration_Reference;
kono
parents:
diff changeset
139 Get_Writes : Boolean := False;
kono
parents:
diff changeset
140 Get_Reads : Boolean := False;
kono
parents:
diff changeset
141 Get_Bodies : Boolean := False;
kono
parents:
diff changeset
142 Get_Declaration : Boolean := False;
kono
parents:
diff changeset
143 Arr : in out Reference_Array;
kono
parents:
diff changeset
144 Index : in out Natural);
kono
parents:
diff changeset
145 -- Store in Arr, starting at Index, all the references to Decl. The Get_*
kono
parents:
diff changeset
146 -- parameters can be used to indicate which references should be stored.
kono
parents:
diff changeset
147 -- Constraint_Error will be raised if Arr is not big enough.
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 procedure Sort (Arr : in out Reference_Array);
kono
parents:
diff changeset
150 -- Sort an array of references (Arr'First must be 1)
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 --------------
kono
parents:
diff changeset
153 -- Set_Next --
kono
parents:
diff changeset
154 --------------
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 procedure Set_Next (E : File_Reference; Next : File_Reference) is
kono
parents:
diff changeset
157 begin
kono
parents:
diff changeset
158 E.Next := Next;
kono
parents:
diff changeset
159 end Set_Next;
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 procedure Set_Next
kono
parents:
diff changeset
162 (E : Declaration_Reference; Next : Declaration_Reference) is
kono
parents:
diff changeset
163 begin
kono
parents:
diff changeset
164 E.Next := Next;
kono
parents:
diff changeset
165 end Set_Next;
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 -------------
kono
parents:
diff changeset
168 -- Get_Key --
kono
parents:
diff changeset
169 -------------
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 function Get_Key (E : File_Reference) return Cst_String_Access is
kono
parents:
diff changeset
172 begin
kono
parents:
diff changeset
173 return E.File;
kono
parents:
diff changeset
174 end Get_Key;
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 function Get_Key (E : Declaration_Reference) return Cst_String_Access is
kono
parents:
diff changeset
177 begin
kono
parents:
diff changeset
178 return E.Key;
kono
parents:
diff changeset
179 end Get_Key;
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 ----------
kono
parents:
diff changeset
182 -- Hash --
kono
parents:
diff changeset
183 ----------
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 function Hash (F : Cst_String_Access) return HTable_Headers is
kono
parents:
diff changeset
186 function H is new GNAT.HTable.Hash (HTable_Headers);
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 begin
kono
parents:
diff changeset
189 return H (F.all);
kono
parents:
diff changeset
190 end Hash;
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 -----------
kono
parents:
diff changeset
193 -- Equal --
kono
parents:
diff changeset
194 -----------
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 function Equal (F1, F2 : Cst_String_Access) return Boolean is
kono
parents:
diff changeset
197 begin
kono
parents:
diff changeset
198 return F1.all = F2.all;
kono
parents:
diff changeset
199 end Equal;
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 ------------------
kono
parents:
diff changeset
202 -- Key_From_Ref --
kono
parents:
diff changeset
203 ------------------
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 function Key_From_Ref
kono
parents:
diff changeset
206 (File_Ref : File_Reference;
kono
parents:
diff changeset
207 Line : Natural;
kono
parents:
diff changeset
208 Column : Natural)
kono
parents:
diff changeset
209 return String
kono
parents:
diff changeset
210 is
kono
parents:
diff changeset
211 begin
kono
parents:
diff changeset
212 return File_Ref.File.all & Natural'Image (Line) & Natural'Image (Column);
kono
parents:
diff changeset
213 end Key_From_Ref;
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 ---------------------
kono
parents:
diff changeset
216 -- Add_Declaration --
kono
parents:
diff changeset
217 ---------------------
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 function Add_Declaration
kono
parents:
diff changeset
220 (File_Ref : File_Reference;
kono
parents:
diff changeset
221 Symbol : String;
kono
parents:
diff changeset
222 Line : Natural;
kono
parents:
diff changeset
223 Column : Natural;
kono
parents:
diff changeset
224 Decl_Type : Character;
kono
parents:
diff changeset
225 Is_Parameter : Boolean := False;
kono
parents:
diff changeset
226 Remove_Only : Boolean := False;
kono
parents:
diff changeset
227 Symbol_Match : Boolean := True)
kono
parents:
diff changeset
228 return Declaration_Reference
kono
parents:
diff changeset
229 is
kono
parents:
diff changeset
230 procedure Unchecked_Free is new Ada.Unchecked_Deallocation
kono
parents:
diff changeset
231 (Declaration_Record, Declaration_Reference);
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 Key : aliased constant String := Key_From_Ref (File_Ref, Line, Column);
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 New_Decl : Declaration_Reference :=
kono
parents:
diff changeset
236 Entities_HTable.Get (Key'Unchecked_Access);
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 Is_Param : Boolean := Is_Parameter;
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 begin
kono
parents:
diff changeset
241 -- Insert the Declaration in the table. There might already be a
kono
parents:
diff changeset
242 -- declaration in the table if the entity is a parameter, so we
kono
parents:
diff changeset
243 -- need to check that first.
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 if New_Decl /= null and then New_Decl.Symbol_Length = 0 then
kono
parents:
diff changeset
246 Is_Param := Is_Parameter or else New_Decl.Is_Parameter;
kono
parents:
diff changeset
247 Entities_HTable.Remove (Key'Unrestricted_Access);
kono
parents:
diff changeset
248 Entities_Count := Entities_Count - 1;
kono
parents:
diff changeset
249 Free (New_Decl.Key);
kono
parents:
diff changeset
250 Unchecked_Free (New_Decl);
kono
parents:
diff changeset
251 New_Decl := null;
kono
parents:
diff changeset
252 end if;
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 -- The declaration might also already be there for parent types. In
kono
parents:
diff changeset
255 -- this case, we should keep the entry, since some other entries are
kono
parents:
diff changeset
256 -- pointing to it.
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 if New_Decl = null
kono
parents:
diff changeset
259 and then not Remove_Only
kono
parents:
diff changeset
260 then
kono
parents:
diff changeset
261 New_Decl :=
kono
parents:
diff changeset
262 new Declaration_Record'
kono
parents:
diff changeset
263 (Symbol_Length => Symbol'Length,
kono
parents:
diff changeset
264 Symbol => Symbol,
kono
parents:
diff changeset
265 Key => new String'(Key),
kono
parents:
diff changeset
266 Decl => new Reference_Record'
kono
parents:
diff changeset
267 (File => File_Ref,
kono
parents:
diff changeset
268 Line => Line,
kono
parents:
diff changeset
269 Column => Column,
kono
parents:
diff changeset
270 Source_Line => null,
kono
parents:
diff changeset
271 Next => null),
kono
parents:
diff changeset
272 Is_Parameter => Is_Param,
kono
parents:
diff changeset
273 Decl_Type => Decl_Type,
kono
parents:
diff changeset
274 Body_Ref => null,
kono
parents:
diff changeset
275 Ref_Ref => null,
kono
parents:
diff changeset
276 Modif_Ref => null,
kono
parents:
diff changeset
277 Match => Symbol_Match
kono
parents:
diff changeset
278 and then
kono
parents:
diff changeset
279 (Default_Match
kono
parents:
diff changeset
280 or else Match (File_Ref, Line, Column)),
kono
parents:
diff changeset
281 Par_Symbol => null,
kono
parents:
diff changeset
282 Next => null);
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 Entities_HTable.Set (New_Decl);
kono
parents:
diff changeset
285 Entities_Count := Entities_Count + 1;
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 if New_Decl.Match then
kono
parents:
diff changeset
288 Longest_File_Name_In_Table :=
kono
parents:
diff changeset
289 Natural'Max (File_Ref.File'Length, Longest_File_Name_In_Table);
kono
parents:
diff changeset
290 end if;
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 elsif New_Decl /= null
kono
parents:
diff changeset
293 and then not New_Decl.Match
kono
parents:
diff changeset
294 then
kono
parents:
diff changeset
295 New_Decl.Match := Default_Match
kono
parents:
diff changeset
296 or else Match (File_Ref, Line, Column);
kono
parents:
diff changeset
297 New_Decl.Is_Parameter := New_Decl.Is_Parameter or Is_Param;
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 elsif New_Decl /= null then
kono
parents:
diff changeset
300 New_Decl.Is_Parameter := New_Decl.Is_Parameter or Is_Param;
kono
parents:
diff changeset
301 end if;
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 return New_Decl;
kono
parents:
diff changeset
304 end Add_Declaration;
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 ----------------------
kono
parents:
diff changeset
307 -- Add_To_Xref_File --
kono
parents:
diff changeset
308 ----------------------
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 function Add_To_Xref_File
kono
parents:
diff changeset
311 (File_Name : String;
kono
parents:
diff changeset
312 Visited : Boolean := True;
kono
parents:
diff changeset
313 Emit_Warning : Boolean := False;
kono
parents:
diff changeset
314 Gnatchop_File : String := "";
kono
parents:
diff changeset
315 Gnatchop_Offset : Integer := 0) return File_Reference
kono
parents:
diff changeset
316 is
kono
parents:
diff changeset
317 Base : aliased constant String := Base_Name (File_Name);
kono
parents:
diff changeset
318 Dir : constant String := Dir_Name (File_Name);
kono
parents:
diff changeset
319 Dir_Acc : GNAT.OS_Lib.String_Access := null;
kono
parents:
diff changeset
320 Ref : File_Reference;
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 begin
kono
parents:
diff changeset
323 -- Do we have a directory name as well?
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 if File_Name /= Base then
kono
parents:
diff changeset
326 Dir_Acc := new String'(Dir);
kono
parents:
diff changeset
327 end if;
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 Ref := File_HTable.Get (Base'Unchecked_Access);
kono
parents:
diff changeset
330 if Ref = null then
kono
parents:
diff changeset
331 Ref := new File_Record'
kono
parents:
diff changeset
332 (File => new String'(Base),
kono
parents:
diff changeset
333 Dir => Dir_Acc,
kono
parents:
diff changeset
334 Lines => null,
kono
parents:
diff changeset
335 Visited => Visited,
kono
parents:
diff changeset
336 Emit_Warning => Emit_Warning,
kono
parents:
diff changeset
337 Gnatchop_File => new String'(Gnatchop_File),
kono
parents:
diff changeset
338 Gnatchop_Offset => Gnatchop_Offset,
kono
parents:
diff changeset
339 Next => null);
kono
parents:
diff changeset
340 File_HTable.Set (Ref);
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 if not Visited then
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 -- Keep a separate list for faster access
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 Set_Unvisited (Ref);
kono
parents:
diff changeset
347 end if;
kono
parents:
diff changeset
348 end if;
kono
parents:
diff changeset
349 return Ref;
kono
parents:
diff changeset
350 end Add_To_Xref_File;
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 --------------
kono
parents:
diff changeset
353 -- Add_Line --
kono
parents:
diff changeset
354 --------------
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 procedure Add_Line
kono
parents:
diff changeset
357 (File : File_Reference;
kono
parents:
diff changeset
358 Line : Natural;
kono
parents:
diff changeset
359 Column : Natural)
kono
parents:
diff changeset
360 is
kono
parents:
diff changeset
361 begin
kono
parents:
diff changeset
362 File.Lines := new Ref_In_File'(Line => Line,
kono
parents:
diff changeset
363 Column => Column,
kono
parents:
diff changeset
364 Next => File.Lines);
kono
parents:
diff changeset
365 end Add_Line;
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 ----------------
kono
parents:
diff changeset
368 -- Add_Parent --
kono
parents:
diff changeset
369 ----------------
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 procedure Add_Parent
kono
parents:
diff changeset
372 (Declaration : in out Declaration_Reference;
kono
parents:
diff changeset
373 Symbol : String;
kono
parents:
diff changeset
374 Line : Natural;
kono
parents:
diff changeset
375 Column : Natural;
kono
parents:
diff changeset
376 File_Ref : File_Reference)
kono
parents:
diff changeset
377 is
kono
parents:
diff changeset
378 begin
kono
parents:
diff changeset
379 Declaration.Par_Symbol :=
kono
parents:
diff changeset
380 Add_Declaration
kono
parents:
diff changeset
381 (File_Ref, Symbol, Line, Column,
kono
parents:
diff changeset
382 Decl_Type => ' ',
kono
parents:
diff changeset
383 Symbol_Match => False);
kono
parents:
diff changeset
384 end Add_Parent;
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 -------------------
kono
parents:
diff changeset
387 -- Add_Reference --
kono
parents:
diff changeset
388 -------------------
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 procedure Add_Reference
kono
parents:
diff changeset
391 (Declaration : Declaration_Reference;
kono
parents:
diff changeset
392 File_Ref : File_Reference;
kono
parents:
diff changeset
393 Line : Natural;
kono
parents:
diff changeset
394 Column : Natural;
kono
parents:
diff changeset
395 Ref_Type : Character;
kono
parents:
diff changeset
396 Labels_As_Ref : Boolean)
kono
parents:
diff changeset
397 is
kono
parents:
diff changeset
398 New_Ref : Reference;
kono
parents:
diff changeset
399 New_Decl : Declaration_Reference;
kono
parents:
diff changeset
400 pragma Unreferenced (New_Decl);
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 begin
kono
parents:
diff changeset
403 case Ref_Type is
kono
parents:
diff changeset
404 when ' ' | 'b' | 'c' | 'H' | 'i' | 'm' | 'o' | 'r' | 'R' | 's' | 'x'
kono
parents:
diff changeset
405 =>
kono
parents:
diff changeset
406 null;
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 when 'l' | 'w' =>
kono
parents:
diff changeset
409 if not Labels_As_Ref then
kono
parents:
diff changeset
410 return;
kono
parents:
diff changeset
411 end if;
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 when '=' | '<' | '>' | '^' =>
kono
parents:
diff changeset
414
kono
parents:
diff changeset
415 -- Create dummy declaration in table to report it as a parameter
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 -- In a given ALI file, the declaration of the subprogram comes
kono
parents:
diff changeset
418 -- before the declaration of the parameter. However, it is
kono
parents:
diff changeset
419 -- possible that another ALI file has been parsed that also
kono
parents:
diff changeset
420 -- references the parameter (for instance a named parameter in
kono
parents:
diff changeset
421 -- a call), so we need to check whether there already exists a
kono
parents:
diff changeset
422 -- declaration for the parameter.
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 New_Decl :=
kono
parents:
diff changeset
425 Add_Declaration
kono
parents:
diff changeset
426 (File_Ref => File_Ref,
kono
parents:
diff changeset
427 Symbol => "",
kono
parents:
diff changeset
428 Line => Line,
kono
parents:
diff changeset
429 Column => Column,
kono
parents:
diff changeset
430 Decl_Type => ' ',
kono
parents:
diff changeset
431 Is_Parameter => True);
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 when 'd' | 'e' | 'E' | 'k' | 'p' | 'P' | 't' | 'z' =>
kono
parents:
diff changeset
434 return;
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 when others =>
kono
parents:
diff changeset
437 Ada.Text_IO.Put_Line ("Unknown reference type: " & Ref_Type);
kono
parents:
diff changeset
438 return;
kono
parents:
diff changeset
439 end case;
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 New_Ref := new Reference_Record'
kono
parents:
diff changeset
442 (File => File_Ref,
kono
parents:
diff changeset
443 Line => Line,
kono
parents:
diff changeset
444 Column => Column,
kono
parents:
diff changeset
445 Source_Line => null,
kono
parents:
diff changeset
446 Next => null);
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 -- We can insert the reference into the list directly, since all the
kono
parents:
diff changeset
449 -- references will appear only once in the ALI file corresponding to the
kono
parents:
diff changeset
450 -- file where they are referenced. This saves a lot of time compared to
kono
parents:
diff changeset
451 -- checking the list to check if it exists.
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 case Ref_Type is
kono
parents:
diff changeset
454 when 'b' | 'c' =>
kono
parents:
diff changeset
455 New_Ref.Next := Declaration.Body_Ref;
kono
parents:
diff changeset
456 Declaration.Body_Ref := New_Ref;
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 when ' ' | 'H' | 'i' | 'l' | 'o' | 'r' | 'R' | 's' | 'w' | 'x' =>
kono
parents:
diff changeset
459 New_Ref.Next := Declaration.Ref_Ref;
kono
parents:
diff changeset
460 Declaration.Ref_Ref := New_Ref;
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 when 'm' =>
kono
parents:
diff changeset
463 New_Ref.Next := Declaration.Modif_Ref;
kono
parents:
diff changeset
464 Declaration.Modif_Ref := New_Ref;
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 when others =>
kono
parents:
diff changeset
467 null;
kono
parents:
diff changeset
468 end case;
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 if not Declaration.Match then
kono
parents:
diff changeset
471 Declaration.Match := Match (File_Ref, Line, Column);
kono
parents:
diff changeset
472 end if;
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 if Declaration.Match then
kono
parents:
diff changeset
475 Longest_File_Name_In_Table :=
kono
parents:
diff changeset
476 Natural'Max (File_Ref.File'Length, Longest_File_Name_In_Table);
kono
parents:
diff changeset
477 end if;
kono
parents:
diff changeset
478 end Add_Reference;
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 -------------------
kono
parents:
diff changeset
481 -- ALI_File_Name --
kono
parents:
diff changeset
482 -------------------
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 function ALI_File_Name (Ada_File_Name : String) return String is
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 -- ??? Should ideally be based on the naming scheme defined in
kono
parents:
diff changeset
487 -- project files.
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 Index : constant Natural :=
kono
parents:
diff changeset
490 Ada.Strings.Fixed.Index
kono
parents:
diff changeset
491 (Ada_File_Name, ".", Going => Ada.Strings.Backward);
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 begin
kono
parents:
diff changeset
494 if Index /= 0 then
kono
parents:
diff changeset
495 return Ada_File_Name (Ada_File_Name'First .. Index)
kono
parents:
diff changeset
496 & Osint.ALI_Suffix.all;
kono
parents:
diff changeset
497 else
kono
parents:
diff changeset
498 return Ada_File_Name & "." & Osint.ALI_Suffix.all;
kono
parents:
diff changeset
499 end if;
kono
parents:
diff changeset
500 end ALI_File_Name;
kono
parents:
diff changeset
501
kono
parents:
diff changeset
502 ------------------
kono
parents:
diff changeset
503 -- Is_Less_Than --
kono
parents:
diff changeset
504 ------------------
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 function Is_Less_Than (Ref1, Ref2 : Reference) return Boolean is
kono
parents:
diff changeset
507 begin
kono
parents:
diff changeset
508 if Ref1 = null then
kono
parents:
diff changeset
509 return False;
kono
parents:
diff changeset
510 elsif Ref2 = null then
kono
parents:
diff changeset
511 return True;
kono
parents:
diff changeset
512 end if;
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 if Ref1.File.File.all < Ref2.File.File.all then
kono
parents:
diff changeset
515 return True;
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 elsif Ref1.File.File.all = Ref2.File.File.all then
kono
parents:
diff changeset
518 return (Ref1.Line < Ref2.Line
kono
parents:
diff changeset
519 or else (Ref1.Line = Ref2.Line
kono
parents:
diff changeset
520 and then Ref1.Column < Ref2.Column));
kono
parents:
diff changeset
521 end if;
kono
parents:
diff changeset
522
kono
parents:
diff changeset
523 return False;
kono
parents:
diff changeset
524 end Is_Less_Than;
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 ------------------
kono
parents:
diff changeset
527 -- Is_Less_Than --
kono
parents:
diff changeset
528 ------------------
kono
parents:
diff changeset
529
kono
parents:
diff changeset
530 function Is_Less_Than (Decl1, Decl2 : Declaration_Reference) return Boolean
kono
parents:
diff changeset
531 is
kono
parents:
diff changeset
532 -- We cannot store the data case-insensitive in the table,
kono
parents:
diff changeset
533 -- since we wouldn't be able to find the right casing for the
kono
parents:
diff changeset
534 -- display later on.
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 S1 : constant String := To_Lower (Decl1.Symbol);
kono
parents:
diff changeset
537 S2 : constant String := To_Lower (Decl2.Symbol);
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 begin
kono
parents:
diff changeset
540 if S1 < S2 then
kono
parents:
diff changeset
541 return True;
kono
parents:
diff changeset
542 elsif S1 > S2 then
kono
parents:
diff changeset
543 return False;
kono
parents:
diff changeset
544 end if;
kono
parents:
diff changeset
545
kono
parents:
diff changeset
546 return Decl1.Key.all < Decl2.Key.all;
kono
parents:
diff changeset
547 end Is_Less_Than;
kono
parents:
diff changeset
548
kono
parents:
diff changeset
549 -------------------------
kono
parents:
diff changeset
550 -- Create_Project_File --
kono
parents:
diff changeset
551 -------------------------
kono
parents:
diff changeset
552
kono
parents:
diff changeset
553 procedure Create_Project_File (Name : String) is
kono
parents:
diff changeset
554 Obj_Dir : Unbounded_String := Null_Unbounded_String;
kono
parents:
diff changeset
555 Src_Dir : Unbounded_String := Null_Unbounded_String;
kono
parents:
diff changeset
556 Build_Dir : GNAT.OS_Lib.String_Access := new String'("");
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 F : File_Descriptor;
kono
parents:
diff changeset
559 Len : Positive;
kono
parents:
diff changeset
560 File_Name : aliased String := Name & ASCII.NUL;
kono
parents:
diff changeset
561
kono
parents:
diff changeset
562 begin
kono
parents:
diff changeset
563 -- Read the size of the file
kono
parents:
diff changeset
564
kono
parents:
diff changeset
565 F := Open_Read (File_Name'Address, Text);
kono
parents:
diff changeset
566
kono
parents:
diff changeset
567 -- Project file not found
kono
parents:
diff changeset
568
kono
parents:
diff changeset
569 if F /= Invalid_FD then
kono
parents:
diff changeset
570 Len := Positive (File_Length (F));
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 declare
kono
parents:
diff changeset
573 Buffer : String (1 .. Len);
kono
parents:
diff changeset
574 Index : Positive := Buffer'First;
kono
parents:
diff changeset
575 Last : Positive;
kono
parents:
diff changeset
576
kono
parents:
diff changeset
577 begin
kono
parents:
diff changeset
578 Len := Read (F, Buffer'Address, Len);
kono
parents:
diff changeset
579 Close (F);
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 -- First, look for Build_Dir, since all the source and object
kono
parents:
diff changeset
582 -- path are relative to it.
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 while Index <= Buffer'Last loop
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 -- Find the end of line
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 Last := Index;
kono
parents:
diff changeset
589 while Last <= Buffer'Last
kono
parents:
diff changeset
590 and then Buffer (Last) /= ASCII.LF
kono
parents:
diff changeset
591 and then Buffer (Last) /= ASCII.CR
kono
parents:
diff changeset
592 loop
kono
parents:
diff changeset
593 Last := Last + 1;
kono
parents:
diff changeset
594 end loop;
kono
parents:
diff changeset
595
kono
parents:
diff changeset
596 if Index <= Buffer'Last - 9
kono
parents:
diff changeset
597 and then Buffer (Index .. Index + 9) = "build_dir="
kono
parents:
diff changeset
598 then
kono
parents:
diff changeset
599 Index := Index + 10;
kono
parents:
diff changeset
600 while Index <= Last
kono
parents:
diff changeset
601 and then (Buffer (Index) = ' '
kono
parents:
diff changeset
602 or else Buffer (Index) = ASCII.HT)
kono
parents:
diff changeset
603 loop
kono
parents:
diff changeset
604 Index := Index + 1;
kono
parents:
diff changeset
605 end loop;
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 Free (Build_Dir);
kono
parents:
diff changeset
608 Build_Dir := new String'(Buffer (Index .. Last - 1));
kono
parents:
diff changeset
609 end if;
kono
parents:
diff changeset
610
kono
parents:
diff changeset
611 Index := Last + 1;
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 -- In case we had a ASCII.CR/ASCII.LF end of line, skip the
kono
parents:
diff changeset
614 -- remaining symbol
kono
parents:
diff changeset
615
kono
parents:
diff changeset
616 if Index <= Buffer'Last
kono
parents:
diff changeset
617 and then Buffer (Index) = ASCII.LF
kono
parents:
diff changeset
618 then
kono
parents:
diff changeset
619 Index := Index + 1;
kono
parents:
diff changeset
620 end if;
kono
parents:
diff changeset
621 end loop;
kono
parents:
diff changeset
622
kono
parents:
diff changeset
623 -- Now parse the source and object paths
kono
parents:
diff changeset
624
kono
parents:
diff changeset
625 Index := Buffer'First;
kono
parents:
diff changeset
626 while Index <= Buffer'Last loop
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 -- Find the end of line
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 Last := Index;
kono
parents:
diff changeset
631 while Last <= Buffer'Last
kono
parents:
diff changeset
632 and then Buffer (Last) /= ASCII.LF
kono
parents:
diff changeset
633 and then Buffer (Last) /= ASCII.CR
kono
parents:
diff changeset
634 loop
kono
parents:
diff changeset
635 Last := Last + 1;
kono
parents:
diff changeset
636 end loop;
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 if Index <= Buffer'Last - 7
kono
parents:
diff changeset
639 and then Buffer (Index .. Index + 7) = "src_dir="
kono
parents:
diff changeset
640 then
kono
parents:
diff changeset
641 Append (Src_Dir, Normalize_Pathname
kono
parents:
diff changeset
642 (Name => Ada.Strings.Fixed.Trim
kono
parents:
diff changeset
643 (Buffer (Index + 8 .. Last - 1), Ada.Strings.Both),
kono
parents:
diff changeset
644 Directory => Build_Dir.all) & Path_Separator);
kono
parents:
diff changeset
645
kono
parents:
diff changeset
646 elsif Index <= Buffer'Last - 7
kono
parents:
diff changeset
647 and then Buffer (Index .. Index + 7) = "obj_dir="
kono
parents:
diff changeset
648 then
kono
parents:
diff changeset
649 Append (Obj_Dir, Normalize_Pathname
kono
parents:
diff changeset
650 (Name => Ada.Strings.Fixed.Trim
kono
parents:
diff changeset
651 (Buffer (Index + 8 .. Last - 1), Ada.Strings.Both),
kono
parents:
diff changeset
652 Directory => Build_Dir.all) & Path_Separator);
kono
parents:
diff changeset
653 end if;
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 -- In case we had a ASCII.CR/ASCII.LF end of line, skip the
kono
parents:
diff changeset
656 -- remaining symbol
kono
parents:
diff changeset
657 Index := Last + 1;
kono
parents:
diff changeset
658
kono
parents:
diff changeset
659 if Index <= Buffer'Last
kono
parents:
diff changeset
660 and then Buffer (Index) = ASCII.LF
kono
parents:
diff changeset
661 then
kono
parents:
diff changeset
662 Index := Index + 1;
kono
parents:
diff changeset
663 end if;
kono
parents:
diff changeset
664 end loop;
kono
parents:
diff changeset
665 end;
kono
parents:
diff changeset
666 end if;
kono
parents:
diff changeset
667
kono
parents:
diff changeset
668 Osint.Add_Default_Search_Dirs;
kono
parents:
diff changeset
669
kono
parents:
diff changeset
670 declare
kono
parents:
diff changeset
671 Src : constant String := Parse_Gnatls_Src;
kono
parents:
diff changeset
672 Obj : constant String := Parse_Gnatls_Obj;
kono
parents:
diff changeset
673
kono
parents:
diff changeset
674 begin
kono
parents:
diff changeset
675 Directories := new Project_File'
kono
parents:
diff changeset
676 (Src_Dir_Length => Length (Src_Dir) + Src'Length,
kono
parents:
diff changeset
677 Obj_Dir_Length => Length (Obj_Dir) + Obj'Length,
kono
parents:
diff changeset
678 Src_Dir => To_String (Src_Dir) & Src,
kono
parents:
diff changeset
679 Obj_Dir => To_String (Obj_Dir) & Obj,
kono
parents:
diff changeset
680 Src_Dir_Index => 1,
kono
parents:
diff changeset
681 Obj_Dir_Index => 1,
kono
parents:
diff changeset
682 Last_Obj_Dir_Start => 0);
kono
parents:
diff changeset
683 end;
kono
parents:
diff changeset
684
kono
parents:
diff changeset
685 Free (Build_Dir);
kono
parents:
diff changeset
686 end Create_Project_File;
kono
parents:
diff changeset
687
kono
parents:
diff changeset
688 ---------------------
kono
parents:
diff changeset
689 -- Current_Obj_Dir --
kono
parents:
diff changeset
690 ---------------------
kono
parents:
diff changeset
691
kono
parents:
diff changeset
692 function Current_Obj_Dir return String is
kono
parents:
diff changeset
693 begin
kono
parents:
diff changeset
694 return Directories.Obj_Dir
kono
parents:
diff changeset
695 (Directories.Last_Obj_Dir_Start .. Directories.Obj_Dir_Index - 2);
kono
parents:
diff changeset
696 end Current_Obj_Dir;
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 ----------------
kono
parents:
diff changeset
699 -- Get_Column --
kono
parents:
diff changeset
700 ----------------
kono
parents:
diff changeset
701
kono
parents:
diff changeset
702 function Get_Column (Decl : Declaration_Reference) return String is
kono
parents:
diff changeset
703 begin
kono
parents:
diff changeset
704 return Ada.Strings.Fixed.Trim (Natural'Image (Decl.Decl.Column),
kono
parents:
diff changeset
705 Ada.Strings.Left);
kono
parents:
diff changeset
706 end Get_Column;
kono
parents:
diff changeset
707
kono
parents:
diff changeset
708 function Get_Column (Ref : Reference) return String is
kono
parents:
diff changeset
709 begin
kono
parents:
diff changeset
710 return Ada.Strings.Fixed.Trim (Natural'Image (Ref.Column),
kono
parents:
diff changeset
711 Ada.Strings.Left);
kono
parents:
diff changeset
712 end Get_Column;
kono
parents:
diff changeset
713
kono
parents:
diff changeset
714 ---------------------
kono
parents:
diff changeset
715 -- Get_Declaration --
kono
parents:
diff changeset
716 ---------------------
kono
parents:
diff changeset
717
kono
parents:
diff changeset
718 function Get_Declaration
kono
parents:
diff changeset
719 (File_Ref : File_Reference;
kono
parents:
diff changeset
720 Line : Natural;
kono
parents:
diff changeset
721 Column : Natural)
kono
parents:
diff changeset
722 return Declaration_Reference
kono
parents:
diff changeset
723 is
kono
parents:
diff changeset
724 Key : aliased constant String := Key_From_Ref (File_Ref, Line, Column);
kono
parents:
diff changeset
725
kono
parents:
diff changeset
726 begin
kono
parents:
diff changeset
727 return Entities_HTable.Get (Key'Unchecked_Access);
kono
parents:
diff changeset
728 end Get_Declaration;
kono
parents:
diff changeset
729
kono
parents:
diff changeset
730 ----------------------
kono
parents:
diff changeset
731 -- Get_Emit_Warning --
kono
parents:
diff changeset
732 ----------------------
kono
parents:
diff changeset
733
kono
parents:
diff changeset
734 function Get_Emit_Warning (File : File_Reference) return Boolean is
kono
parents:
diff changeset
735 begin
kono
parents:
diff changeset
736 return File.Emit_Warning;
kono
parents:
diff changeset
737 end Get_Emit_Warning;
kono
parents:
diff changeset
738
kono
parents:
diff changeset
739 --------------
kono
parents:
diff changeset
740 -- Get_File --
kono
parents:
diff changeset
741 --------------
kono
parents:
diff changeset
742
kono
parents:
diff changeset
743 function Get_File
kono
parents:
diff changeset
744 (Decl : Declaration_Reference;
kono
parents:
diff changeset
745 With_Dir : Boolean := False) return String
kono
parents:
diff changeset
746 is
kono
parents:
diff changeset
747 begin
kono
parents:
diff changeset
748 return Get_File (Decl.Decl.File, With_Dir);
kono
parents:
diff changeset
749 end Get_File;
kono
parents:
diff changeset
750
kono
parents:
diff changeset
751 function Get_File
kono
parents:
diff changeset
752 (Ref : Reference;
kono
parents:
diff changeset
753 With_Dir : Boolean := False) return String
kono
parents:
diff changeset
754 is
kono
parents:
diff changeset
755 begin
kono
parents:
diff changeset
756 return Get_File (Ref.File, With_Dir);
kono
parents:
diff changeset
757 end Get_File;
kono
parents:
diff changeset
758
kono
parents:
diff changeset
759 function Get_File
kono
parents:
diff changeset
760 (File : File_Reference;
kono
parents:
diff changeset
761 With_Dir : Boolean := False;
kono
parents:
diff changeset
762 Strip : Natural := 0) return String
kono
parents:
diff changeset
763 is
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
764 pragma Annotate (CodePeer, Skip_Analysis);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
765 -- ??? To disable false positives currently generated
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
766
111
kono
parents:
diff changeset
767 Tmp : GNAT.OS_Lib.String_Access;
kono
parents:
diff changeset
768
kono
parents:
diff changeset
769 function Internal_Strip (Full_Name : String) return String;
kono
parents:
diff changeset
770 -- Internal function to process the Strip parameter
kono
parents:
diff changeset
771
kono
parents:
diff changeset
772 --------------------
kono
parents:
diff changeset
773 -- Internal_Strip --
kono
parents:
diff changeset
774 --------------------
kono
parents:
diff changeset
775
kono
parents:
diff changeset
776 function Internal_Strip (Full_Name : String) return String is
kono
parents:
diff changeset
777 Unit_End : Natural;
kono
parents:
diff changeset
778 Extension_Start : Natural;
kono
parents:
diff changeset
779 S : Natural;
kono
parents:
diff changeset
780
kono
parents:
diff changeset
781 begin
kono
parents:
diff changeset
782 if Strip = 0 then
kono
parents:
diff changeset
783 return Full_Name;
kono
parents:
diff changeset
784 end if;
kono
parents:
diff changeset
785
kono
parents:
diff changeset
786 -- Isolate the file extension
kono
parents:
diff changeset
787
kono
parents:
diff changeset
788 Extension_Start := Full_Name'Last;
kono
parents:
diff changeset
789 while Extension_Start >= Full_Name'First
kono
parents:
diff changeset
790 and then Full_Name (Extension_Start) /= '.'
kono
parents:
diff changeset
791 loop
kono
parents:
diff changeset
792 Extension_Start := Extension_Start - 1;
kono
parents:
diff changeset
793 end loop;
kono
parents:
diff changeset
794
kono
parents:
diff changeset
795 -- Strip the right number of subunit_names
kono
parents:
diff changeset
796
kono
parents:
diff changeset
797 S := Strip;
kono
parents:
diff changeset
798 Unit_End := Extension_Start - 1;
kono
parents:
diff changeset
799 while Unit_End >= Full_Name'First
kono
parents:
diff changeset
800 and then S > 0
kono
parents:
diff changeset
801 loop
kono
parents:
diff changeset
802 if Full_Name (Unit_End) = '-' then
kono
parents:
diff changeset
803 S := S - 1;
kono
parents:
diff changeset
804 end if;
kono
parents:
diff changeset
805
kono
parents:
diff changeset
806 Unit_End := Unit_End - 1;
kono
parents:
diff changeset
807 end loop;
kono
parents:
diff changeset
808
kono
parents:
diff changeset
809 if Unit_End < Full_Name'First then
kono
parents:
diff changeset
810 return "";
kono
parents:
diff changeset
811 else
kono
parents:
diff changeset
812 return Full_Name (Full_Name'First .. Unit_End)
kono
parents:
diff changeset
813 & Full_Name (Extension_Start .. Full_Name'Last);
kono
parents:
diff changeset
814 end if;
kono
parents:
diff changeset
815 end Internal_Strip;
kono
parents:
diff changeset
816
kono
parents:
diff changeset
817 -- Start of processing for Get_File;
kono
parents:
diff changeset
818
kono
parents:
diff changeset
819 begin
kono
parents:
diff changeset
820 -- If we do not want the full path name
kono
parents:
diff changeset
821
kono
parents:
diff changeset
822 if not With_Dir then
kono
parents:
diff changeset
823 return Internal_Strip (File.File.all);
kono
parents:
diff changeset
824 end if;
kono
parents:
diff changeset
825
kono
parents:
diff changeset
826 if File.Dir = null then
kono
parents:
diff changeset
827 if Ada.Strings.Fixed.Tail (File.File.all, 3) =
kono
parents:
diff changeset
828 Osint.ALI_Suffix.all
kono
parents:
diff changeset
829 then
kono
parents:
diff changeset
830 Tmp := Locate_Regular_File
kono
parents:
diff changeset
831 (Internal_Strip (File.File.all), Directories.Obj_Dir);
kono
parents:
diff changeset
832 else
kono
parents:
diff changeset
833 Tmp := Locate_Regular_File
kono
parents:
diff changeset
834 (File.File.all, Directories.Src_Dir);
kono
parents:
diff changeset
835 end if;
kono
parents:
diff changeset
836
kono
parents:
diff changeset
837 if Tmp = null then
kono
parents:
diff changeset
838 File.Dir := new String'("");
kono
parents:
diff changeset
839 else
kono
parents:
diff changeset
840 File.Dir := new String'(Dir_Name (Tmp.all));
kono
parents:
diff changeset
841 Free (Tmp);
kono
parents:
diff changeset
842 end if;
kono
parents:
diff changeset
843 end if;
kono
parents:
diff changeset
844
kono
parents:
diff changeset
845 return Internal_Strip (File.Dir.all & File.File.all);
kono
parents:
diff changeset
846 end Get_File;
kono
parents:
diff changeset
847
kono
parents:
diff changeset
848 ------------------
kono
parents:
diff changeset
849 -- Get_File_Ref --
kono
parents:
diff changeset
850 ------------------
kono
parents:
diff changeset
851
kono
parents:
diff changeset
852 function Get_File_Ref (Ref : Reference) return File_Reference is
kono
parents:
diff changeset
853 begin
kono
parents:
diff changeset
854 return Ref.File;
kono
parents:
diff changeset
855 end Get_File_Ref;
kono
parents:
diff changeset
856
kono
parents:
diff changeset
857 -----------------------
kono
parents:
diff changeset
858 -- Get_Gnatchop_File --
kono
parents:
diff changeset
859 -----------------------
kono
parents:
diff changeset
860
kono
parents:
diff changeset
861 function Get_Gnatchop_File
kono
parents:
diff changeset
862 (File : File_Reference;
kono
parents:
diff changeset
863 With_Dir : Boolean := False)
kono
parents:
diff changeset
864 return String
kono
parents:
diff changeset
865 is
kono
parents:
diff changeset
866 begin
kono
parents:
diff changeset
867 if File.Gnatchop_File.all = "" then
kono
parents:
diff changeset
868 return Get_File (File, With_Dir);
kono
parents:
diff changeset
869 else
kono
parents:
diff changeset
870 return File.Gnatchop_File.all;
kono
parents:
diff changeset
871 end if;
kono
parents:
diff changeset
872 end Get_Gnatchop_File;
kono
parents:
diff changeset
873
kono
parents:
diff changeset
874 function Get_Gnatchop_File
kono
parents:
diff changeset
875 (Ref : Reference;
kono
parents:
diff changeset
876 With_Dir : Boolean := False)
kono
parents:
diff changeset
877 return String
kono
parents:
diff changeset
878 is
kono
parents:
diff changeset
879 begin
kono
parents:
diff changeset
880 return Get_Gnatchop_File (Ref.File, With_Dir);
kono
parents:
diff changeset
881 end Get_Gnatchop_File;
kono
parents:
diff changeset
882
kono
parents:
diff changeset
883 function Get_Gnatchop_File
kono
parents:
diff changeset
884 (Decl : Declaration_Reference;
kono
parents:
diff changeset
885 With_Dir : Boolean := False)
kono
parents:
diff changeset
886 return String
kono
parents:
diff changeset
887 is
kono
parents:
diff changeset
888 begin
kono
parents:
diff changeset
889 return Get_Gnatchop_File (Decl.Decl.File, With_Dir);
kono
parents:
diff changeset
890 end Get_Gnatchop_File;
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 --------------
kono
parents:
diff changeset
893 -- Get_Line --
kono
parents:
diff changeset
894 --------------
kono
parents:
diff changeset
895
kono
parents:
diff changeset
896 function Get_Line (Decl : Declaration_Reference) return String is
kono
parents:
diff changeset
897 begin
kono
parents:
diff changeset
898 return Ada.Strings.Fixed.Trim (Natural'Image (Decl.Decl.Line),
kono
parents:
diff changeset
899 Ada.Strings.Left);
kono
parents:
diff changeset
900 end Get_Line;
kono
parents:
diff changeset
901
kono
parents:
diff changeset
902 function Get_Line (Ref : Reference) return String is
kono
parents:
diff changeset
903 begin
kono
parents:
diff changeset
904 return Ada.Strings.Fixed.Trim (Natural'Image (Ref.Line),
kono
parents:
diff changeset
905 Ada.Strings.Left);
kono
parents:
diff changeset
906 end Get_Line;
kono
parents:
diff changeset
907
kono
parents:
diff changeset
908 ----------------
kono
parents:
diff changeset
909 -- Get_Parent --
kono
parents:
diff changeset
910 ----------------
kono
parents:
diff changeset
911
kono
parents:
diff changeset
912 function Get_Parent
kono
parents:
diff changeset
913 (Decl : Declaration_Reference)
kono
parents:
diff changeset
914 return Declaration_Reference
kono
parents:
diff changeset
915 is
kono
parents:
diff changeset
916 begin
kono
parents:
diff changeset
917 return Decl.Par_Symbol;
kono
parents:
diff changeset
918 end Get_Parent;
kono
parents:
diff changeset
919
kono
parents:
diff changeset
920 ---------------------
kono
parents:
diff changeset
921 -- Get_Source_Line --
kono
parents:
diff changeset
922 ---------------------
kono
parents:
diff changeset
923
kono
parents:
diff changeset
924 function Get_Source_Line (Ref : Reference) return String is
kono
parents:
diff changeset
925 begin
kono
parents:
diff changeset
926 if Ref.Source_Line /= null then
kono
parents:
diff changeset
927 return Ref.Source_Line.all;
kono
parents:
diff changeset
928 else
kono
parents:
diff changeset
929 return "";
kono
parents:
diff changeset
930 end if;
kono
parents:
diff changeset
931 end Get_Source_Line;
kono
parents:
diff changeset
932
kono
parents:
diff changeset
933 function Get_Source_Line (Decl : Declaration_Reference) return String is
kono
parents:
diff changeset
934 begin
kono
parents:
diff changeset
935 if Decl.Decl.Source_Line /= null then
kono
parents:
diff changeset
936 return Decl.Decl.Source_Line.all;
kono
parents:
diff changeset
937 else
kono
parents:
diff changeset
938 return "";
kono
parents:
diff changeset
939 end if;
kono
parents:
diff changeset
940 end Get_Source_Line;
kono
parents:
diff changeset
941
kono
parents:
diff changeset
942 ----------------
kono
parents:
diff changeset
943 -- Get_Symbol --
kono
parents:
diff changeset
944 ----------------
kono
parents:
diff changeset
945
kono
parents:
diff changeset
946 function Get_Symbol (Decl : Declaration_Reference) return String is
kono
parents:
diff changeset
947 begin
kono
parents:
diff changeset
948 return Decl.Symbol;
kono
parents:
diff changeset
949 end Get_Symbol;
kono
parents:
diff changeset
950
kono
parents:
diff changeset
951 --------------
kono
parents:
diff changeset
952 -- Get_Type --
kono
parents:
diff changeset
953 --------------
kono
parents:
diff changeset
954
kono
parents:
diff changeset
955 function Get_Type (Decl : Declaration_Reference) return Character is
kono
parents:
diff changeset
956 begin
kono
parents:
diff changeset
957 return Decl.Decl_Type;
kono
parents:
diff changeset
958 end Get_Type;
kono
parents:
diff changeset
959
kono
parents:
diff changeset
960 ----------
kono
parents:
diff changeset
961 -- Sort --
kono
parents:
diff changeset
962 ----------
kono
parents:
diff changeset
963
kono
parents:
diff changeset
964 procedure Sort (Arr : in out Reference_Array) is
kono
parents:
diff changeset
965 Tmp : Reference;
kono
parents:
diff changeset
966
kono
parents:
diff changeset
967 function Lt (Op1, Op2 : Natural) return Boolean;
kono
parents:
diff changeset
968 procedure Move (From, To : Natural);
kono
parents:
diff changeset
969 -- See GNAT.Heap_Sort_G
kono
parents:
diff changeset
970
kono
parents:
diff changeset
971 --------
kono
parents:
diff changeset
972 -- Lt --
kono
parents:
diff changeset
973 --------
kono
parents:
diff changeset
974
kono
parents:
diff changeset
975 function Lt (Op1, Op2 : Natural) return Boolean is
kono
parents:
diff changeset
976 begin
kono
parents:
diff changeset
977 if Op1 = 0 then
kono
parents:
diff changeset
978 return Is_Less_Than (Tmp, Arr (Op2));
kono
parents:
diff changeset
979 elsif Op2 = 0 then
kono
parents:
diff changeset
980 return Is_Less_Than (Arr (Op1), Tmp);
kono
parents:
diff changeset
981 else
kono
parents:
diff changeset
982 return Is_Less_Than (Arr (Op1), Arr (Op2));
kono
parents:
diff changeset
983 end if;
kono
parents:
diff changeset
984 end Lt;
kono
parents:
diff changeset
985
kono
parents:
diff changeset
986 ----------
kono
parents:
diff changeset
987 -- Move --
kono
parents:
diff changeset
988 ----------
kono
parents:
diff changeset
989
kono
parents:
diff changeset
990 procedure Move (From, To : Natural) is
kono
parents:
diff changeset
991 begin
kono
parents:
diff changeset
992 if To = 0 then
kono
parents:
diff changeset
993 Tmp := Arr (From);
kono
parents:
diff changeset
994 elsif From = 0 then
kono
parents:
diff changeset
995 Arr (To) := Tmp;
kono
parents:
diff changeset
996 else
kono
parents:
diff changeset
997 Arr (To) := Arr (From);
kono
parents:
diff changeset
998 end if;
kono
parents:
diff changeset
999 end Move;
kono
parents:
diff changeset
1000
kono
parents:
diff changeset
1001 package Ref_Sort is new GNAT.Heap_Sort_G (Move, Lt);
kono
parents:
diff changeset
1002
kono
parents:
diff changeset
1003 -- Start of processing for Sort
kono
parents:
diff changeset
1004
kono
parents:
diff changeset
1005 begin
kono
parents:
diff changeset
1006 Ref_Sort.Sort (Arr'Last);
kono
parents:
diff changeset
1007 end Sort;
kono
parents:
diff changeset
1008
kono
parents:
diff changeset
1009 -----------------------
kono
parents:
diff changeset
1010 -- Grep_Source_Files --
kono
parents:
diff changeset
1011 -----------------------
kono
parents:
diff changeset
1012
kono
parents:
diff changeset
1013 procedure Grep_Source_Files is
kono
parents:
diff changeset
1014 Length : Natural := 0;
kono
parents:
diff changeset
1015 Decl : Declaration_Reference := Entities_HTable.Get_First;
kono
parents:
diff changeset
1016 Arr : Reference_Array_Access;
kono
parents:
diff changeset
1017 Index : Natural;
kono
parents:
diff changeset
1018 End_Index : Natural;
kono
parents:
diff changeset
1019 Current_File : File_Reference;
kono
parents:
diff changeset
1020 Current_Line : Cst_String_Access;
kono
parents:
diff changeset
1021 Buffer : GNAT.OS_Lib.String_Access;
kono
parents:
diff changeset
1022 Ref : Reference;
kono
parents:
diff changeset
1023 Line : Natural;
kono
parents:
diff changeset
1024
kono
parents:
diff changeset
1025 begin
kono
parents:
diff changeset
1026 -- Create a temporary array, where all references will be
kono
parents:
diff changeset
1027 -- sorted by files. This way, we only have to read the source
kono
parents:
diff changeset
1028 -- files once.
kono
parents:
diff changeset
1029
kono
parents:
diff changeset
1030 while Decl /= null loop
kono
parents:
diff changeset
1031
kono
parents:
diff changeset
1032 -- Add 1 for the declaration itself
kono
parents:
diff changeset
1033
kono
parents:
diff changeset
1034 Length := Length + References_Count (Decl, True, True, True) + 1;
kono
parents:
diff changeset
1035 Decl := Entities_HTable.Get_Next;
kono
parents:
diff changeset
1036 end loop;
kono
parents:
diff changeset
1037
kono
parents:
diff changeset
1038 Arr := new Reference_Array (1 .. Length);
kono
parents:
diff changeset
1039 Index := Arr'First;
kono
parents:
diff changeset
1040
kono
parents:
diff changeset
1041 Decl := Entities_HTable.Get_First;
kono
parents:
diff changeset
1042 while Decl /= null loop
kono
parents:
diff changeset
1043 Store_References (Decl, True, True, True, True, Arr.all, Index);
kono
parents:
diff changeset
1044 Decl := Entities_HTable.Get_Next;
kono
parents:
diff changeset
1045 end loop;
kono
parents:
diff changeset
1046
kono
parents:
diff changeset
1047 Sort (Arr.all);
kono
parents:
diff changeset
1048
kono
parents:
diff changeset
1049 -- Now traverse the whole array and find the appropriate source
kono
parents:
diff changeset
1050 -- lines.
kono
parents:
diff changeset
1051
kono
parents:
diff changeset
1052 for R in Arr'Range loop
kono
parents:
diff changeset
1053 Ref := Arr (R);
kono
parents:
diff changeset
1054
kono
parents:
diff changeset
1055 if Ref.File /= Current_File then
kono
parents:
diff changeset
1056 Free (Buffer);
kono
parents:
diff changeset
1057 begin
kono
parents:
diff changeset
1058 Read_File (Get_File (Ref.File, With_Dir => True), Buffer);
kono
parents:
diff changeset
1059 End_Index := Buffer'First - 1;
kono
parents:
diff changeset
1060 Line := 0;
kono
parents:
diff changeset
1061 exception
kono
parents:
diff changeset
1062 when Ada.Text_IO.Name_Error | Ada.Text_IO.End_Error =>
kono
parents:
diff changeset
1063 Line := Natural'Last;
kono
parents:
diff changeset
1064 end;
kono
parents:
diff changeset
1065 Current_File := Ref.File;
kono
parents:
diff changeset
1066 end if;
kono
parents:
diff changeset
1067
kono
parents:
diff changeset
1068 if Ref.Line > Line then
kono
parents:
diff changeset
1069
kono
parents:
diff changeset
1070 -- Do not free Current_Line, it is referenced by the last
kono
parents:
diff changeset
1071 -- Ref we processed.
kono
parents:
diff changeset
1072
kono
parents:
diff changeset
1073 loop
kono
parents:
diff changeset
1074 Index := End_Index + 1;
kono
parents:
diff changeset
1075
kono
parents:
diff changeset
1076 loop
kono
parents:
diff changeset
1077 End_Index := End_Index + 1;
kono
parents:
diff changeset
1078 exit when End_Index > Buffer'Last
kono
parents:
diff changeset
1079 or else Buffer (End_Index) = ASCII.LF;
kono
parents:
diff changeset
1080 end loop;
kono
parents:
diff changeset
1081
kono
parents:
diff changeset
1082 -- Skip spaces at beginning of line
kono
parents:
diff changeset
1083
kono
parents:
diff changeset
1084 while Index < End_Index and then
kono
parents:
diff changeset
1085 (Buffer (Index) = ' ' or else Buffer (Index) = ASCII.HT)
kono
parents:
diff changeset
1086 loop
kono
parents:
diff changeset
1087 Index := Index + 1;
kono
parents:
diff changeset
1088 end loop;
kono
parents:
diff changeset
1089
kono
parents:
diff changeset
1090 Line := Line + 1;
kono
parents:
diff changeset
1091 exit when Ref.Line = Line;
kono
parents:
diff changeset
1092 end loop;
kono
parents:
diff changeset
1093
kono
parents:
diff changeset
1094 Current_Line := new String'(Buffer (Index .. End_Index - 1));
kono
parents:
diff changeset
1095 end if;
kono
parents:
diff changeset
1096
kono
parents:
diff changeset
1097 Ref.Source_Line := Current_Line;
kono
parents:
diff changeset
1098 end loop;
kono
parents:
diff changeset
1099
kono
parents:
diff changeset
1100 Free (Buffer);
kono
parents:
diff changeset
1101 Free (Arr);
kono
parents:
diff changeset
1102 end Grep_Source_Files;
kono
parents:
diff changeset
1103
kono
parents:
diff changeset
1104 ---------------
kono
parents:
diff changeset
1105 -- Read_File --
kono
parents:
diff changeset
1106 ---------------
kono
parents:
diff changeset
1107
kono
parents:
diff changeset
1108 procedure Read_File
kono
parents:
diff changeset
1109 (File_Name : String;
kono
parents:
diff changeset
1110 Contents : out GNAT.OS_Lib.String_Access)
kono
parents:
diff changeset
1111 is
kono
parents:
diff changeset
1112 Name_0 : constant String := File_Name & ASCII.NUL;
kono
parents:
diff changeset
1113 FD : constant File_Descriptor := Open_Read (Name_0'Address, Binary);
kono
parents:
diff changeset
1114 Length : Natural;
kono
parents:
diff changeset
1115
kono
parents:
diff changeset
1116 begin
kono
parents:
diff changeset
1117 if FD = Invalid_FD then
kono
parents:
diff changeset
1118 raise Ada.Text_IO.Name_Error;
kono
parents:
diff changeset
1119 end if;
kono
parents:
diff changeset
1120
kono
parents:
diff changeset
1121 -- Include room for EOF char
kono
parents:
diff changeset
1122
kono
parents:
diff changeset
1123 Length := Natural (File_Length (FD));
kono
parents:
diff changeset
1124
kono
parents:
diff changeset
1125 declare
kono
parents:
diff changeset
1126 Buffer : String (1 .. Length + 1);
kono
parents:
diff changeset
1127 This_Read : Integer;
kono
parents:
diff changeset
1128 Read_Ptr : Natural := 1;
kono
parents:
diff changeset
1129
kono
parents:
diff changeset
1130 begin
kono
parents:
diff changeset
1131 loop
kono
parents:
diff changeset
1132 This_Read := Read (FD,
kono
parents:
diff changeset
1133 A => Buffer (Read_Ptr)'Address,
kono
parents:
diff changeset
1134 N => Length + 1 - Read_Ptr);
kono
parents:
diff changeset
1135 Read_Ptr := Read_Ptr + Integer'Max (This_Read, 0);
kono
parents:
diff changeset
1136 exit when This_Read <= 0;
kono
parents:
diff changeset
1137 end loop;
kono
parents:
diff changeset
1138
kono
parents:
diff changeset
1139 Buffer (Read_Ptr) := EOF;
kono
parents:
diff changeset
1140 Contents := new String'(Buffer (1 .. Read_Ptr));
kono
parents:
diff changeset
1141
kono
parents:
diff changeset
1142 if Read_Ptr /= Length + 1 then
kono
parents:
diff changeset
1143 raise Ada.Text_IO.End_Error;
kono
parents:
diff changeset
1144 end if;
kono
parents:
diff changeset
1145
kono
parents:
diff changeset
1146 Close (FD);
kono
parents:
diff changeset
1147 end;
kono
parents:
diff changeset
1148 end Read_File;
kono
parents:
diff changeset
1149
kono
parents:
diff changeset
1150 -----------------------
kono
parents:
diff changeset
1151 -- Longest_File_Name --
kono
parents:
diff changeset
1152 -----------------------
kono
parents:
diff changeset
1153
kono
parents:
diff changeset
1154 function Longest_File_Name return Natural is
kono
parents:
diff changeset
1155 begin
kono
parents:
diff changeset
1156 return Longest_File_Name_In_Table;
kono
parents:
diff changeset
1157 end Longest_File_Name;
kono
parents:
diff changeset
1158
kono
parents:
diff changeset
1159 -----------
kono
parents:
diff changeset
1160 -- Match --
kono
parents:
diff changeset
1161 -----------
kono
parents:
diff changeset
1162
kono
parents:
diff changeset
1163 function Match
kono
parents:
diff changeset
1164 (File : File_Reference;
kono
parents:
diff changeset
1165 Line : Natural;
kono
parents:
diff changeset
1166 Column : Natural)
kono
parents:
diff changeset
1167 return Boolean
kono
parents:
diff changeset
1168 is
kono
parents:
diff changeset
1169 Ref : Ref_In_File_Ptr := File.Lines;
kono
parents:
diff changeset
1170
kono
parents:
diff changeset
1171 begin
kono
parents:
diff changeset
1172 while Ref /= null loop
kono
parents:
diff changeset
1173 if (Ref.Line = 0 or else Ref.Line = Line)
kono
parents:
diff changeset
1174 and then (Ref.Column = 0 or else Ref.Column = Column)
kono
parents:
diff changeset
1175 then
kono
parents:
diff changeset
1176 return True;
kono
parents:
diff changeset
1177 end if;
kono
parents:
diff changeset
1178
kono
parents:
diff changeset
1179 Ref := Ref.Next;
kono
parents:
diff changeset
1180 end loop;
kono
parents:
diff changeset
1181
kono
parents:
diff changeset
1182 return False;
kono
parents:
diff changeset
1183 end Match;
kono
parents:
diff changeset
1184
kono
parents:
diff changeset
1185 -----------
kono
parents:
diff changeset
1186 -- Match --
kono
parents:
diff changeset
1187 -----------
kono
parents:
diff changeset
1188
kono
parents:
diff changeset
1189 function Match (Decl : Declaration_Reference) return Boolean is
kono
parents:
diff changeset
1190 begin
kono
parents:
diff changeset
1191 return Decl.Match;
kono
parents:
diff changeset
1192 end Match;
kono
parents:
diff changeset
1193
kono
parents:
diff changeset
1194 ----------
kono
parents:
diff changeset
1195 -- Next --
kono
parents:
diff changeset
1196 ----------
kono
parents:
diff changeset
1197
kono
parents:
diff changeset
1198 function Next (E : File_Reference) return File_Reference is
kono
parents:
diff changeset
1199 begin
kono
parents:
diff changeset
1200 return E.Next;
kono
parents:
diff changeset
1201 end Next;
kono
parents:
diff changeset
1202
kono
parents:
diff changeset
1203 function Next (E : Declaration_Reference) return Declaration_Reference is
kono
parents:
diff changeset
1204 begin
kono
parents:
diff changeset
1205 return E.Next;
kono
parents:
diff changeset
1206 end Next;
kono
parents:
diff changeset
1207
kono
parents:
diff changeset
1208 ------------------
kono
parents:
diff changeset
1209 -- Next_Obj_Dir --
kono
parents:
diff changeset
1210 ------------------
kono
parents:
diff changeset
1211
kono
parents:
diff changeset
1212 function Next_Obj_Dir return String is
kono
parents:
diff changeset
1213 First : constant Integer := Directories.Obj_Dir_Index;
kono
parents:
diff changeset
1214 Last : Integer;
kono
parents:
diff changeset
1215
kono
parents:
diff changeset
1216 begin
kono
parents:
diff changeset
1217 Last := Directories.Obj_Dir_Index;
kono
parents:
diff changeset
1218
kono
parents:
diff changeset
1219 if Last > Directories.Obj_Dir_Length then
kono
parents:
diff changeset
1220 return String'(1 .. 0 => ' ');
kono
parents:
diff changeset
1221 end if;
kono
parents:
diff changeset
1222
kono
parents:
diff changeset
1223 while Directories.Obj_Dir (Last) /= Path_Separator loop
kono
parents:
diff changeset
1224 Last := Last + 1;
kono
parents:
diff changeset
1225 end loop;
kono
parents:
diff changeset
1226
kono
parents:
diff changeset
1227 Directories.Obj_Dir_Index := Last + 1;
kono
parents:
diff changeset
1228 Directories.Last_Obj_Dir_Start := First;
kono
parents:
diff changeset
1229 return Directories.Obj_Dir (First .. Last - 1);
kono
parents:
diff changeset
1230 end Next_Obj_Dir;
kono
parents:
diff changeset
1231
kono
parents:
diff changeset
1232 -------------------------
kono
parents:
diff changeset
1233 -- Next_Unvisited_File --
kono
parents:
diff changeset
1234 -------------------------
kono
parents:
diff changeset
1235
kono
parents:
diff changeset
1236 function Next_Unvisited_File return File_Reference is
kono
parents:
diff changeset
1237 procedure Unchecked_Free is new Ada.Unchecked_Deallocation
kono
parents:
diff changeset
1238 (Unvisited_Files_Record, Unvisited_Files_Access);
kono
parents:
diff changeset
1239
kono
parents:
diff changeset
1240 Ref : File_Reference;
kono
parents:
diff changeset
1241 Tmp : Unvisited_Files_Access;
kono
parents:
diff changeset
1242
kono
parents:
diff changeset
1243 begin
kono
parents:
diff changeset
1244 if Unvisited_Files = null then
kono
parents:
diff changeset
1245 return Empty_File;
kono
parents:
diff changeset
1246 else
kono
parents:
diff changeset
1247 Tmp := Unvisited_Files;
kono
parents:
diff changeset
1248 Ref := Unvisited_Files.File;
kono
parents:
diff changeset
1249 Unvisited_Files := Unvisited_Files.Next;
kono
parents:
diff changeset
1250 Unchecked_Free (Tmp);
kono
parents:
diff changeset
1251 return Ref;
kono
parents:
diff changeset
1252 end if;
kono
parents:
diff changeset
1253 end Next_Unvisited_File;
kono
parents:
diff changeset
1254
kono
parents:
diff changeset
1255 ----------------------
kono
parents:
diff changeset
1256 -- Parse_Gnatls_Src --
kono
parents:
diff changeset
1257 ----------------------
kono
parents:
diff changeset
1258
kono
parents:
diff changeset
1259 function Parse_Gnatls_Src return String is
kono
parents:
diff changeset
1260 Length : Natural;
kono
parents:
diff changeset
1261
kono
parents:
diff changeset
1262 begin
kono
parents:
diff changeset
1263 Length := 0;
kono
parents:
diff changeset
1264 for J in 1 .. Osint.Nb_Dir_In_Src_Search_Path loop
kono
parents:
diff changeset
1265 if Osint.Dir_In_Src_Search_Path (J)'Length = 0 then
kono
parents:
diff changeset
1266 Length := Length + 2;
kono
parents:
diff changeset
1267 else
kono
parents:
diff changeset
1268 Length := Length + Osint.Dir_In_Src_Search_Path (J)'Length + 1;
kono
parents:
diff changeset
1269 end if;
kono
parents:
diff changeset
1270 end loop;
kono
parents:
diff changeset
1271
kono
parents:
diff changeset
1272 declare
kono
parents:
diff changeset
1273 Result : String (1 .. Length);
kono
parents:
diff changeset
1274 L : Natural;
kono
parents:
diff changeset
1275
kono
parents:
diff changeset
1276 begin
kono
parents:
diff changeset
1277 L := Result'First;
kono
parents:
diff changeset
1278 for J in 1 .. Osint.Nb_Dir_In_Src_Search_Path loop
kono
parents:
diff changeset
1279 if Osint.Dir_In_Src_Search_Path (J)'Length = 0 then
kono
parents:
diff changeset
1280 Result (L .. L + 1) := "." & Path_Separator;
kono
parents:
diff changeset
1281 L := L + 2;
kono
parents:
diff changeset
1282
kono
parents:
diff changeset
1283 else
kono
parents:
diff changeset
1284 Result (L .. L + Osint.Dir_In_Src_Search_Path (J)'Length - 1) :=
kono
parents:
diff changeset
1285 Osint.Dir_In_Src_Search_Path (J).all;
kono
parents:
diff changeset
1286 L := L + Osint.Dir_In_Src_Search_Path (J)'Length;
kono
parents:
diff changeset
1287 Result (L) := Path_Separator;
kono
parents:
diff changeset
1288 L := L + 1;
kono
parents:
diff changeset
1289 end if;
kono
parents:
diff changeset
1290 end loop;
kono
parents:
diff changeset
1291
kono
parents:
diff changeset
1292 return Result;
kono
parents:
diff changeset
1293 end;
kono
parents:
diff changeset
1294 end Parse_Gnatls_Src;
kono
parents:
diff changeset
1295
kono
parents:
diff changeset
1296 ----------------------
kono
parents:
diff changeset
1297 -- Parse_Gnatls_Obj --
kono
parents:
diff changeset
1298 ----------------------
kono
parents:
diff changeset
1299
kono
parents:
diff changeset
1300 function Parse_Gnatls_Obj return String is
kono
parents:
diff changeset
1301 Length : Natural;
kono
parents:
diff changeset
1302
kono
parents:
diff changeset
1303 begin
kono
parents:
diff changeset
1304 Length := 0;
kono
parents:
diff changeset
1305 for J in 1 .. Osint.Nb_Dir_In_Obj_Search_Path loop
kono
parents:
diff changeset
1306 if Osint.Dir_In_Obj_Search_Path (J)'Length = 0 then
kono
parents:
diff changeset
1307 Length := Length + 2;
kono
parents:
diff changeset
1308 else
kono
parents:
diff changeset
1309 Length := Length + Osint.Dir_In_Obj_Search_Path (J)'Length + 1;
kono
parents:
diff changeset
1310 end if;
kono
parents:
diff changeset
1311 end loop;
kono
parents:
diff changeset
1312
kono
parents:
diff changeset
1313 declare
kono
parents:
diff changeset
1314 Result : String (1 .. Length);
kono
parents:
diff changeset
1315 L : Natural;
kono
parents:
diff changeset
1316
kono
parents:
diff changeset
1317 begin
kono
parents:
diff changeset
1318 L := Result'First;
kono
parents:
diff changeset
1319 for J in 1 .. Osint.Nb_Dir_In_Obj_Search_Path loop
kono
parents:
diff changeset
1320 if Osint.Dir_In_Obj_Search_Path (J)'Length = 0 then
kono
parents:
diff changeset
1321 Result (L .. L + 1) := "." & Path_Separator;
kono
parents:
diff changeset
1322 L := L + 2;
kono
parents:
diff changeset
1323 else
kono
parents:
diff changeset
1324 Result (L .. L + Osint.Dir_In_Obj_Search_Path (J)'Length - 1) :=
kono
parents:
diff changeset
1325 Osint.Dir_In_Obj_Search_Path (J).all;
kono
parents:
diff changeset
1326 L := L + Osint.Dir_In_Obj_Search_Path (J)'Length;
kono
parents:
diff changeset
1327 Result (L) := Path_Separator;
kono
parents:
diff changeset
1328 L := L + 1;
kono
parents:
diff changeset
1329 end if;
kono
parents:
diff changeset
1330 end loop;
kono
parents:
diff changeset
1331
kono
parents:
diff changeset
1332 return Result;
kono
parents:
diff changeset
1333 end;
kono
parents:
diff changeset
1334 end Parse_Gnatls_Obj;
kono
parents:
diff changeset
1335
kono
parents:
diff changeset
1336 -------------------
kono
parents:
diff changeset
1337 -- Reset_Obj_Dir --
kono
parents:
diff changeset
1338 -------------------
kono
parents:
diff changeset
1339
kono
parents:
diff changeset
1340 procedure Reset_Obj_Dir is
kono
parents:
diff changeset
1341 begin
kono
parents:
diff changeset
1342 Directories.Obj_Dir_Index := 1;
kono
parents:
diff changeset
1343 end Reset_Obj_Dir;
kono
parents:
diff changeset
1344
kono
parents:
diff changeset
1345 -----------------------
kono
parents:
diff changeset
1346 -- Set_Default_Match --
kono
parents:
diff changeset
1347 -----------------------
kono
parents:
diff changeset
1348
kono
parents:
diff changeset
1349 procedure Set_Default_Match (Value : Boolean) is
kono
parents:
diff changeset
1350 begin
kono
parents:
diff changeset
1351 Default_Match := Value;
kono
parents:
diff changeset
1352 end Set_Default_Match;
kono
parents:
diff changeset
1353
kono
parents:
diff changeset
1354 ----------
kono
parents:
diff changeset
1355 -- Free --
kono
parents:
diff changeset
1356 ----------
kono
parents:
diff changeset
1357
kono
parents:
diff changeset
1358 procedure Free (Str : in out Cst_String_Access) is
kono
parents:
diff changeset
1359 function Convert is new Ada.Unchecked_Conversion
kono
parents:
diff changeset
1360 (Cst_String_Access, GNAT.OS_Lib.String_Access);
kono
parents:
diff changeset
1361
kono
parents:
diff changeset
1362 S : GNAT.OS_Lib.String_Access := Convert (Str);
kono
parents:
diff changeset
1363
kono
parents:
diff changeset
1364 begin
kono
parents:
diff changeset
1365 Free (S);
kono
parents:
diff changeset
1366 Str := null;
kono
parents:
diff changeset
1367 end Free;
kono
parents:
diff changeset
1368
kono
parents:
diff changeset
1369 ---------------------
kono
parents:
diff changeset
1370 -- Reset_Directory --
kono
parents:
diff changeset
1371 ---------------------
kono
parents:
diff changeset
1372
kono
parents:
diff changeset
1373 procedure Reset_Directory (File : File_Reference) is
kono
parents:
diff changeset
1374 begin
kono
parents:
diff changeset
1375 Free (File.Dir);
kono
parents:
diff changeset
1376 end Reset_Directory;
kono
parents:
diff changeset
1377
kono
parents:
diff changeset
1378 -------------------
kono
parents:
diff changeset
1379 -- Set_Unvisited --
kono
parents:
diff changeset
1380 -------------------
kono
parents:
diff changeset
1381
kono
parents:
diff changeset
1382 procedure Set_Unvisited (File_Ref : File_Reference) is
kono
parents:
diff changeset
1383 F : constant String := Get_File (File_Ref, With_Dir => False);
kono
parents:
diff changeset
1384
kono
parents:
diff changeset
1385 begin
kono
parents:
diff changeset
1386 File_Ref.Visited := False;
kono
parents:
diff changeset
1387
kono
parents:
diff changeset
1388 -- ??? Do not add a source file to the list. This is true at
kono
parents:
diff changeset
1389 -- least for gnatxref, and probably for gnatfind as well
kono
parents:
diff changeset
1390
kono
parents:
diff changeset
1391 if F'Length > 4
kono
parents:
diff changeset
1392 and then F (F'Last - 3 .. F'Last) = "." & Osint.ALI_Suffix.all
kono
parents:
diff changeset
1393 then
kono
parents:
diff changeset
1394 Unvisited_Files := new Unvisited_Files_Record'
kono
parents:
diff changeset
1395 (File => File_Ref,
kono
parents:
diff changeset
1396 Next => Unvisited_Files);
kono
parents:
diff changeset
1397 end if;
kono
parents:
diff changeset
1398 end Set_Unvisited;
kono
parents:
diff changeset
1399
kono
parents:
diff changeset
1400 ----------------------
kono
parents:
diff changeset
1401 -- Get_Declarations --
kono
parents:
diff changeset
1402 ----------------------
kono
parents:
diff changeset
1403
kono
parents:
diff changeset
1404 function Get_Declarations
kono
parents:
diff changeset
1405 (Sorted : Boolean := True)
kono
parents:
diff changeset
1406 return Declaration_Array_Access
kono
parents:
diff changeset
1407 is
kono
parents:
diff changeset
1408 Arr : constant Declaration_Array_Access :=
kono
parents:
diff changeset
1409 new Declaration_Array (1 .. Entities_Count);
kono
parents:
diff changeset
1410 Decl : Declaration_Reference := Entities_HTable.Get_First;
kono
parents:
diff changeset
1411 Index : Natural := Arr'First;
kono
parents:
diff changeset
1412 Tmp : Declaration_Reference;
kono
parents:
diff changeset
1413
kono
parents:
diff changeset
1414 procedure Move (From : Natural; To : Natural);
kono
parents:
diff changeset
1415 function Lt (Op1, Op2 : Natural) return Boolean;
kono
parents:
diff changeset
1416 -- See GNAT.Heap_Sort_G
kono
parents:
diff changeset
1417
kono
parents:
diff changeset
1418 --------
kono
parents:
diff changeset
1419 -- Lt --
kono
parents:
diff changeset
1420 --------
kono
parents:
diff changeset
1421
kono
parents:
diff changeset
1422 function Lt (Op1, Op2 : Natural) return Boolean is
kono
parents:
diff changeset
1423 begin
kono
parents:
diff changeset
1424 if Op1 = 0 then
kono
parents:
diff changeset
1425 return Is_Less_Than (Tmp, Arr (Op2));
kono
parents:
diff changeset
1426 elsif Op2 = 0 then
kono
parents:
diff changeset
1427 return Is_Less_Than (Arr (Op1), Tmp);
kono
parents:
diff changeset
1428 else
kono
parents:
diff changeset
1429 return Is_Less_Than (Arr (Op1), Arr (Op2));
kono
parents:
diff changeset
1430 end if;
kono
parents:
diff changeset
1431 end Lt;
kono
parents:
diff changeset
1432
kono
parents:
diff changeset
1433 ----------
kono
parents:
diff changeset
1434 -- Move --
kono
parents:
diff changeset
1435 ----------
kono
parents:
diff changeset
1436
kono
parents:
diff changeset
1437 procedure Move (From : Natural; To : Natural) is
kono
parents:
diff changeset
1438 begin
kono
parents:
diff changeset
1439 if To = 0 then
kono
parents:
diff changeset
1440 Tmp := Arr (From);
kono
parents:
diff changeset
1441 elsif From = 0 then
kono
parents:
diff changeset
1442 Arr (To) := Tmp;
kono
parents:
diff changeset
1443 else
kono
parents:
diff changeset
1444 Arr (To) := Arr (From);
kono
parents:
diff changeset
1445 end if;
kono
parents:
diff changeset
1446 end Move;
kono
parents:
diff changeset
1447
kono
parents:
diff changeset
1448 package Decl_Sort is new GNAT.Heap_Sort_G (Move, Lt);
kono
parents:
diff changeset
1449
kono
parents:
diff changeset
1450 -- Start of processing for Get_Declarations
kono
parents:
diff changeset
1451
kono
parents:
diff changeset
1452 begin
kono
parents:
diff changeset
1453 while Decl /= null loop
kono
parents:
diff changeset
1454 Arr (Index) := Decl;
kono
parents:
diff changeset
1455 Index := Index + 1;
kono
parents:
diff changeset
1456 Decl := Entities_HTable.Get_Next;
kono
parents:
diff changeset
1457 end loop;
kono
parents:
diff changeset
1458
kono
parents:
diff changeset
1459 if Sorted and then Arr'Length /= 0 then
kono
parents:
diff changeset
1460 Decl_Sort.Sort (Entities_Count);
kono
parents:
diff changeset
1461 end if;
kono
parents:
diff changeset
1462
kono
parents:
diff changeset
1463 return Arr;
kono
parents:
diff changeset
1464 end Get_Declarations;
kono
parents:
diff changeset
1465
kono
parents:
diff changeset
1466 ----------------------
kono
parents:
diff changeset
1467 -- References_Count --
kono
parents:
diff changeset
1468 ----------------------
kono
parents:
diff changeset
1469
kono
parents:
diff changeset
1470 function References_Count
kono
parents:
diff changeset
1471 (Decl : Declaration_Reference;
kono
parents:
diff changeset
1472 Get_Reads : Boolean := False;
kono
parents:
diff changeset
1473 Get_Writes : Boolean := False;
kono
parents:
diff changeset
1474 Get_Bodies : Boolean := False)
kono
parents:
diff changeset
1475 return Natural
kono
parents:
diff changeset
1476 is
kono
parents:
diff changeset
1477 function List_Length (E : Reference) return Natural;
kono
parents:
diff changeset
1478 -- Return the number of references in E
kono
parents:
diff changeset
1479
kono
parents:
diff changeset
1480 -----------------
kono
parents:
diff changeset
1481 -- List_Length --
kono
parents:
diff changeset
1482 -----------------
kono
parents:
diff changeset
1483
kono
parents:
diff changeset
1484 function List_Length (E : Reference) return Natural is
kono
parents:
diff changeset
1485 L : Natural := 0;
kono
parents:
diff changeset
1486 E1 : Reference := E;
kono
parents:
diff changeset
1487
kono
parents:
diff changeset
1488 begin
kono
parents:
diff changeset
1489 while E1 /= null loop
kono
parents:
diff changeset
1490 L := L + 1;
kono
parents:
diff changeset
1491 E1 := E1.Next;
kono
parents:
diff changeset
1492 end loop;
kono
parents:
diff changeset
1493
kono
parents:
diff changeset
1494 return L;
kono
parents:
diff changeset
1495 end List_Length;
kono
parents:
diff changeset
1496
kono
parents:
diff changeset
1497 Length : Natural := 0;
kono
parents:
diff changeset
1498
kono
parents:
diff changeset
1499 -- Start of processing for References_Count
kono
parents:
diff changeset
1500
kono
parents:
diff changeset
1501 begin
kono
parents:
diff changeset
1502 if Get_Reads then
kono
parents:
diff changeset
1503 Length := List_Length (Decl.Ref_Ref);
kono
parents:
diff changeset
1504 end if;
kono
parents:
diff changeset
1505
kono
parents:
diff changeset
1506 if Get_Writes then
kono
parents:
diff changeset
1507 Length := Length + List_Length (Decl.Modif_Ref);
kono
parents:
diff changeset
1508 end if;
kono
parents:
diff changeset
1509
kono
parents:
diff changeset
1510 if Get_Bodies then
kono
parents:
diff changeset
1511 Length := Length + List_Length (Decl.Body_Ref);
kono
parents:
diff changeset
1512 end if;
kono
parents:
diff changeset
1513
kono
parents:
diff changeset
1514 return Length;
kono
parents:
diff changeset
1515 end References_Count;
kono
parents:
diff changeset
1516
kono
parents:
diff changeset
1517 ----------------------
kono
parents:
diff changeset
1518 -- Store_References --
kono
parents:
diff changeset
1519 ----------------------
kono
parents:
diff changeset
1520
kono
parents:
diff changeset
1521 procedure Store_References
kono
parents:
diff changeset
1522 (Decl : Declaration_Reference;
kono
parents:
diff changeset
1523 Get_Writes : Boolean := False;
kono
parents:
diff changeset
1524 Get_Reads : Boolean := False;
kono
parents:
diff changeset
1525 Get_Bodies : Boolean := False;
kono
parents:
diff changeset
1526 Get_Declaration : Boolean := False;
kono
parents:
diff changeset
1527 Arr : in out Reference_Array;
kono
parents:
diff changeset
1528 Index : in out Natural)
kono
parents:
diff changeset
1529 is
kono
parents:
diff changeset
1530 procedure Add (List : Reference);
kono
parents:
diff changeset
1531 -- Add all the references in List to Arr
kono
parents:
diff changeset
1532
kono
parents:
diff changeset
1533 ---------
kono
parents:
diff changeset
1534 -- Add --
kono
parents:
diff changeset
1535 ---------
kono
parents:
diff changeset
1536
kono
parents:
diff changeset
1537 procedure Add (List : Reference) is
kono
parents:
diff changeset
1538 E : Reference := List;
kono
parents:
diff changeset
1539 begin
kono
parents:
diff changeset
1540 while E /= null loop
kono
parents:
diff changeset
1541 Arr (Index) := E;
kono
parents:
diff changeset
1542 Index := Index + 1;
kono
parents:
diff changeset
1543 E := E.Next;
kono
parents:
diff changeset
1544 end loop;
kono
parents:
diff changeset
1545 end Add;
kono
parents:
diff changeset
1546
kono
parents:
diff changeset
1547 -- Start of processing for Store_References
kono
parents:
diff changeset
1548
kono
parents:
diff changeset
1549 begin
kono
parents:
diff changeset
1550 if Get_Declaration then
kono
parents:
diff changeset
1551 Add (Decl.Decl);
kono
parents:
diff changeset
1552 end if;
kono
parents:
diff changeset
1553
kono
parents:
diff changeset
1554 if Get_Reads then
kono
parents:
diff changeset
1555 Add (Decl.Ref_Ref);
kono
parents:
diff changeset
1556 end if;
kono
parents:
diff changeset
1557
kono
parents:
diff changeset
1558 if Get_Writes then
kono
parents:
diff changeset
1559 Add (Decl.Modif_Ref);
kono
parents:
diff changeset
1560 end if;
kono
parents:
diff changeset
1561
kono
parents:
diff changeset
1562 if Get_Bodies then
kono
parents:
diff changeset
1563 Add (Decl.Body_Ref);
kono
parents:
diff changeset
1564 end if;
kono
parents:
diff changeset
1565 end Store_References;
kono
parents:
diff changeset
1566
kono
parents:
diff changeset
1567 --------------------
kono
parents:
diff changeset
1568 -- Get_References --
kono
parents:
diff changeset
1569 --------------------
kono
parents:
diff changeset
1570
kono
parents:
diff changeset
1571 function Get_References
kono
parents:
diff changeset
1572 (Decl : Declaration_Reference;
kono
parents:
diff changeset
1573 Get_Reads : Boolean := False;
kono
parents:
diff changeset
1574 Get_Writes : Boolean := False;
kono
parents:
diff changeset
1575 Get_Bodies : Boolean := False)
kono
parents:
diff changeset
1576 return Reference_Array_Access
kono
parents:
diff changeset
1577 is
kono
parents:
diff changeset
1578 Length : constant Natural :=
kono
parents:
diff changeset
1579 References_Count (Decl, Get_Reads, Get_Writes, Get_Bodies);
kono
parents:
diff changeset
1580
kono
parents:
diff changeset
1581 Arr : constant Reference_Array_Access :=
kono
parents:
diff changeset
1582 new Reference_Array (1 .. Length);
kono
parents:
diff changeset
1583
kono
parents:
diff changeset
1584 Index : Natural := Arr'First;
kono
parents:
diff changeset
1585
kono
parents:
diff changeset
1586 begin
kono
parents:
diff changeset
1587 Store_References
kono
parents:
diff changeset
1588 (Decl => Decl,
kono
parents:
diff changeset
1589 Get_Writes => Get_Writes,
kono
parents:
diff changeset
1590 Get_Reads => Get_Reads,
kono
parents:
diff changeset
1591 Get_Bodies => Get_Bodies,
kono
parents:
diff changeset
1592 Get_Declaration => False,
kono
parents:
diff changeset
1593 Arr => Arr.all,
kono
parents:
diff changeset
1594 Index => Index);
kono
parents:
diff changeset
1595
kono
parents:
diff changeset
1596 if Arr'Length /= 0 then
kono
parents:
diff changeset
1597 Sort (Arr.all);
kono
parents:
diff changeset
1598 end if;
kono
parents:
diff changeset
1599
kono
parents:
diff changeset
1600 return Arr;
kono
parents:
diff changeset
1601 end Get_References;
kono
parents:
diff changeset
1602
kono
parents:
diff changeset
1603 ----------
kono
parents:
diff changeset
1604 -- Free --
kono
parents:
diff changeset
1605 ----------
kono
parents:
diff changeset
1606
kono
parents:
diff changeset
1607 procedure Free (Arr : in out Reference_Array_Access) is
kono
parents:
diff changeset
1608 procedure Internal is new Ada.Unchecked_Deallocation
kono
parents:
diff changeset
1609 (Reference_Array, Reference_Array_Access);
kono
parents:
diff changeset
1610 begin
kono
parents:
diff changeset
1611 Internal (Arr);
kono
parents:
diff changeset
1612 end Free;
kono
parents:
diff changeset
1613
kono
parents:
diff changeset
1614 ------------------
kono
parents:
diff changeset
1615 -- Is_Parameter --
kono
parents:
diff changeset
1616 ------------------
kono
parents:
diff changeset
1617
kono
parents:
diff changeset
1618 function Is_Parameter (Decl : Declaration_Reference) return Boolean is
kono
parents:
diff changeset
1619 begin
kono
parents:
diff changeset
1620 return Decl.Is_Parameter;
kono
parents:
diff changeset
1621 end Is_Parameter;
kono
parents:
diff changeset
1622
kono
parents:
diff changeset
1623 end Xr_Tabls;