annotate gcc/ada/xref_lib.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
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 E F _ L I B --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
kono
parents:
diff changeset
9 -- Copyright (C) 1998-2017, Free Software Foundation, Inc. --
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 Osint;
kono
parents:
diff changeset
27 with Output; use Output;
kono
parents:
diff changeset
28 with Types; use Types;
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 with Unchecked_Deallocation;
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Ada.Strings.Fixed; use Ada.Strings.Fixed;
kono
parents:
diff changeset
33 with Ada.Text_IO;
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 with GNAT.Command_Line; use GNAT.Command_Line;
kono
parents:
diff changeset
36 with GNAT.IO_Aux; use GNAT.IO_Aux;
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 package body Xref_Lib is
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 Type_Position : constant := 50;
kono
parents:
diff changeset
41 -- Column for label identifying type of entity
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 ---------------------
kono
parents:
diff changeset
44 -- Local Variables --
kono
parents:
diff changeset
45 ---------------------
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 Pipe : constant Character := '|';
kono
parents:
diff changeset
48 -- First character on xref lines in the .ali file
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 No_Xref_Information : exception;
kono
parents:
diff changeset
51 -- Exception raised when there is no cross-referencing information in
kono
parents:
diff changeset
52 -- the .ali files.
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 procedure Parse_EOL
kono
parents:
diff changeset
55 (Source : not null access String;
kono
parents:
diff changeset
56 Ptr : in out Positive;
kono
parents:
diff changeset
57 Skip_Continuation_Line : Boolean := False);
kono
parents:
diff changeset
58 -- On return Source (Ptr) is the first character of the next line
kono
parents:
diff changeset
59 -- or EOF. Source.all must be terminated by EOF.
kono
parents:
diff changeset
60 --
kono
parents:
diff changeset
61 -- If Skip_Continuation_Line is True, this subprogram skips as many
kono
parents:
diff changeset
62 -- lines as required when the second or more lines starts with '.'
kono
parents:
diff changeset
63 -- (continuation lines in ALI files).
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 function Current_Xref_File (File : ALI_File) return File_Reference;
kono
parents:
diff changeset
66 -- Return the file matching the last 'X' line we found while parsing
kono
parents:
diff changeset
67 -- the ALI file.
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 function File_Name (File : ALI_File; Num : Positive) return File_Reference;
kono
parents:
diff changeset
70 -- Returns the dependency file name number Num
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 function Get_Full_Type (Decl : Declaration_Reference) return String;
kono
parents:
diff changeset
73 -- Returns the full type corresponding to a type letter as found in
kono
parents:
diff changeset
74 -- the .ali files.
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 procedure Open
kono
parents:
diff changeset
77 (Name : String;
kono
parents:
diff changeset
78 File : out ALI_File;
kono
parents:
diff changeset
79 Dependencies : Boolean := False);
kono
parents:
diff changeset
80 -- Open a new ALI file. If Dependencies is True, the insert every library
kono
parents:
diff changeset
81 -- file 'with'ed in the files database (used for gnatxref)
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 procedure Parse_Identifier_Info
kono
parents:
diff changeset
84 (Pattern : Search_Pattern;
kono
parents:
diff changeset
85 File : in out ALI_File;
kono
parents:
diff changeset
86 Local_Symbols : Boolean;
kono
parents:
diff changeset
87 Der_Info : Boolean := False;
kono
parents:
diff changeset
88 Type_Tree : Boolean := False;
kono
parents:
diff changeset
89 Wide_Search : Boolean := True;
kono
parents:
diff changeset
90 Labels_As_Ref : Boolean := True);
kono
parents:
diff changeset
91 -- Output the file and the line where the identifier was referenced,
kono
parents:
diff changeset
92 -- If Local_Symbols is False then only the publicly visible symbols
kono
parents:
diff changeset
93 -- will be processed.
kono
parents:
diff changeset
94 --
kono
parents:
diff changeset
95 -- If Labels_As_Ref is true, then the references to the entities after
kono
parents:
diff changeset
96 -- the end statements ("end Foo") will be counted as actual references.
kono
parents:
diff changeset
97 -- The entity will never be reported as unreferenced by gnatxref -u
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 procedure Parse_Token
kono
parents:
diff changeset
100 (Source : not null access String;
kono
parents:
diff changeset
101 Ptr : in out Positive;
kono
parents:
diff changeset
102 Token_Ptr : out Positive);
kono
parents:
diff changeset
103 -- Skips any separators and stores the start of the token in Token_Ptr.
kono
parents:
diff changeset
104 -- Then stores the position of the next separator in Ptr. On return
kono
parents:
diff changeset
105 -- Source (Token_Ptr .. Ptr - 1) is the token. Separators are space
kono
parents:
diff changeset
106 -- and ASCII.HT. Parse_Token will never skip to the next line.
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 procedure Parse_Number
kono
parents:
diff changeset
109 (Source : not null access String;
kono
parents:
diff changeset
110 Ptr : in out Positive;
kono
parents:
diff changeset
111 Number : out Natural);
kono
parents:
diff changeset
112 -- Skips any separators and parses Source up to the first character that
kono
parents:
diff changeset
113 -- is not a decimal digit. Returns value of parsed digits or 0 if none.
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 procedure Parse_X_Filename (File : in out ALI_File);
kono
parents:
diff changeset
116 -- Reads and processes "X..." lines in the ALI file
kono
parents:
diff changeset
117 -- and updates the File.X_File information.
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 procedure Skip_To_First_X_Line
kono
parents:
diff changeset
120 (File : in out ALI_File;
kono
parents:
diff changeset
121 D_Lines : Boolean;
kono
parents:
diff changeset
122 W_Lines : Boolean);
kono
parents:
diff changeset
123 -- Skip the lines in the ALI file until the first cross-reference line
kono
parents:
diff changeset
124 -- (^X...) is found. Search is started from the beginning of the file.
kono
parents:
diff changeset
125 -- If not such line is found, No_Xref_Information is raised.
kono
parents:
diff changeset
126 -- If W_Lines is false, then the lines "^W" are not parsed.
kono
parents:
diff changeset
127 -- If D_Lines is false, then the lines "^D" are not parsed.
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 ----------------
kono
parents:
diff changeset
130 -- Add_Entity --
kono
parents:
diff changeset
131 ----------------
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 procedure Add_Entity
kono
parents:
diff changeset
134 (Pattern : in out Search_Pattern;
kono
parents:
diff changeset
135 Entity : String;
kono
parents:
diff changeset
136 Glob : Boolean := False)
kono
parents:
diff changeset
137 is
kono
parents:
diff changeset
138 File_Start : Natural;
kono
parents:
diff changeset
139 Line_Start : Natural;
kono
parents:
diff changeset
140 Col_Start : Natural;
kono
parents:
diff changeset
141 Line_Num : Natural := 0;
kono
parents:
diff changeset
142 Col_Num : Natural := 0;
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 File_Ref : File_Reference := Empty_File;
kono
parents:
diff changeset
145 pragma Warnings (Off, File_Ref);
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 begin
kono
parents:
diff changeset
148 -- Find the end of the first item in Entity (pattern or file?)
kono
parents:
diff changeset
149 -- If there is no ':', we only have a pattern
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 File_Start := Index (Entity, ":");
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 -- If the regular expression is invalid, just consider it as a string
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 if File_Start = 0 then
kono
parents:
diff changeset
156 begin
kono
parents:
diff changeset
157 Pattern.Entity := Compile (Entity, Glob, False);
kono
parents:
diff changeset
158 Pattern.Initialized := True;
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 exception
kono
parents:
diff changeset
161 when Error_In_Regexp =>
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 -- The basic idea is to insert a \ before every character
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 declare
kono
parents:
diff changeset
166 Tmp_Regexp : String (1 .. 2 * Entity'Length);
kono
parents:
diff changeset
167 Index : Positive := 1;
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 begin
kono
parents:
diff changeset
170 for J in Entity'Range loop
kono
parents:
diff changeset
171 Tmp_Regexp (Index) := '\';
kono
parents:
diff changeset
172 Tmp_Regexp (Index + 1) := Entity (J);
kono
parents:
diff changeset
173 Index := Index + 2;
kono
parents:
diff changeset
174 end loop;
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 Pattern.Entity := Compile (Tmp_Regexp, True, False);
kono
parents:
diff changeset
177 Pattern.Initialized := True;
kono
parents:
diff changeset
178 end;
kono
parents:
diff changeset
179 end;
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 Set_Default_Match (True);
kono
parents:
diff changeset
182 return;
kono
parents:
diff changeset
183 end if;
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 -- If there is a dot in the pattern, then it is a file name
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 if (Glob and then
kono
parents:
diff changeset
188 Index (Entity (Entity'First .. File_Start - 1), ".") /= 0)
kono
parents:
diff changeset
189 or else
kono
parents:
diff changeset
190 (not Glob
kono
parents:
diff changeset
191 and then Index (Entity (Entity'First .. File_Start - 1),
kono
parents:
diff changeset
192 "\.") /= 0)
kono
parents:
diff changeset
193 then
kono
parents:
diff changeset
194 Pattern.Entity := Compile (".*", False);
kono
parents:
diff changeset
195 Pattern.Initialized := True;
kono
parents:
diff changeset
196 File_Start := Entity'First;
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 else
kono
parents:
diff changeset
199 -- If the regular expression is invalid, just consider it as a string
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 begin
kono
parents:
diff changeset
202 Pattern.Entity :=
kono
parents:
diff changeset
203 Compile (Entity (Entity'First .. File_Start - 1), Glob, False);
kono
parents:
diff changeset
204 Pattern.Initialized := True;
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 exception
kono
parents:
diff changeset
207 when Error_In_Regexp =>
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 -- The basic idea is to insert a \ before every character
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 declare
kono
parents:
diff changeset
212 Tmp_Regexp : String (1 .. 2 * (File_Start - Entity'First));
kono
parents:
diff changeset
213 Index : Positive := 1;
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 begin
kono
parents:
diff changeset
216 for J in Entity'First .. File_Start - 1 loop
kono
parents:
diff changeset
217 Tmp_Regexp (Index) := '\';
kono
parents:
diff changeset
218 Tmp_Regexp (Index + 1) := Entity (J);
kono
parents:
diff changeset
219 Index := Index + 2;
kono
parents:
diff changeset
220 end loop;
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 Pattern.Entity := Compile (Tmp_Regexp, True, False);
kono
parents:
diff changeset
223 Pattern.Initialized := True;
kono
parents:
diff changeset
224 end;
kono
parents:
diff changeset
225 end;
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 File_Start := File_Start + 1;
kono
parents:
diff changeset
228 end if;
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 -- Parse the file name
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 Line_Start := Index (Entity (File_Start .. Entity'Last), ":");
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 -- Check if it was a disk:\directory item (for Windows)
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 if File_Start = Line_Start - 1
kono
parents:
diff changeset
237 and then Line_Start < Entity'Last
kono
parents:
diff changeset
238 and then Entity (Line_Start + 1) = '\'
kono
parents:
diff changeset
239 then
kono
parents:
diff changeset
240 Line_Start := Index (Entity (Line_Start + 1 .. Entity'Last), ":");
kono
parents:
diff changeset
241 end if;
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 if Line_Start = 0 then
kono
parents:
diff changeset
244 Line_Start := Entity'Length + 1;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 elsif Line_Start /= Entity'Last then
kono
parents:
diff changeset
247 Col_Start := Index (Entity (Line_Start + 1 .. Entity'Last), ":");
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 if Col_Start = 0 then
kono
parents:
diff changeset
250 Col_Start := Entity'Last + 1;
kono
parents:
diff changeset
251 end if;
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 if Col_Start > Line_Start + 1 then
kono
parents:
diff changeset
254 begin
kono
parents:
diff changeset
255 Line_Num := Natural'Value
kono
parents:
diff changeset
256 (Entity (Line_Start + 1 .. Col_Start - 1));
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 exception
kono
parents:
diff changeset
259 when Constraint_Error =>
kono
parents:
diff changeset
260 raise Invalid_Argument;
kono
parents:
diff changeset
261 end;
kono
parents:
diff changeset
262 end if;
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 if Col_Start < Entity'Last then
kono
parents:
diff changeset
265 begin
kono
parents:
diff changeset
266 Col_Num := Natural'Value (Entity
kono
parents:
diff changeset
267 (Col_Start + 1 .. Entity'Last));
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 exception
kono
parents:
diff changeset
270 when Constraint_Error => raise Invalid_Argument;
kono
parents:
diff changeset
271 end;
kono
parents:
diff changeset
272 end if;
kono
parents:
diff changeset
273 end if;
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 declare
kono
parents:
diff changeset
276 File_Name : String := Entity (File_Start .. Line_Start - 1);
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 begin
kono
parents:
diff changeset
279 Osint.Canonical_Case_File_Name (File_Name);
kono
parents:
diff changeset
280 File_Ref := Add_To_Xref_File (File_Name, Visited => True);
kono
parents:
diff changeset
281 Pattern.File_Ref := File_Ref;
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 Add_Line (Pattern.File_Ref, Line_Num, Col_Num);
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 File_Ref :=
kono
parents:
diff changeset
286 Add_To_Xref_File
kono
parents:
diff changeset
287 (ALI_File_Name (File_Name),
kono
parents:
diff changeset
288 Visited => False,
kono
parents:
diff changeset
289 Emit_Warning => True);
kono
parents:
diff changeset
290 end;
kono
parents:
diff changeset
291 end Add_Entity;
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 -------------------
kono
parents:
diff changeset
294 -- Add_Xref_File --
kono
parents:
diff changeset
295 -------------------
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 procedure Add_Xref_File (File : String) is
kono
parents:
diff changeset
298 File_Ref : File_Reference := Empty_File;
kono
parents:
diff changeset
299 pragma Unreferenced (File_Ref);
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 Iterator : Expansion_Iterator;
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 procedure Add_Xref_File_Internal (File : String);
kono
parents:
diff changeset
304 -- Do the actual addition of the file
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 ----------------------------
kono
parents:
diff changeset
307 -- Add_Xref_File_Internal --
kono
parents:
diff changeset
308 ----------------------------
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 procedure Add_Xref_File_Internal (File : String) is
kono
parents:
diff changeset
311 begin
kono
parents:
diff changeset
312 -- Case where we have an ALI file, accept it even though this is
kono
parents:
diff changeset
313 -- not official usage, since the intention is obvious
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 if Tail (File, 4) = "." & Osint.ALI_Suffix.all then
kono
parents:
diff changeset
316 File_Ref := Add_To_Xref_File
kono
parents:
diff changeset
317 (File, Visited => False, Emit_Warning => True);
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 -- Normal non-ali file case
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 else
kono
parents:
diff changeset
322 File_Ref := Add_To_Xref_File (File, Visited => True);
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 File_Ref := Add_To_Xref_File
kono
parents:
diff changeset
325 (ALI_File_Name (File),
kono
parents:
diff changeset
326 Visited => False, Emit_Warning => True);
kono
parents:
diff changeset
327 end if;
kono
parents:
diff changeset
328 end Add_Xref_File_Internal;
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 -- Start of processing for Add_Xref_File
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 begin
kono
parents:
diff changeset
333 -- Check if we need to do the expansion
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 if Ada.Strings.Fixed.Index (File, "*") /= 0
kono
parents:
diff changeset
336 or else Ada.Strings.Fixed.Index (File, "?") /= 0
kono
parents:
diff changeset
337 then
kono
parents:
diff changeset
338 Start_Expansion (Iterator, File);
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 loop
kono
parents:
diff changeset
341 declare
kono
parents:
diff changeset
342 S : constant String := Expansion (Iterator);
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 begin
kono
parents:
diff changeset
345 exit when S'Length = 0;
kono
parents:
diff changeset
346 Add_Xref_File_Internal (S);
kono
parents:
diff changeset
347 end;
kono
parents:
diff changeset
348 end loop;
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 else
kono
parents:
diff changeset
351 Add_Xref_File_Internal (File);
kono
parents:
diff changeset
352 end if;
kono
parents:
diff changeset
353 end Add_Xref_File;
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 -----------------------
kono
parents:
diff changeset
356 -- Current_Xref_File --
kono
parents:
diff changeset
357 -----------------------
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 function Current_Xref_File (File : ALI_File) return File_Reference is
kono
parents:
diff changeset
360 begin
kono
parents:
diff changeset
361 return File.X_File;
kono
parents:
diff changeset
362 end Current_Xref_File;
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 --------------------------
kono
parents:
diff changeset
365 -- Default_Project_File --
kono
parents:
diff changeset
366 --------------------------
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 function Default_Project_File (Dir_Name : String) return String is
kono
parents:
diff changeset
369 My_Dir : Dir_Type;
kono
parents:
diff changeset
370 Dir_Ent : File_Name_String;
kono
parents:
diff changeset
371 Last : Natural;
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 begin
kono
parents:
diff changeset
374 Open (My_Dir, Dir_Name);
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 loop
kono
parents:
diff changeset
377 Read (My_Dir, Dir_Ent, Last);
kono
parents:
diff changeset
378 exit when Last = 0;
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 if Tail (Dir_Ent (1 .. Last), 4) = ".adp" then
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 -- The first project file found is the good one
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 Close (My_Dir);
kono
parents:
diff changeset
385 return Dir_Ent (1 .. Last);
kono
parents:
diff changeset
386 end if;
kono
parents:
diff changeset
387 end loop;
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 Close (My_Dir);
kono
parents:
diff changeset
390 return String'(1 .. 0 => ' ');
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 exception
kono
parents:
diff changeset
393 when Directory_Error => return String'(1 .. 0 => ' ');
kono
parents:
diff changeset
394 end Default_Project_File;
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 ---------------
kono
parents:
diff changeset
397 -- File_Name --
kono
parents:
diff changeset
398 ---------------
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 function File_Name
kono
parents:
diff changeset
401 (File : ALI_File;
kono
parents:
diff changeset
402 Num : Positive) return File_Reference
kono
parents:
diff changeset
403 is
kono
parents:
diff changeset
404 Table : Table_Type renames File.Dep.Table (1 .. Last (File.Dep));
kono
parents:
diff changeset
405 begin
kono
parents:
diff changeset
406 return Table (Num);
kono
parents:
diff changeset
407 end File_Name;
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 --------------------
kono
parents:
diff changeset
410 -- Find_ALI_Files --
kono
parents:
diff changeset
411 --------------------
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 procedure Find_ALI_Files is
kono
parents:
diff changeset
414 My_Dir : Rec_DIR;
kono
parents:
diff changeset
415 Dir_Ent : File_Name_String;
kono
parents:
diff changeset
416 Last : Natural;
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 File_Ref : File_Reference;
kono
parents:
diff changeset
419 pragma Unreferenced (File_Ref);
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 function Open_Next_Dir return Boolean;
kono
parents:
diff changeset
422 -- Tries to open the next object directory, and return False if
kono
parents:
diff changeset
423 -- the directory cannot be opened.
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 -------------------
kono
parents:
diff changeset
426 -- Open_Next_Dir --
kono
parents:
diff changeset
427 -------------------
kono
parents:
diff changeset
428
kono
parents:
diff changeset
429 function Open_Next_Dir return Boolean is
kono
parents:
diff changeset
430 begin
kono
parents:
diff changeset
431 -- Until we are able to open a new directory
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 loop
kono
parents:
diff changeset
434 declare
kono
parents:
diff changeset
435 Obj_Dir : constant String := Next_Obj_Dir;
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 begin
kono
parents:
diff changeset
438 -- Case of no more Obj_Dir lines
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 if Obj_Dir'Length = 0 then
kono
parents:
diff changeset
441 return False;
kono
parents:
diff changeset
442 end if;
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 Open (My_Dir.Dir, Obj_Dir);
kono
parents:
diff changeset
445 exit;
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 exception
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 -- Could not open the directory
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 when Directory_Error => null;
kono
parents:
diff changeset
452 end;
kono
parents:
diff changeset
453 end loop;
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 return True;
kono
parents:
diff changeset
456 end Open_Next_Dir;
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 -- Start of processing for Find_ALI_Files
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 begin
kono
parents:
diff changeset
461 Reset_Obj_Dir;
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 if Open_Next_Dir then
kono
parents:
diff changeset
464 loop
kono
parents:
diff changeset
465 Read (My_Dir.Dir, Dir_Ent, Last);
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 if Last = 0 then
kono
parents:
diff changeset
468 Close (My_Dir.Dir);
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 if not Open_Next_Dir then
kono
parents:
diff changeset
471 return;
kono
parents:
diff changeset
472 end if;
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 elsif Last > 4
kono
parents:
diff changeset
475 and then Dir_Ent (Last - 3 .. Last) = "." & Osint.ALI_Suffix.all
kono
parents:
diff changeset
476 then
kono
parents:
diff changeset
477 File_Ref :=
kono
parents:
diff changeset
478 Add_To_Xref_File (Dir_Ent (1 .. Last), Visited => False);
kono
parents:
diff changeset
479 end if;
kono
parents:
diff changeset
480 end loop;
kono
parents:
diff changeset
481 end if;
kono
parents:
diff changeset
482 end Find_ALI_Files;
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 -------------------
kono
parents:
diff changeset
485 -- Get_Full_Type --
kono
parents:
diff changeset
486 -------------------
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 function Get_Full_Type (Decl : Declaration_Reference) return String is
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 function Param_String return String;
kono
parents:
diff changeset
491 -- Return the string to display depending on whether Decl is a parameter
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 ------------------
kono
parents:
diff changeset
494 -- Param_String --
kono
parents:
diff changeset
495 ------------------
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 function Param_String return String is
kono
parents:
diff changeset
498 begin
kono
parents:
diff changeset
499 if Is_Parameter (Decl) then
kono
parents:
diff changeset
500 return "parameter ";
kono
parents:
diff changeset
501 else
kono
parents:
diff changeset
502 return "";
kono
parents:
diff changeset
503 end if;
kono
parents:
diff changeset
504 end Param_String;
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 -- Start of processing for Get_Full_Type
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 begin
kono
parents:
diff changeset
509 case Get_Type (Decl) is
kono
parents:
diff changeset
510 when 'A' => return "array type";
kono
parents:
diff changeset
511 when 'B' => return "boolean type";
kono
parents:
diff changeset
512 when 'C' => return "class-wide type";
kono
parents:
diff changeset
513 when 'D' => return "decimal type";
kono
parents:
diff changeset
514 when 'E' => return "enumeration type";
kono
parents:
diff changeset
515 when 'F' => return "float type";
kono
parents:
diff changeset
516 when 'H' => return "abstract type";
kono
parents:
diff changeset
517 when 'I' => return "integer type";
kono
parents:
diff changeset
518 when 'M' => return "modular type";
kono
parents:
diff changeset
519 when 'O' => return "fixed type";
kono
parents:
diff changeset
520 when 'P' => return "access type";
kono
parents:
diff changeset
521 when 'R' => return "record type";
kono
parents:
diff changeset
522 when 'S' => return "string type";
kono
parents:
diff changeset
523 when 'T' => return "task type";
kono
parents:
diff changeset
524 when 'W' => return "protected type";
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 when 'a' => return Param_String & "array object";
kono
parents:
diff changeset
527 when 'b' => return Param_String & "boolean object";
kono
parents:
diff changeset
528 when 'c' => return Param_String & "class-wide object";
kono
parents:
diff changeset
529 when 'd' => return Param_String & "decimal object";
kono
parents:
diff changeset
530 when 'e' => return Param_String & "enumeration object";
kono
parents:
diff changeset
531 when 'f' => return Param_String & "float object";
kono
parents:
diff changeset
532 when 'i' => return Param_String & "integer object";
kono
parents:
diff changeset
533 when 'j' => return Param_String & "class object";
kono
parents:
diff changeset
534 when 'm' => return Param_String & "modular object";
kono
parents:
diff changeset
535 when 'o' => return Param_String & "fixed object";
kono
parents:
diff changeset
536 when 'p' => return Param_String & "access object";
kono
parents:
diff changeset
537 when 'r' => return Param_String & "record object";
kono
parents:
diff changeset
538 when 's' => return Param_String & "string object";
kono
parents:
diff changeset
539 when 't' => return Param_String & "task object";
kono
parents:
diff changeset
540 when 'w' => return Param_String & "protected object";
kono
parents:
diff changeset
541 when 'x' => return Param_String & "abstract procedure";
kono
parents:
diff changeset
542 when 'y' => return Param_String & "abstract function";
kono
parents:
diff changeset
543
kono
parents:
diff changeset
544 when 'h' => return "interface";
kono
parents:
diff changeset
545 when 'g' => return "macro";
kono
parents:
diff changeset
546 when 'G' => return "function macro";
kono
parents:
diff changeset
547 when 'J' => return "class";
kono
parents:
diff changeset
548 when 'K' => return "package";
kono
parents:
diff changeset
549 when 'k' => return "generic package";
kono
parents:
diff changeset
550 when 'L' => return "statement label";
kono
parents:
diff changeset
551 when 'l' => return "loop label";
kono
parents:
diff changeset
552 when 'N' => return "named number";
kono
parents:
diff changeset
553 when 'n' => return "enumeration literal";
kono
parents:
diff changeset
554 when 'q' => return "block label";
kono
parents:
diff changeset
555 when 'Q' => return "include file";
kono
parents:
diff changeset
556 when 'U' => return "procedure";
kono
parents:
diff changeset
557 when 'u' => return "generic procedure";
kono
parents:
diff changeset
558 when 'V' => return "function";
kono
parents:
diff changeset
559 when 'v' => return "generic function";
kono
parents:
diff changeset
560 when 'X' => return "exception";
kono
parents:
diff changeset
561 when 'Y' => return "entry";
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 when '+' => return "private type";
kono
parents:
diff changeset
564 when '*' => return "private variable";
kono
parents:
diff changeset
565
kono
parents:
diff changeset
566 -- The above should be the only possibilities, but for this kind
kono
parents:
diff changeset
567 -- of informational output, we don't want to bomb if we find
kono
parents:
diff changeset
568 -- something else, so just return three question marks when we
kono
parents:
diff changeset
569 -- have an unknown Abbrev value
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 when others =>
kono
parents:
diff changeset
572 if Is_Parameter (Decl) then
kono
parents:
diff changeset
573 return "parameter";
kono
parents:
diff changeset
574 else
kono
parents:
diff changeset
575 return "??? (" & Get_Type (Decl) & ")";
kono
parents:
diff changeset
576 end if;
kono
parents:
diff changeset
577 end case;
kono
parents:
diff changeset
578 end Get_Full_Type;
kono
parents:
diff changeset
579
kono
parents:
diff changeset
580 --------------------------
kono
parents:
diff changeset
581 -- Skip_To_First_X_Line --
kono
parents:
diff changeset
582 --------------------------
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 procedure Skip_To_First_X_Line
kono
parents:
diff changeset
585 (File : in out ALI_File;
kono
parents:
diff changeset
586 D_Lines : Boolean;
kono
parents:
diff changeset
587 W_Lines : Boolean)
kono
parents:
diff changeset
588 is
kono
parents:
diff changeset
589 Ali : String_Access renames File.Buffer;
kono
parents:
diff changeset
590 Token : Positive;
kono
parents:
diff changeset
591 Ptr : Positive := Ali'First;
kono
parents:
diff changeset
592 Num_Dependencies : Natural := 0;
kono
parents:
diff changeset
593 File_Start : Positive;
kono
parents:
diff changeset
594 File_End : Positive;
kono
parents:
diff changeset
595 Gnatchop_Offset : Integer;
kono
parents:
diff changeset
596 Gnatchop_Name : Positive;
kono
parents:
diff changeset
597
kono
parents:
diff changeset
598 File_Ref : File_Reference;
kono
parents:
diff changeset
599 pragma Unreferenced (File_Ref);
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 begin
kono
parents:
diff changeset
602 -- Read all the lines possibly processing with-clauses and dependency
kono
parents:
diff changeset
603 -- information and exit on finding the first Xref line.
kono
parents:
diff changeset
604 -- A fall-through of the loop means that there is no xref information
kono
parents:
diff changeset
605 -- which is an error condition.
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 while Ali (Ptr) /= EOF loop
kono
parents:
diff changeset
608 if D_Lines and then Ali (Ptr) = 'D' then
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 -- Found dependency information. Format looks like:
kono
parents:
diff changeset
611 -- D src-nam time-stmp checksum [subunit-name] [line:file-name]
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 -- Skip the D and parse the filenam
kono
parents:
diff changeset
614
kono
parents:
diff changeset
615 Ptr := Ptr + 1;
kono
parents:
diff changeset
616 Parse_Token (Ali, Ptr, Token);
kono
parents:
diff changeset
617 File_Start := Token;
kono
parents:
diff changeset
618 File_End := Ptr - 1;
kono
parents:
diff changeset
619
kono
parents:
diff changeset
620 Num_Dependencies := Num_Dependencies + 1;
kono
parents:
diff changeset
621 Set_Last (File.Dep, Num_Dependencies);
kono
parents:
diff changeset
622
kono
parents:
diff changeset
623 Parse_Token (Ali, Ptr, Token); -- Skip time-stamp
kono
parents:
diff changeset
624 Parse_Token (Ali, Ptr, Token); -- Skip checksum
kono
parents:
diff changeset
625 Parse_Token (Ali, Ptr, Token); -- Read next entity on the line
kono
parents:
diff changeset
626
kono
parents:
diff changeset
627 if not (Ali (Token) in '0' .. '9') then
kono
parents:
diff changeset
628 Parse_Token (Ali, Ptr, Token); -- Was a subunit name
kono
parents:
diff changeset
629 end if;
kono
parents:
diff changeset
630
kono
parents:
diff changeset
631 -- Did we have a gnatchop-ed file with a pragma Source_Reference ?
kono
parents:
diff changeset
632
kono
parents:
diff changeset
633 Gnatchop_Offset := 0;
kono
parents:
diff changeset
634
kono
parents:
diff changeset
635 if Ali (Token) in '0' .. '9' then
kono
parents:
diff changeset
636 Gnatchop_Name := Token;
kono
parents:
diff changeset
637 while Ali (Gnatchop_Name) /= ':' loop
kono
parents:
diff changeset
638 Gnatchop_Name := Gnatchop_Name + 1;
kono
parents:
diff changeset
639 end loop;
kono
parents:
diff changeset
640
kono
parents:
diff changeset
641 Gnatchop_Offset :=
kono
parents:
diff changeset
642 2 - Natural'Value (Ali (Token .. Gnatchop_Name - 1));
kono
parents:
diff changeset
643 Token := Gnatchop_Name + 1;
kono
parents:
diff changeset
644 end if;
kono
parents:
diff changeset
645
kono
parents:
diff changeset
646 declare
kono
parents:
diff changeset
647 Table : Table_Type renames
kono
parents:
diff changeset
648 File.Dep.Table (1 .. Last (File.Dep));
kono
parents:
diff changeset
649 begin
kono
parents:
diff changeset
650 Table (Num_Dependencies) := Add_To_Xref_File
kono
parents:
diff changeset
651 (Ali (File_Start .. File_End),
kono
parents:
diff changeset
652 Gnatchop_File => Ali (Token .. Ptr - 1),
kono
parents:
diff changeset
653 Gnatchop_Offset => Gnatchop_Offset);
kono
parents:
diff changeset
654 end;
kono
parents:
diff changeset
655
kono
parents:
diff changeset
656 elsif W_Lines and then Ali (Ptr) = 'W' then
kono
parents:
diff changeset
657
kono
parents:
diff changeset
658 -- Found with-clause information. Format looks like:
kono
parents:
diff changeset
659 -- "W debug%s debug.adb debug.ali"
kono
parents:
diff changeset
660
kono
parents:
diff changeset
661 -- Skip the W and parse the .ali filename (3rd token)
kono
parents:
diff changeset
662
kono
parents:
diff changeset
663 Parse_Token (Ali, Ptr, Token);
kono
parents:
diff changeset
664 Parse_Token (Ali, Ptr, Token);
kono
parents:
diff changeset
665 Parse_Token (Ali, Ptr, Token);
kono
parents:
diff changeset
666
kono
parents:
diff changeset
667 File_Ref :=
kono
parents:
diff changeset
668 Add_To_Xref_File (Ali (Token .. Ptr - 1), Visited => False);
kono
parents:
diff changeset
669
kono
parents:
diff changeset
670 elsif Ali (Ptr) = 'X' then
kono
parents:
diff changeset
671
kono
parents:
diff changeset
672 -- Found a cross-referencing line - stop processing
kono
parents:
diff changeset
673
kono
parents:
diff changeset
674 File.Current_Line := Ptr;
kono
parents:
diff changeset
675 File.Xref_Line := Ptr;
kono
parents:
diff changeset
676 return;
kono
parents:
diff changeset
677 end if;
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 Parse_EOL (Ali, Ptr);
kono
parents:
diff changeset
680 end loop;
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 raise No_Xref_Information;
kono
parents:
diff changeset
683 end Skip_To_First_X_Line;
kono
parents:
diff changeset
684
kono
parents:
diff changeset
685 ----------
kono
parents:
diff changeset
686 -- Open --
kono
parents:
diff changeset
687 ----------
kono
parents:
diff changeset
688
kono
parents:
diff changeset
689 procedure Open
kono
parents:
diff changeset
690 (Name : String;
kono
parents:
diff changeset
691 File : out ALI_File;
kono
parents:
diff changeset
692 Dependencies : Boolean := False)
kono
parents:
diff changeset
693 is
kono
parents:
diff changeset
694 Ali : String_Access renames File.Buffer;
kono
parents:
diff changeset
695 pragma Warnings (Off, Ali);
kono
parents:
diff changeset
696
kono
parents:
diff changeset
697 begin
kono
parents:
diff changeset
698 if File.Buffer /= null then
kono
parents:
diff changeset
699 Free (File.Buffer);
kono
parents:
diff changeset
700 end if;
kono
parents:
diff changeset
701
kono
parents:
diff changeset
702 Init (File.Dep);
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 begin
kono
parents:
diff changeset
705 Read_File (Name, Ali);
kono
parents:
diff changeset
706
kono
parents:
diff changeset
707 exception
kono
parents:
diff changeset
708 when Ada.Text_IO.Name_Error | Ada.Text_IO.End_Error =>
kono
parents:
diff changeset
709 raise No_Xref_Information;
kono
parents:
diff changeset
710 end;
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712 Skip_To_First_X_Line (File, D_Lines => True, W_Lines => Dependencies);
kono
parents:
diff changeset
713 end Open;
kono
parents:
diff changeset
714
kono
parents:
diff changeset
715 ---------------
kono
parents:
diff changeset
716 -- Parse_EOL --
kono
parents:
diff changeset
717 ---------------
kono
parents:
diff changeset
718
kono
parents:
diff changeset
719 procedure Parse_EOL
kono
parents:
diff changeset
720 (Source : not null access String;
kono
parents:
diff changeset
721 Ptr : in out Positive;
kono
parents:
diff changeset
722 Skip_Continuation_Line : Boolean := False)
kono
parents:
diff changeset
723 is
kono
parents:
diff changeset
724 begin
kono
parents:
diff changeset
725 loop
kono
parents:
diff changeset
726 -- Skip to end of line
kono
parents:
diff changeset
727
kono
parents:
diff changeset
728 while Source (Ptr) /= ASCII.CR and then Source (Ptr) /= ASCII.LF
kono
parents:
diff changeset
729 and then Source (Ptr) /= EOF
kono
parents:
diff changeset
730 loop
kono
parents:
diff changeset
731 Ptr := Ptr + 1;
kono
parents:
diff changeset
732 end loop;
kono
parents:
diff changeset
733
kono
parents:
diff changeset
734 -- Skip CR or LF if not at end of file
kono
parents:
diff changeset
735
kono
parents:
diff changeset
736 if Source (Ptr) /= EOF then
kono
parents:
diff changeset
737 Ptr := Ptr + 1;
kono
parents:
diff changeset
738 end if;
kono
parents:
diff changeset
739
kono
parents:
diff changeset
740 -- Skip past CR/LF or LF/CR combination
kono
parents:
diff changeset
741
kono
parents:
diff changeset
742 if (Source (Ptr) = ASCII.CR or else Source (Ptr) = ASCII.LF)
kono
parents:
diff changeset
743 and then Source (Ptr) /= Source (Ptr - 1)
kono
parents:
diff changeset
744 then
kono
parents:
diff changeset
745 Ptr := Ptr + 1;
kono
parents:
diff changeset
746 end if;
kono
parents:
diff changeset
747
kono
parents:
diff changeset
748 exit when not Skip_Continuation_Line or else Source (Ptr) /= '.';
kono
parents:
diff changeset
749 end loop;
kono
parents:
diff changeset
750 end Parse_EOL;
kono
parents:
diff changeset
751
kono
parents:
diff changeset
752 ---------------------------
kono
parents:
diff changeset
753 -- Parse_Identifier_Info --
kono
parents:
diff changeset
754 ---------------------------
kono
parents:
diff changeset
755
kono
parents:
diff changeset
756 procedure Parse_Identifier_Info
kono
parents:
diff changeset
757 (Pattern : Search_Pattern;
kono
parents:
diff changeset
758 File : in out ALI_File;
kono
parents:
diff changeset
759 Local_Symbols : Boolean;
kono
parents:
diff changeset
760 Der_Info : Boolean := False;
kono
parents:
diff changeset
761 Type_Tree : Boolean := False;
kono
parents:
diff changeset
762 Wide_Search : Boolean := True;
kono
parents:
diff changeset
763 Labels_As_Ref : Boolean := True)
kono
parents:
diff changeset
764 is
kono
parents:
diff changeset
765 Ptr : Positive renames File.Current_Line;
kono
parents:
diff changeset
766 Ali : String_Access renames File.Buffer;
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 E_Line : Natural; -- Line number of current entity
kono
parents:
diff changeset
769 E_Col : Natural; -- Column number of current entity
kono
parents:
diff changeset
770 E_Type : Character; -- Type of current entity
kono
parents:
diff changeset
771 E_Name : Positive; -- Pointer to begin of entity name
kono
parents:
diff changeset
772 E_Global : Boolean; -- True iff entity is global
kono
parents:
diff changeset
773
kono
parents:
diff changeset
774 R_Line : Natural; -- Line number of current reference
kono
parents:
diff changeset
775 R_Col : Natural; -- Column number of current reference
kono
parents:
diff changeset
776 R_Type : Character; -- Type of current reference
kono
parents:
diff changeset
777
kono
parents:
diff changeset
778 Decl_Ref : Declaration_Reference;
kono
parents:
diff changeset
779 File_Ref : File_Reference := Current_Xref_File (File);
kono
parents:
diff changeset
780
kono
parents:
diff changeset
781 function Get_Symbol_Name (Eun, Line, Col : Natural) return String;
kono
parents:
diff changeset
782 -- Returns the symbol name for the entity defined at the specified
kono
parents:
diff changeset
783 -- line and column in the dependent unit number Eun. For this we need
kono
parents:
diff changeset
784 -- to parse the ali file again because the parent entity is not in
kono
parents:
diff changeset
785 -- the declaration table if it did not match the search pattern.
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 procedure Skip_To_Matching_Closing_Bracket;
kono
parents:
diff changeset
788 -- When Ptr points to an opening square bracket, moves it to the
kono
parents:
diff changeset
789 -- character following the matching closing bracket
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 ---------------------
kono
parents:
diff changeset
792 -- Get_Symbol_Name --
kono
parents:
diff changeset
793 ---------------------
kono
parents:
diff changeset
794
kono
parents:
diff changeset
795 function Get_Symbol_Name (Eun, Line, Col : Natural) return String is
kono
parents:
diff changeset
796 Ptr : Positive := 1;
kono
parents:
diff changeset
797 E_Eun : Positive; -- Unit number of current entity
kono
parents:
diff changeset
798 E_Line : Natural; -- Line number of current entity
kono
parents:
diff changeset
799 E_Col : Natural; -- Column number of current entity
kono
parents:
diff changeset
800 E_Name : Positive; -- Pointer to begin of entity name
kono
parents:
diff changeset
801
kono
parents:
diff changeset
802 begin
kono
parents:
diff changeset
803 -- Look for the X lines corresponding to unit Eun
kono
parents:
diff changeset
804
kono
parents:
diff changeset
805 loop
kono
parents:
diff changeset
806 if Ali (Ptr) = 'X' then
kono
parents:
diff changeset
807 Ptr := Ptr + 1;
kono
parents:
diff changeset
808 Parse_Number (Ali, Ptr, E_Eun);
kono
parents:
diff changeset
809 exit when E_Eun = Eun;
kono
parents:
diff changeset
810 end if;
kono
parents:
diff changeset
811
kono
parents:
diff changeset
812 Parse_EOL (Ali, Ptr, Skip_Continuation_Line => True);
kono
parents:
diff changeset
813 end loop;
kono
parents:
diff changeset
814
kono
parents:
diff changeset
815 -- Here we are in the right Ali section, we now look for the entity
kono
parents:
diff changeset
816 -- declared at position (Line, Col).
kono
parents:
diff changeset
817
kono
parents:
diff changeset
818 loop
kono
parents:
diff changeset
819 Parse_Number (Ali, Ptr, E_Line);
kono
parents:
diff changeset
820 exit when Ali (Ptr) = EOF;
kono
parents:
diff changeset
821 Ptr := Ptr + 1;
kono
parents:
diff changeset
822 Parse_Number (Ali, Ptr, E_Col);
kono
parents:
diff changeset
823 exit when Ali (Ptr) = EOF;
kono
parents:
diff changeset
824 Ptr := Ptr + 1;
kono
parents:
diff changeset
825
kono
parents:
diff changeset
826 if Line = E_Line and then Col = E_Col then
kono
parents:
diff changeset
827 Parse_Token (Ali, Ptr, E_Name);
kono
parents:
diff changeset
828 return Ali (E_Name .. Ptr - 1);
kono
parents:
diff changeset
829 end if;
kono
parents:
diff changeset
830
kono
parents:
diff changeset
831 Parse_EOL (Ali, Ptr, Skip_Continuation_Line => True);
kono
parents:
diff changeset
832 exit when Ali (Ptr) = EOF;
kono
parents:
diff changeset
833 end loop;
kono
parents:
diff changeset
834
kono
parents:
diff changeset
835 -- We were not able to find the symbol, this should not happen but
kono
parents:
diff changeset
836 -- since we don't want to stop here we return a string of three
kono
parents:
diff changeset
837 -- question marks as the symbol name.
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 return "???";
kono
parents:
diff changeset
840 end Get_Symbol_Name;
kono
parents:
diff changeset
841
kono
parents:
diff changeset
842 --------------------------------------
kono
parents:
diff changeset
843 -- Skip_To_Matching_Closing_Bracket --
kono
parents:
diff changeset
844 --------------------------------------
kono
parents:
diff changeset
845
kono
parents:
diff changeset
846 procedure Skip_To_Matching_Closing_Bracket is
kono
parents:
diff changeset
847 Num_Brackets : Natural;
kono
parents:
diff changeset
848
kono
parents:
diff changeset
849 begin
kono
parents:
diff changeset
850 Num_Brackets := 1;
kono
parents:
diff changeset
851 while Num_Brackets /= 0 loop
kono
parents:
diff changeset
852 Ptr := Ptr + 1;
kono
parents:
diff changeset
853 if Ali (Ptr) = '[' then
kono
parents:
diff changeset
854 Num_Brackets := Num_Brackets + 1;
kono
parents:
diff changeset
855 elsif Ali (Ptr) = ']' then
kono
parents:
diff changeset
856 Num_Brackets := Num_Brackets - 1;
kono
parents:
diff changeset
857 end if;
kono
parents:
diff changeset
858 end loop;
kono
parents:
diff changeset
859
kono
parents:
diff changeset
860 Ptr := Ptr + 1;
kono
parents:
diff changeset
861 end Skip_To_Matching_Closing_Bracket;
kono
parents:
diff changeset
862
kono
parents:
diff changeset
863 Table : Table_Type renames File.Dep.Table (1 .. Last (File.Dep));
kono
parents:
diff changeset
864
kono
parents:
diff changeset
865 -- Start of processing for Parse_Identifier_Info
kono
parents:
diff changeset
866
kono
parents:
diff changeset
867 begin
kono
parents:
diff changeset
868 -- The identifier info looks like:
kono
parents:
diff changeset
869 -- "38U9*Debug 12|36r6 36r19"
kono
parents:
diff changeset
870
kono
parents:
diff changeset
871 -- Extract the line, column and entity name information
kono
parents:
diff changeset
872
kono
parents:
diff changeset
873 Parse_Number (Ali, Ptr, E_Line);
kono
parents:
diff changeset
874
kono
parents:
diff changeset
875 if Ali (Ptr) > ' ' then
kono
parents:
diff changeset
876 E_Type := Ali (Ptr);
kono
parents:
diff changeset
877 Ptr := Ptr + 1;
kono
parents:
diff changeset
878 end if;
kono
parents:
diff changeset
879
kono
parents:
diff changeset
880 -- Ignore some of the entities (labels,...)
kono
parents:
diff changeset
881
kono
parents:
diff changeset
882 case E_Type is
kono
parents:
diff changeset
883 when 'l' | 'L' | 'q' =>
kono
parents:
diff changeset
884 Parse_EOL (Ali, Ptr, Skip_Continuation_Line => True);
kono
parents:
diff changeset
885 return;
kono
parents:
diff changeset
886
kono
parents:
diff changeset
887 when others =>
kono
parents:
diff changeset
888 null;
kono
parents:
diff changeset
889 end case;
kono
parents:
diff changeset
890
kono
parents:
diff changeset
891 Parse_Number (Ali, Ptr, E_Col);
kono
parents:
diff changeset
892
kono
parents:
diff changeset
893 E_Global := False;
kono
parents:
diff changeset
894 if Ali (Ptr) >= ' ' then
kono
parents:
diff changeset
895 E_Global := (Ali (Ptr) = '*');
kono
parents:
diff changeset
896 Ptr := Ptr + 1;
kono
parents:
diff changeset
897 end if;
kono
parents:
diff changeset
898
kono
parents:
diff changeset
899 Parse_Token (Ali, Ptr, E_Name);
kono
parents:
diff changeset
900
kono
parents:
diff changeset
901 -- Exit if the symbol does not match or if we have a local symbol and we
kono
parents:
diff changeset
902 -- do not want it or if the file is unknown.
kono
parents:
diff changeset
903
kono
parents:
diff changeset
904 if File.X_File = Empty_File then
kono
parents:
diff changeset
905 return;
kono
parents:
diff changeset
906 end if;
kono
parents:
diff changeset
907
kono
parents:
diff changeset
908 if (not Local_Symbols and not E_Global)
kono
parents:
diff changeset
909 or else (Pattern.Initialized
kono
parents:
diff changeset
910 and then not Match (Ali (E_Name .. Ptr - 1), Pattern.Entity))
kono
parents:
diff changeset
911 or else (E_Name >= Ptr)
kono
parents:
diff changeset
912 then
kono
parents:
diff changeset
913 Decl_Ref := Add_Declaration
kono
parents:
diff changeset
914 (File.X_File, Ali (E_Name .. Ptr - 1), E_Line, E_Col, E_Type,
kono
parents:
diff changeset
915 Remove_Only => True);
kono
parents:
diff changeset
916 Parse_EOL (Ali, Ptr, Skip_Continuation_Line => True);
kono
parents:
diff changeset
917 return;
kono
parents:
diff changeset
918 end if;
kono
parents:
diff changeset
919
kono
parents:
diff changeset
920 -- Insert the declaration in the table
kono
parents:
diff changeset
921
kono
parents:
diff changeset
922 Decl_Ref := Add_Declaration
kono
parents:
diff changeset
923 (File.X_File, Ali (E_Name .. Ptr - 1), E_Line, E_Col, E_Type);
kono
parents:
diff changeset
924
kono
parents:
diff changeset
925 if Ali (Ptr) = '[' then
kono
parents:
diff changeset
926 Skip_To_Matching_Closing_Bracket;
kono
parents:
diff changeset
927 end if;
kono
parents:
diff changeset
928
kono
parents:
diff changeset
929 -- Skip any renaming indication
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931 if Ali (Ptr) = '=' then
kono
parents:
diff changeset
932 declare
kono
parents:
diff changeset
933 P_Line, P_Column : Natural;
kono
parents:
diff changeset
934 pragma Warnings (Off, P_Line);
kono
parents:
diff changeset
935 pragma Warnings (Off, P_Column);
kono
parents:
diff changeset
936 begin
kono
parents:
diff changeset
937 Ptr := Ptr + 1;
kono
parents:
diff changeset
938 Parse_Number (Ali, Ptr, P_Line);
kono
parents:
diff changeset
939 Ptr := Ptr + 1;
kono
parents:
diff changeset
940 Parse_Number (Ali, Ptr, P_Column);
kono
parents:
diff changeset
941 end;
kono
parents:
diff changeset
942 end if;
kono
parents:
diff changeset
943
kono
parents:
diff changeset
944 while Ptr <= Ali'Last
kono
parents:
diff changeset
945 and then (Ali (Ptr) = '<'
kono
parents:
diff changeset
946 or else Ali (Ptr) = '('
kono
parents:
diff changeset
947 or else Ali (Ptr) = '{')
kono
parents:
diff changeset
948 loop
kono
parents:
diff changeset
949 -- Here we have a type derivation information. The format is
kono
parents:
diff changeset
950 -- <3|12I45> which means that the current entity is derived from the
kono
parents:
diff changeset
951 -- type defined in unit number 3, line 12 column 45. The pipe and
kono
parents:
diff changeset
952 -- unit number is optional. It is specified only if the parent type
kono
parents:
diff changeset
953 -- is not defined in the current unit.
kono
parents:
diff changeset
954
kono
parents:
diff changeset
955 -- We also have the format for generic instantiations, as in
kono
parents:
diff changeset
956 -- 7a5*Uid(3|5I8[4|2]) 2|4r74
kono
parents:
diff changeset
957
kono
parents:
diff changeset
958 -- We could also have something like
kono
parents:
diff changeset
959 -- 16I9*I<integer>
kono
parents:
diff changeset
960 -- that indicates that I derives from the predefined type integer.
kono
parents:
diff changeset
961
kono
parents:
diff changeset
962 Ptr := Ptr + 1;
kono
parents:
diff changeset
963
kono
parents:
diff changeset
964 if Ali (Ptr) in '0' .. '9' then
kono
parents:
diff changeset
965 Parse_Derived_Info : declare
kono
parents:
diff changeset
966 P_Line : Natural; -- parent entity line
kono
parents:
diff changeset
967 P_Column : Natural; -- parent entity column
kono
parents:
diff changeset
968 P_Eun : Positive; -- parent entity file number
kono
parents:
diff changeset
969
kono
parents:
diff changeset
970 begin
kono
parents:
diff changeset
971 Parse_Number (Ali, Ptr, P_Line);
kono
parents:
diff changeset
972
kono
parents:
diff changeset
973 -- If we have a pipe then the first number was the unit number
kono
parents:
diff changeset
974
kono
parents:
diff changeset
975 if Ali (Ptr) = '|' then
kono
parents:
diff changeset
976 P_Eun := P_Line;
kono
parents:
diff changeset
977 Ptr := Ptr + 1;
kono
parents:
diff changeset
978
kono
parents:
diff changeset
979 -- Now we have the line number
kono
parents:
diff changeset
980
kono
parents:
diff changeset
981 Parse_Number (Ali, Ptr, P_Line);
kono
parents:
diff changeset
982
kono
parents:
diff changeset
983 else
kono
parents:
diff changeset
984 -- We don't have a unit number specified, so we set P_Eun to
kono
parents:
diff changeset
985 -- the current unit.
kono
parents:
diff changeset
986
kono
parents:
diff changeset
987 for K in Table'Range loop
kono
parents:
diff changeset
988 P_Eun := K;
kono
parents:
diff changeset
989 exit when Table (K) = File_Ref;
kono
parents:
diff changeset
990 end loop;
kono
parents:
diff changeset
991 end if;
kono
parents:
diff changeset
992
kono
parents:
diff changeset
993 -- Then parse the type and column number
kono
parents:
diff changeset
994
kono
parents:
diff changeset
995 Ptr := Ptr + 1;
kono
parents:
diff changeset
996 Parse_Number (Ali, Ptr, P_Column);
kono
parents:
diff changeset
997
kono
parents:
diff changeset
998 -- Skip the information for generics instantiations
kono
parents:
diff changeset
999
kono
parents:
diff changeset
1000 if Ali (Ptr) = '[' then
kono
parents:
diff changeset
1001 Skip_To_Matching_Closing_Bracket;
kono
parents:
diff changeset
1002 end if;
kono
parents:
diff changeset
1003
kono
parents:
diff changeset
1004 -- Skip '>', or ')' or '>'
kono
parents:
diff changeset
1005
kono
parents:
diff changeset
1006 Ptr := Ptr + 1;
kono
parents:
diff changeset
1007
kono
parents:
diff changeset
1008 -- The derived info is needed only is the derived info mode is
kono
parents:
diff changeset
1009 -- on or if we want to output the type hierarchy
kono
parents:
diff changeset
1010
kono
parents:
diff changeset
1011 if Der_Info or else Type_Tree then
kono
parents:
diff changeset
1012 declare
kono
parents:
diff changeset
1013 Symbol : constant String :=
kono
parents:
diff changeset
1014 Get_Symbol_Name (P_Eun, P_Line, P_Column);
kono
parents:
diff changeset
1015 begin
kono
parents:
diff changeset
1016 if Symbol /= "???" then
kono
parents:
diff changeset
1017 Add_Parent
kono
parents:
diff changeset
1018 (Decl_Ref,
kono
parents:
diff changeset
1019 Symbol,
kono
parents:
diff changeset
1020 P_Line,
kono
parents:
diff changeset
1021 P_Column,
kono
parents:
diff changeset
1022 Table (P_Eun));
kono
parents:
diff changeset
1023 end if;
kono
parents:
diff changeset
1024 end;
kono
parents:
diff changeset
1025 end if;
kono
parents:
diff changeset
1026
kono
parents:
diff changeset
1027 if Type_Tree
kono
parents:
diff changeset
1028 and then (Pattern.File_Ref = Empty_File
kono
parents:
diff changeset
1029 or else
kono
parents:
diff changeset
1030 Pattern.File_Ref = Current_Xref_File (File))
kono
parents:
diff changeset
1031 then
kono
parents:
diff changeset
1032 Search_Parent_Tree : declare
kono
parents:
diff changeset
1033 Pattern : Search_Pattern; -- Parent type pattern
kono
parents:
diff changeset
1034 File_Pos_Backup : Positive;
kono
parents:
diff changeset
1035
kono
parents:
diff changeset
1036 begin
kono
parents:
diff changeset
1037 Add_Entity
kono
parents:
diff changeset
1038 (Pattern,
kono
parents:
diff changeset
1039 Get_Symbol_Name (P_Eun, P_Line, P_Column)
kono
parents:
diff changeset
1040 & ':' & Get_Gnatchop_File (Table (P_Eun))
kono
parents:
diff changeset
1041 & ':' & Get_Line (Get_Parent (Decl_Ref))
kono
parents:
diff changeset
1042 & ':' & Get_Column (Get_Parent (Decl_Ref)),
kono
parents:
diff changeset
1043 False);
kono
parents:
diff changeset
1044
kono
parents:
diff changeset
1045 -- No default match is needed to look for the parent type
kono
parents:
diff changeset
1046 -- since we are using the fully qualified symbol name:
kono
parents:
diff changeset
1047 -- symbol:file:line:column
kono
parents:
diff changeset
1048
kono
parents:
diff changeset
1049 Set_Default_Match (False);
kono
parents:
diff changeset
1050
kono
parents:
diff changeset
1051 -- The parent hierarchy is defined in the same unit as
kono
parents:
diff changeset
1052 -- the derived type. So we want to revisit the unit.
kono
parents:
diff changeset
1053
kono
parents:
diff changeset
1054 File_Pos_Backup := File.Current_Line;
kono
parents:
diff changeset
1055
kono
parents:
diff changeset
1056 Skip_To_First_X_Line
kono
parents:
diff changeset
1057 (File, D_Lines => False, W_Lines => False);
kono
parents:
diff changeset
1058
kono
parents:
diff changeset
1059 while File.Buffer (File.Current_Line) /= EOF loop
kono
parents:
diff changeset
1060 Parse_X_Filename (File);
kono
parents:
diff changeset
1061 Parse_Identifier_Info
kono
parents:
diff changeset
1062 (Pattern => Pattern,
kono
parents:
diff changeset
1063 File => File,
kono
parents:
diff changeset
1064 Local_Symbols => False,
kono
parents:
diff changeset
1065 Der_Info => Der_Info,
kono
parents:
diff changeset
1066 Type_Tree => True,
kono
parents:
diff changeset
1067 Wide_Search => False,
kono
parents:
diff changeset
1068 Labels_As_Ref => Labels_As_Ref);
kono
parents:
diff changeset
1069 end loop;
kono
parents:
diff changeset
1070
kono
parents:
diff changeset
1071 File.Current_Line := File_Pos_Backup;
kono
parents:
diff changeset
1072 end Search_Parent_Tree;
kono
parents:
diff changeset
1073 end if;
kono
parents:
diff changeset
1074 end Parse_Derived_Info;
kono
parents:
diff changeset
1075
kono
parents:
diff changeset
1076 else
kono
parents:
diff changeset
1077 while Ali (Ptr) /= '>'
kono
parents:
diff changeset
1078 and then Ali (Ptr) /= ')'
kono
parents:
diff changeset
1079 and then Ali (Ptr) /= '}'
kono
parents:
diff changeset
1080 loop
kono
parents:
diff changeset
1081 Ptr := Ptr + 1;
kono
parents:
diff changeset
1082 end loop;
kono
parents:
diff changeset
1083 Ptr := Ptr + 1;
kono
parents:
diff changeset
1084 end if;
kono
parents:
diff changeset
1085 end loop;
kono
parents:
diff changeset
1086
kono
parents:
diff changeset
1087 -- To find the body, we will have to parse the file too
kono
parents:
diff changeset
1088
kono
parents:
diff changeset
1089 if Wide_Search then
kono
parents:
diff changeset
1090 declare
kono
parents:
diff changeset
1091 File_Name : constant String := Get_Gnatchop_File (File.X_File);
kono
parents:
diff changeset
1092 Ignored : File_Reference;
kono
parents:
diff changeset
1093 begin
kono
parents:
diff changeset
1094 Ignored := Add_To_Xref_File (ALI_File_Name (File_Name), False);
kono
parents:
diff changeset
1095 end;
kono
parents:
diff changeset
1096 end if;
kono
parents:
diff changeset
1097
kono
parents:
diff changeset
1098 -- Parse references to this entity.
kono
parents:
diff changeset
1099 -- Ptr points to next reference with leading blanks
kono
parents:
diff changeset
1100
kono
parents:
diff changeset
1101 loop
kono
parents:
diff changeset
1102 -- Process references on current line
kono
parents:
diff changeset
1103
kono
parents:
diff changeset
1104 while Ali (Ptr) = ' ' or else Ali (Ptr) = ASCII.HT loop
kono
parents:
diff changeset
1105
kono
parents:
diff changeset
1106 -- For every reference read the line, type and column,
kono
parents:
diff changeset
1107 -- optionally preceded by a file number and a pipe symbol.
kono
parents:
diff changeset
1108
kono
parents:
diff changeset
1109 Parse_Number (Ali, Ptr, R_Line);
kono
parents:
diff changeset
1110
kono
parents:
diff changeset
1111 if Ali (Ptr) = Pipe then
kono
parents:
diff changeset
1112 Ptr := Ptr + 1;
kono
parents:
diff changeset
1113 File_Ref := File_Name (File, R_Line);
kono
parents:
diff changeset
1114
kono
parents:
diff changeset
1115 Parse_Number (Ali, Ptr, R_Line);
kono
parents:
diff changeset
1116 end if;
kono
parents:
diff changeset
1117
kono
parents:
diff changeset
1118 if Ali (Ptr) > ' ' then
kono
parents:
diff changeset
1119 R_Type := Ali (Ptr);
kono
parents:
diff changeset
1120 Ptr := Ptr + 1;
kono
parents:
diff changeset
1121 end if;
kono
parents:
diff changeset
1122
kono
parents:
diff changeset
1123 -- Imported entities may have an indication specifying information
kono
parents:
diff changeset
1124 -- about the corresponding external name:
kono
parents:
diff changeset
1125 -- 5U14*Foo2 5>20 6b<c,myfoo2>22 # Imported entity
kono
parents:
diff changeset
1126 -- 5U14*Foo2 5>20 6i<c,myfoo2>22 # Exported entity
kono
parents:
diff changeset
1127
kono
parents:
diff changeset
1128 if (R_Type = 'b' or else R_Type = 'i')
kono
parents:
diff changeset
1129 and then Ali (Ptr) = '<'
kono
parents:
diff changeset
1130 then
kono
parents:
diff changeset
1131 while Ptr <= Ali'Last
kono
parents:
diff changeset
1132 and then Ali (Ptr) /= '>'
kono
parents:
diff changeset
1133 loop
kono
parents:
diff changeset
1134 Ptr := Ptr + 1;
kono
parents:
diff changeset
1135 end loop;
kono
parents:
diff changeset
1136 Ptr := Ptr + 1;
kono
parents:
diff changeset
1137 end if;
kono
parents:
diff changeset
1138
kono
parents:
diff changeset
1139 Parse_Number (Ali, Ptr, R_Col);
kono
parents:
diff changeset
1140
kono
parents:
diff changeset
1141 -- Insert the reference or body in the table
kono
parents:
diff changeset
1142
kono
parents:
diff changeset
1143 Add_Reference
kono
parents:
diff changeset
1144 (Decl_Ref, File_Ref, R_Line, R_Col, R_Type, Labels_As_Ref);
kono
parents:
diff changeset
1145
kono
parents:
diff changeset
1146 -- Skip generic information, if any
kono
parents:
diff changeset
1147
kono
parents:
diff changeset
1148 if Ali (Ptr) = '[' then
kono
parents:
diff changeset
1149 declare
kono
parents:
diff changeset
1150 Num_Nested : Integer := 1;
kono
parents:
diff changeset
1151
kono
parents:
diff changeset
1152 begin
kono
parents:
diff changeset
1153 Ptr := Ptr + 1;
kono
parents:
diff changeset
1154 while Num_Nested /= 0 loop
kono
parents:
diff changeset
1155 if Ali (Ptr) = ']' then
kono
parents:
diff changeset
1156 Num_Nested := Num_Nested - 1;
kono
parents:
diff changeset
1157 elsif Ali (Ptr) = '[' then
kono
parents:
diff changeset
1158 Num_Nested := Num_Nested + 1;
kono
parents:
diff changeset
1159 end if;
kono
parents:
diff changeset
1160
kono
parents:
diff changeset
1161 Ptr := Ptr + 1;
kono
parents:
diff changeset
1162 end loop;
kono
parents:
diff changeset
1163 end;
kono
parents:
diff changeset
1164 end if;
kono
parents:
diff changeset
1165
kono
parents:
diff changeset
1166 end loop;
kono
parents:
diff changeset
1167
kono
parents:
diff changeset
1168 Parse_EOL (Ali, Ptr);
kono
parents:
diff changeset
1169
kono
parents:
diff changeset
1170 -- Loop until new line is no continuation line
kono
parents:
diff changeset
1171
kono
parents:
diff changeset
1172 exit when Ali (Ptr) /= '.';
kono
parents:
diff changeset
1173 Ptr := Ptr + 1;
kono
parents:
diff changeset
1174 end loop;
kono
parents:
diff changeset
1175 end Parse_Identifier_Info;
kono
parents:
diff changeset
1176
kono
parents:
diff changeset
1177 ------------------
kono
parents:
diff changeset
1178 -- Parse_Number --
kono
parents:
diff changeset
1179 ------------------
kono
parents:
diff changeset
1180
kono
parents:
diff changeset
1181 procedure Parse_Number
kono
parents:
diff changeset
1182 (Source : not null access String;
kono
parents:
diff changeset
1183 Ptr : in out Positive;
kono
parents:
diff changeset
1184 Number : out Natural)
kono
parents:
diff changeset
1185 is
kono
parents:
diff changeset
1186 begin
kono
parents:
diff changeset
1187 -- Skip separators
kono
parents:
diff changeset
1188
kono
parents:
diff changeset
1189 while Source (Ptr) = ' ' or else Source (Ptr) = ASCII.HT loop
kono
parents:
diff changeset
1190 Ptr := Ptr + 1;
kono
parents:
diff changeset
1191 end loop;
kono
parents:
diff changeset
1192
kono
parents:
diff changeset
1193 Number := 0;
kono
parents:
diff changeset
1194 while Source (Ptr) in '0' .. '9' loop
kono
parents:
diff changeset
1195 Number :=
kono
parents:
diff changeset
1196 10 * Number + (Character'Pos (Source (Ptr)) - Character'Pos ('0'));
kono
parents:
diff changeset
1197 Ptr := Ptr + 1;
kono
parents:
diff changeset
1198 end loop;
kono
parents:
diff changeset
1199 end Parse_Number;
kono
parents:
diff changeset
1200
kono
parents:
diff changeset
1201 -----------------
kono
parents:
diff changeset
1202 -- Parse_Token --
kono
parents:
diff changeset
1203 -----------------
kono
parents:
diff changeset
1204
kono
parents:
diff changeset
1205 procedure Parse_Token
kono
parents:
diff changeset
1206 (Source : not null access String;
kono
parents:
diff changeset
1207 Ptr : in out Positive;
kono
parents:
diff changeset
1208 Token_Ptr : out Positive)
kono
parents:
diff changeset
1209 is
kono
parents:
diff changeset
1210 In_Quotes : Character := ASCII.NUL;
kono
parents:
diff changeset
1211
kono
parents:
diff changeset
1212 begin
kono
parents:
diff changeset
1213 -- Skip separators
kono
parents:
diff changeset
1214
kono
parents:
diff changeset
1215 while Source (Ptr) = ' ' or else Source (Ptr) = ASCII.HT loop
kono
parents:
diff changeset
1216 Ptr := Ptr + 1;
kono
parents:
diff changeset
1217 end loop;
kono
parents:
diff changeset
1218
kono
parents:
diff changeset
1219 Token_Ptr := Ptr;
kono
parents:
diff changeset
1220
kono
parents:
diff changeset
1221 -- Find end-of-token
kono
parents:
diff changeset
1222
kono
parents:
diff changeset
1223 while (In_Quotes /= ASCII.NUL or else
kono
parents:
diff changeset
1224 not (Source (Ptr) = ' '
kono
parents:
diff changeset
1225 or else Source (Ptr) = ASCII.HT
kono
parents:
diff changeset
1226 or else Source (Ptr) = '<'
kono
parents:
diff changeset
1227 or else Source (Ptr) = '{'
kono
parents:
diff changeset
1228 or else Source (Ptr) = '['
kono
parents:
diff changeset
1229 or else Source (Ptr) = '='
kono
parents:
diff changeset
1230 or else Source (Ptr) = '('))
kono
parents:
diff changeset
1231 and then Source (Ptr) >= ' '
kono
parents:
diff changeset
1232 loop
kono
parents:
diff changeset
1233 -- Double-quotes are used for operators
kono
parents:
diff changeset
1234 -- Simple-quotes are used for character constants, for instance when
kono
parents:
diff changeset
1235 -- they are found in an enumeration type "type A is ('+', '-');"
kono
parents:
diff changeset
1236
kono
parents:
diff changeset
1237 case Source (Ptr) is
kono
parents:
diff changeset
1238 when '"' | ''' =>
kono
parents:
diff changeset
1239 if In_Quotes = Source (Ptr) then
kono
parents:
diff changeset
1240 In_Quotes := ASCII.NUL;
kono
parents:
diff changeset
1241 elsif In_Quotes = ASCII.NUL then
kono
parents:
diff changeset
1242 In_Quotes := Source (Ptr);
kono
parents:
diff changeset
1243 end if;
kono
parents:
diff changeset
1244
kono
parents:
diff changeset
1245 when others =>
kono
parents:
diff changeset
1246 null;
kono
parents:
diff changeset
1247 end case;
kono
parents:
diff changeset
1248
kono
parents:
diff changeset
1249 Ptr := Ptr + 1;
kono
parents:
diff changeset
1250 end loop;
kono
parents:
diff changeset
1251 end Parse_Token;
kono
parents:
diff changeset
1252
kono
parents:
diff changeset
1253 ----------------------
kono
parents:
diff changeset
1254 -- Parse_X_Filename --
kono
parents:
diff changeset
1255 ----------------------
kono
parents:
diff changeset
1256
kono
parents:
diff changeset
1257 procedure Parse_X_Filename (File : in out ALI_File) is
kono
parents:
diff changeset
1258 Ali : String_Access renames File.Buffer;
kono
parents:
diff changeset
1259 Ptr : Positive renames File.Current_Line;
kono
parents:
diff changeset
1260 File_Nr : Natural;
kono
parents:
diff changeset
1261
kono
parents:
diff changeset
1262 Table : Table_Type renames File.Dep.Table (1 .. Last (File.Dep));
kono
parents:
diff changeset
1263
kono
parents:
diff changeset
1264 begin
kono
parents:
diff changeset
1265 while Ali (Ptr) = 'X' loop
kono
parents:
diff changeset
1266
kono
parents:
diff changeset
1267 -- The current line is the start of a new Xref file section,
kono
parents:
diff changeset
1268 -- whose format looks like:
kono
parents:
diff changeset
1269
kono
parents:
diff changeset
1270 -- " X 1 debug.ads"
kono
parents:
diff changeset
1271
kono
parents:
diff changeset
1272 -- Skip the X and read the file number for the new X_File
kono
parents:
diff changeset
1273
kono
parents:
diff changeset
1274 Ptr := Ptr + 1;
kono
parents:
diff changeset
1275 Parse_Number (Ali, Ptr, File_Nr);
kono
parents:
diff changeset
1276
kono
parents:
diff changeset
1277 -- If the referenced file is unknown, we simply ignore it
kono
parents:
diff changeset
1278
kono
parents:
diff changeset
1279 if File_Nr in Table'Range then
kono
parents:
diff changeset
1280 File.X_File := Table (File_Nr);
kono
parents:
diff changeset
1281 else
kono
parents:
diff changeset
1282 File.X_File := Empty_File;
kono
parents:
diff changeset
1283 end if;
kono
parents:
diff changeset
1284
kono
parents:
diff changeset
1285 Parse_EOL (Ali, Ptr);
kono
parents:
diff changeset
1286 end loop;
kono
parents:
diff changeset
1287 end Parse_X_Filename;
kono
parents:
diff changeset
1288
kono
parents:
diff changeset
1289 --------------------
kono
parents:
diff changeset
1290 -- Print_Gnatfind --
kono
parents:
diff changeset
1291 --------------------
kono
parents:
diff changeset
1292
kono
parents:
diff changeset
1293 procedure Print_Gnatfind
kono
parents:
diff changeset
1294 (References : Boolean;
kono
parents:
diff changeset
1295 Full_Path_Name : Boolean)
kono
parents:
diff changeset
1296 is
kono
parents:
diff changeset
1297 Decls : constant Declaration_Array_Access := Get_Declarations;
kono
parents:
diff changeset
1298 Decl : Declaration_Reference;
kono
parents:
diff changeset
1299 Arr : Reference_Array_Access;
kono
parents:
diff changeset
1300
kono
parents:
diff changeset
1301 procedure Print_Ref
kono
parents:
diff changeset
1302 (Ref : Reference;
kono
parents:
diff changeset
1303 Msg : String := " ");
kono
parents:
diff changeset
1304 -- Print a reference, according to the extended tag of the output
kono
parents:
diff changeset
1305
kono
parents:
diff changeset
1306 ---------------
kono
parents:
diff changeset
1307 -- Print_Ref --
kono
parents:
diff changeset
1308 ---------------
kono
parents:
diff changeset
1309
kono
parents:
diff changeset
1310 procedure Print_Ref
kono
parents:
diff changeset
1311 (Ref : Reference;
kono
parents:
diff changeset
1312 Msg : String := " ")
kono
parents:
diff changeset
1313 is
kono
parents:
diff changeset
1314 F : String_Access :=
kono
parents:
diff changeset
1315 Osint.To_Host_File_Spec
kono
parents:
diff changeset
1316 (Get_Gnatchop_File (Ref, Full_Path_Name));
kono
parents:
diff changeset
1317
kono
parents:
diff changeset
1318 Buffer : constant String :=
kono
parents:
diff changeset
1319 F.all &
kono
parents:
diff changeset
1320 ":" & Get_Line (Ref) &
kono
parents:
diff changeset
1321 ":" & Get_Column (Ref) &
kono
parents:
diff changeset
1322 ": ";
kono
parents:
diff changeset
1323
kono
parents:
diff changeset
1324 Num_Blanks : Integer := Longest_File_Name + 10 - Buffer'Length;
kono
parents:
diff changeset
1325
kono
parents:
diff changeset
1326 begin
kono
parents:
diff changeset
1327 Free (F);
kono
parents:
diff changeset
1328 Num_Blanks := Integer'Max (0, Num_Blanks);
kono
parents:
diff changeset
1329 Write_Line
kono
parents:
diff changeset
1330 (Buffer
kono
parents:
diff changeset
1331 & String'(1 .. Num_Blanks => ' ')
kono
parents:
diff changeset
1332 & Msg & " " & Get_Symbol (Decl));
kono
parents:
diff changeset
1333
kono
parents:
diff changeset
1334 if Get_Source_Line (Ref)'Length /= 0 then
kono
parents:
diff changeset
1335 Write_Line (" " & Get_Source_Line (Ref));
kono
parents:
diff changeset
1336 end if;
kono
parents:
diff changeset
1337 end Print_Ref;
kono
parents:
diff changeset
1338
kono
parents:
diff changeset
1339 -- Start of processing for Print_Gnatfind
kono
parents:
diff changeset
1340
kono
parents:
diff changeset
1341 begin
kono
parents:
diff changeset
1342 for D in Decls'Range loop
kono
parents:
diff changeset
1343 Decl := Decls (D);
kono
parents:
diff changeset
1344
kono
parents:
diff changeset
1345 if Match (Decl) then
kono
parents:
diff changeset
1346
kono
parents:
diff changeset
1347 -- Output the declaration
kono
parents:
diff changeset
1348
kono
parents:
diff changeset
1349 declare
kono
parents:
diff changeset
1350 Parent : constant Declaration_Reference := Get_Parent (Decl);
kono
parents:
diff changeset
1351
kono
parents:
diff changeset
1352 F : String_Access :=
kono
parents:
diff changeset
1353 Osint.To_Host_File_Spec
kono
parents:
diff changeset
1354 (Get_Gnatchop_File (Decl, Full_Path_Name));
kono
parents:
diff changeset
1355
kono
parents:
diff changeset
1356 Buffer : constant String :=
kono
parents:
diff changeset
1357 F.all &
kono
parents:
diff changeset
1358 ":" & Get_Line (Decl) &
kono
parents:
diff changeset
1359 ":" & Get_Column (Decl) &
kono
parents:
diff changeset
1360 ": ";
kono
parents:
diff changeset
1361
kono
parents:
diff changeset
1362 Num_Blanks : Integer := Longest_File_Name + 10 - Buffer'Length;
kono
parents:
diff changeset
1363
kono
parents:
diff changeset
1364 begin
kono
parents:
diff changeset
1365 Free (F);
kono
parents:
diff changeset
1366 Num_Blanks := Integer'Max (0, Num_Blanks);
kono
parents:
diff changeset
1367 Write_Line
kono
parents:
diff changeset
1368 (Buffer & String'(1 .. Num_Blanks => ' ')
kono
parents:
diff changeset
1369 & "(spec) " & Get_Symbol (Decl));
kono
parents:
diff changeset
1370
kono
parents:
diff changeset
1371 if Parent /= Empty_Declaration then
kono
parents:
diff changeset
1372 F := Osint.To_Host_File_Spec (Get_Gnatchop_File (Parent));
kono
parents:
diff changeset
1373 Write_Line
kono
parents:
diff changeset
1374 (Buffer & String'(1 .. Num_Blanks => ' ')
kono
parents:
diff changeset
1375 & " derived from " & Get_Symbol (Parent)
kono
parents:
diff changeset
1376 & " ("
kono
parents:
diff changeset
1377 & F.all
kono
parents:
diff changeset
1378 & ':' & Get_Line (Parent)
kono
parents:
diff changeset
1379 & ':' & Get_Column (Parent) & ')');
kono
parents:
diff changeset
1380 Free (F);
kono
parents:
diff changeset
1381 end if;
kono
parents:
diff changeset
1382 end;
kono
parents:
diff changeset
1383
kono
parents:
diff changeset
1384 if Get_Source_Line (Decl)'Length /= 0 then
kono
parents:
diff changeset
1385 Write_Line (" " & Get_Source_Line (Decl));
kono
parents:
diff changeset
1386 end if;
kono
parents:
diff changeset
1387
kono
parents:
diff changeset
1388 -- Output the body (sorted)
kono
parents:
diff changeset
1389
kono
parents:
diff changeset
1390 Arr := Get_References (Decl, Get_Bodies => True);
kono
parents:
diff changeset
1391
kono
parents:
diff changeset
1392 for R in Arr'Range loop
kono
parents:
diff changeset
1393 Print_Ref (Arr (R), "(body)");
kono
parents:
diff changeset
1394 end loop;
kono
parents:
diff changeset
1395
kono
parents:
diff changeset
1396 Free (Arr);
kono
parents:
diff changeset
1397
kono
parents:
diff changeset
1398 if References then
kono
parents:
diff changeset
1399 Arr := Get_References
kono
parents:
diff changeset
1400 (Decl, Get_Writes => True, Get_Reads => True);
kono
parents:
diff changeset
1401
kono
parents:
diff changeset
1402 for R in Arr'Range loop
kono
parents:
diff changeset
1403 Print_Ref (Arr (R));
kono
parents:
diff changeset
1404 end loop;
kono
parents:
diff changeset
1405
kono
parents:
diff changeset
1406 Free (Arr);
kono
parents:
diff changeset
1407 end if;
kono
parents:
diff changeset
1408 end if;
kono
parents:
diff changeset
1409 end loop;
kono
parents:
diff changeset
1410 end Print_Gnatfind;
kono
parents:
diff changeset
1411
kono
parents:
diff changeset
1412 ------------------
kono
parents:
diff changeset
1413 -- Print_Unused --
kono
parents:
diff changeset
1414 ------------------
kono
parents:
diff changeset
1415
kono
parents:
diff changeset
1416 procedure Print_Unused (Full_Path_Name : Boolean) is
kono
parents:
diff changeset
1417 Decls : constant Declaration_Array_Access := Get_Declarations;
kono
parents:
diff changeset
1418 Decl : Declaration_Reference;
kono
parents:
diff changeset
1419 Arr : Reference_Array_Access;
kono
parents:
diff changeset
1420 F : String_Access;
kono
parents:
diff changeset
1421
kono
parents:
diff changeset
1422 begin
kono
parents:
diff changeset
1423 for D in Decls'Range loop
kono
parents:
diff changeset
1424 Decl := Decls (D);
kono
parents:
diff changeset
1425
kono
parents:
diff changeset
1426 if References_Count
kono
parents:
diff changeset
1427 (Decl, Get_Reads => True, Get_Writes => True) = 0
kono
parents:
diff changeset
1428 then
kono
parents:
diff changeset
1429 F := Osint.To_Host_File_Spec
kono
parents:
diff changeset
1430 (Get_Gnatchop_File (Decl, Full_Path_Name));
kono
parents:
diff changeset
1431 Write_Str (Get_Symbol (Decl)
kono
parents:
diff changeset
1432 & " ("
kono
parents:
diff changeset
1433 & Get_Full_Type (Decl)
kono
parents:
diff changeset
1434 & ") "
kono
parents:
diff changeset
1435 & F.all
kono
parents:
diff changeset
1436 & ':'
kono
parents:
diff changeset
1437 & Get_Line (Decl)
kono
parents:
diff changeset
1438 & ':'
kono
parents:
diff changeset
1439 & Get_Column (Decl));
kono
parents:
diff changeset
1440 Free (F);
kono
parents:
diff changeset
1441
kono
parents:
diff changeset
1442 -- Print the body if any
kono
parents:
diff changeset
1443
kono
parents:
diff changeset
1444 Arr := Get_References (Decl, Get_Bodies => True);
kono
parents:
diff changeset
1445
kono
parents:
diff changeset
1446 for R in Arr'Range loop
kono
parents:
diff changeset
1447 F := Osint.To_Host_File_Spec
kono
parents:
diff changeset
1448 (Get_Gnatchop_File (Arr (R), Full_Path_Name));
kono
parents:
diff changeset
1449 Write_Str (' '
kono
parents:
diff changeset
1450 & F.all
kono
parents:
diff changeset
1451 & ':' & Get_Line (Arr (R))
kono
parents:
diff changeset
1452 & ':' & Get_Column (Arr (R)));
kono
parents:
diff changeset
1453 Free (F);
kono
parents:
diff changeset
1454 end loop;
kono
parents:
diff changeset
1455
kono
parents:
diff changeset
1456 Write_Eol;
kono
parents:
diff changeset
1457 Free (Arr);
kono
parents:
diff changeset
1458 end if;
kono
parents:
diff changeset
1459 end loop;
kono
parents:
diff changeset
1460 end Print_Unused;
kono
parents:
diff changeset
1461
kono
parents:
diff changeset
1462 --------------
kono
parents:
diff changeset
1463 -- Print_Vi --
kono
parents:
diff changeset
1464 --------------
kono
parents:
diff changeset
1465
kono
parents:
diff changeset
1466 procedure Print_Vi (Full_Path_Name : Boolean) is
kono
parents:
diff changeset
1467 Tab : constant Character := ASCII.HT;
kono
parents:
diff changeset
1468 Decls : constant Declaration_Array_Access :=
kono
parents:
diff changeset
1469 Get_Declarations (Sorted => False);
kono
parents:
diff changeset
1470 Decl : Declaration_Reference;
kono
parents:
diff changeset
1471 Arr : Reference_Array_Access;
kono
parents:
diff changeset
1472 F : String_Access;
kono
parents:
diff changeset
1473
kono
parents:
diff changeset
1474 begin
kono
parents:
diff changeset
1475 for D in Decls'Range loop
kono
parents:
diff changeset
1476 Decl := Decls (D);
kono
parents:
diff changeset
1477
kono
parents:
diff changeset
1478 F := Osint.To_Host_File_Spec (Get_File (Decl, Full_Path_Name));
kono
parents:
diff changeset
1479 Write_Line (Get_Symbol (Decl) & Tab & F.all & Tab & Get_Line (Decl));
kono
parents:
diff changeset
1480 Free (F);
kono
parents:
diff changeset
1481
kono
parents:
diff changeset
1482 -- Print the body if any
kono
parents:
diff changeset
1483
kono
parents:
diff changeset
1484 Arr := Get_References (Decl, Get_Bodies => True);
kono
parents:
diff changeset
1485
kono
parents:
diff changeset
1486 for R in Arr'Range loop
kono
parents:
diff changeset
1487 F := Osint.To_Host_File_Spec (Get_File (Arr (R), Full_Path_Name));
kono
parents:
diff changeset
1488 Write_Line
kono
parents:
diff changeset
1489 (Get_Symbol (Decl) & Tab & F.all & Tab & Get_Line (Arr (R)));
kono
parents:
diff changeset
1490 Free (F);
kono
parents:
diff changeset
1491 end loop;
kono
parents:
diff changeset
1492
kono
parents:
diff changeset
1493 Free (Arr);
kono
parents:
diff changeset
1494
kono
parents:
diff changeset
1495 -- Print the modifications
kono
parents:
diff changeset
1496
kono
parents:
diff changeset
1497 Arr := Get_References (Decl, Get_Writes => True, Get_Reads => True);
kono
parents:
diff changeset
1498
kono
parents:
diff changeset
1499 for R in Arr'Range loop
kono
parents:
diff changeset
1500 F := Osint.To_Host_File_Spec (Get_File (Arr (R), Full_Path_Name));
kono
parents:
diff changeset
1501 Write_Line
kono
parents:
diff changeset
1502 (Get_Symbol (Decl) & Tab & F.all & Tab & Get_Line (Arr (R)));
kono
parents:
diff changeset
1503 Free (F);
kono
parents:
diff changeset
1504 end loop;
kono
parents:
diff changeset
1505
kono
parents:
diff changeset
1506 Free (Arr);
kono
parents:
diff changeset
1507 end loop;
kono
parents:
diff changeset
1508 end Print_Vi;
kono
parents:
diff changeset
1509
kono
parents:
diff changeset
1510 ----------------
kono
parents:
diff changeset
1511 -- Print_Xref --
kono
parents:
diff changeset
1512 ----------------
kono
parents:
diff changeset
1513
kono
parents:
diff changeset
1514 procedure Print_Xref (Full_Path_Name : Boolean) is
kono
parents:
diff changeset
1515 Decls : constant Declaration_Array_Access := Get_Declarations;
kono
parents:
diff changeset
1516 Decl : Declaration_Reference;
kono
parents:
diff changeset
1517
kono
parents:
diff changeset
1518 Margin : constant := 10;
kono
parents:
diff changeset
1519 -- Column where file names start
kono
parents:
diff changeset
1520
kono
parents:
diff changeset
1521 procedure New_Line80;
kono
parents:
diff changeset
1522 -- Go to start of new line
kono
parents:
diff changeset
1523
kono
parents:
diff changeset
1524 procedure Print80 (S : String);
kono
parents:
diff changeset
1525 -- Print the text, respecting the 80 columns rule
kono
parents:
diff changeset
1526
kono
parents:
diff changeset
1527 procedure Print_Ref (Line, Column : String);
kono
parents:
diff changeset
1528 -- The beginning of the output is aligned on a column multiple of 9
kono
parents:
diff changeset
1529
kono
parents:
diff changeset
1530 procedure Print_List
kono
parents:
diff changeset
1531 (Decl : Declaration_Reference;
kono
parents:
diff changeset
1532 Msg : String;
kono
parents:
diff changeset
1533 Get_Reads : Boolean := False;
kono
parents:
diff changeset
1534 Get_Writes : Boolean := False;
kono
parents:
diff changeset
1535 Get_Bodies : Boolean := False);
kono
parents:
diff changeset
1536 -- Print a list of references. If the list is not empty, Msg will
kono
parents:
diff changeset
1537 -- be printed prior to the list.
kono
parents:
diff changeset
1538
kono
parents:
diff changeset
1539 ----------------
kono
parents:
diff changeset
1540 -- New_Line80 --
kono
parents:
diff changeset
1541 ----------------
kono
parents:
diff changeset
1542
kono
parents:
diff changeset
1543 procedure New_Line80 is
kono
parents:
diff changeset
1544 begin
kono
parents:
diff changeset
1545 Write_Eol;
kono
parents:
diff changeset
1546 Write_Str (String'(1 .. Margin - 1 => ' '));
kono
parents:
diff changeset
1547 end New_Line80;
kono
parents:
diff changeset
1548
kono
parents:
diff changeset
1549 -------------
kono
parents:
diff changeset
1550 -- Print80 --
kono
parents:
diff changeset
1551 -------------
kono
parents:
diff changeset
1552
kono
parents:
diff changeset
1553 procedure Print80 (S : String) is
kono
parents:
diff changeset
1554 Align : Natural := Margin - (Integer (Column) mod Margin);
kono
parents:
diff changeset
1555
kono
parents:
diff changeset
1556 begin
kono
parents:
diff changeset
1557 if Align = Margin then
kono
parents:
diff changeset
1558 Align := 0;
kono
parents:
diff changeset
1559 end if;
kono
parents:
diff changeset
1560
kono
parents:
diff changeset
1561 Write_Str (String'(1 .. Align => ' ') & S);
kono
parents:
diff changeset
1562 end Print80;
kono
parents:
diff changeset
1563
kono
parents:
diff changeset
1564 ---------------
kono
parents:
diff changeset
1565 -- Print_Ref --
kono
parents:
diff changeset
1566 ---------------
kono
parents:
diff changeset
1567
kono
parents:
diff changeset
1568 procedure Print_Ref (Line, Column : String) is
kono
parents:
diff changeset
1569 Line_Align : constant Integer := 4 - Line'Length;
kono
parents:
diff changeset
1570
kono
parents:
diff changeset
1571 S : constant String := String'(1 .. Line_Align => ' ')
kono
parents:
diff changeset
1572 & Line & ':' & Column;
kono
parents:
diff changeset
1573
kono
parents:
diff changeset
1574 Align : Natural := Margin - (Integer (Output.Column) mod Margin);
kono
parents:
diff changeset
1575
kono
parents:
diff changeset
1576 begin
kono
parents:
diff changeset
1577 if Align = Margin then
kono
parents:
diff changeset
1578 Align := 0;
kono
parents:
diff changeset
1579 end if;
kono
parents:
diff changeset
1580
kono
parents:
diff changeset
1581 if Integer (Output.Column) + Align + S'Length > 79 then
kono
parents:
diff changeset
1582 New_Line80;
kono
parents:
diff changeset
1583 Align := 0;
kono
parents:
diff changeset
1584 end if;
kono
parents:
diff changeset
1585
kono
parents:
diff changeset
1586 Write_Str (String'(1 .. Align => ' ') & S);
kono
parents:
diff changeset
1587 end Print_Ref;
kono
parents:
diff changeset
1588
kono
parents:
diff changeset
1589 ----------------
kono
parents:
diff changeset
1590 -- Print_List --
kono
parents:
diff changeset
1591 ----------------
kono
parents:
diff changeset
1592
kono
parents:
diff changeset
1593 procedure Print_List
kono
parents:
diff changeset
1594 (Decl : Declaration_Reference;
kono
parents:
diff changeset
1595 Msg : String;
kono
parents:
diff changeset
1596 Get_Reads : Boolean := False;
kono
parents:
diff changeset
1597 Get_Writes : Boolean := False;
kono
parents:
diff changeset
1598 Get_Bodies : Boolean := False)
kono
parents:
diff changeset
1599 is
kono
parents:
diff changeset
1600 Arr : Reference_Array_Access :=
kono
parents:
diff changeset
1601 Get_References
kono
parents:
diff changeset
1602 (Decl,
kono
parents:
diff changeset
1603 Get_Writes => Get_Writes,
kono
parents:
diff changeset
1604 Get_Reads => Get_Reads,
kono
parents:
diff changeset
1605 Get_Bodies => Get_Bodies);
kono
parents:
diff changeset
1606 File : File_Reference := Empty_File;
kono
parents:
diff changeset
1607 F : String_Access;
kono
parents:
diff changeset
1608
kono
parents:
diff changeset
1609 begin
kono
parents:
diff changeset
1610 if Arr'Length /= 0 then
kono
parents:
diff changeset
1611 Write_Eol;
kono
parents:
diff changeset
1612 Write_Str (Msg);
kono
parents:
diff changeset
1613 end if;
kono
parents:
diff changeset
1614
kono
parents:
diff changeset
1615 for R in Arr'Range loop
kono
parents:
diff changeset
1616 if Get_File_Ref (Arr (R)) /= File then
kono
parents:
diff changeset
1617 if File /= Empty_File then
kono
parents:
diff changeset
1618 New_Line80;
kono
parents:
diff changeset
1619 end if;
kono
parents:
diff changeset
1620
kono
parents:
diff changeset
1621 File := Get_File_Ref (Arr (R));
kono
parents:
diff changeset
1622 F := Osint.To_Host_File_Spec
kono
parents:
diff changeset
1623 (Get_Gnatchop_File (Arr (R), Full_Path_Name));
kono
parents:
diff changeset
1624
kono
parents:
diff changeset
1625 if F = null then
kono
parents:
diff changeset
1626 Write_Str ("<unknown> ");
kono
parents:
diff changeset
1627 else
kono
parents:
diff changeset
1628 Write_Str (F.all & ' ');
kono
parents:
diff changeset
1629 Free (F);
kono
parents:
diff changeset
1630 end if;
kono
parents:
diff changeset
1631 end if;
kono
parents:
diff changeset
1632
kono
parents:
diff changeset
1633 Print_Ref (Get_Line (Arr (R)), Get_Column (Arr (R)));
kono
parents:
diff changeset
1634 end loop;
kono
parents:
diff changeset
1635
kono
parents:
diff changeset
1636 Free (Arr);
kono
parents:
diff changeset
1637 end Print_List;
kono
parents:
diff changeset
1638
kono
parents:
diff changeset
1639 F : String_Access;
kono
parents:
diff changeset
1640
kono
parents:
diff changeset
1641 -- Start of processing for Print_Xref
kono
parents:
diff changeset
1642
kono
parents:
diff changeset
1643 begin
kono
parents:
diff changeset
1644 for D in Decls'Range loop
kono
parents:
diff changeset
1645 Decl := Decls (D);
kono
parents:
diff changeset
1646
kono
parents:
diff changeset
1647 Write_Str (Get_Symbol (Decl));
kono
parents:
diff changeset
1648
kono
parents:
diff changeset
1649 -- Put the declaration type in column Type_Position, but if the
kono
parents:
diff changeset
1650 -- declaration name is too long, put at least one space between its
kono
parents:
diff changeset
1651 -- name and its type.
kono
parents:
diff changeset
1652
kono
parents:
diff changeset
1653 while Column < Type_Position - 1 loop
kono
parents:
diff changeset
1654 Write_Char (' ');
kono
parents:
diff changeset
1655 end loop;
kono
parents:
diff changeset
1656
kono
parents:
diff changeset
1657 Write_Char (' ');
kono
parents:
diff changeset
1658
kono
parents:
diff changeset
1659 Write_Line (Get_Full_Type (Decl));
kono
parents:
diff changeset
1660
kono
parents:
diff changeset
1661 Write_Parent_Info : declare
kono
parents:
diff changeset
1662 Parent : constant Declaration_Reference := Get_Parent (Decl);
kono
parents:
diff changeset
1663
kono
parents:
diff changeset
1664 begin
kono
parents:
diff changeset
1665 if Parent /= Empty_Declaration then
kono
parents:
diff changeset
1666 Write_Str (" Ptype: ");
kono
parents:
diff changeset
1667 F := Osint.To_Host_File_Spec (Get_Gnatchop_File (Parent));
kono
parents:
diff changeset
1668 Print80 (F.all);
kono
parents:
diff changeset
1669 Free (F);
kono
parents:
diff changeset
1670 Print_Ref (Get_Line (Parent), Get_Column (Parent));
kono
parents:
diff changeset
1671 Print80 (" " & Get_Symbol (Parent));
kono
parents:
diff changeset
1672 Write_Eol;
kono
parents:
diff changeset
1673 end if;
kono
parents:
diff changeset
1674 end Write_Parent_Info;
kono
parents:
diff changeset
1675
kono
parents:
diff changeset
1676 Write_Str (" Decl: ");
kono
parents:
diff changeset
1677 F := Osint.To_Host_File_Spec
kono
parents:
diff changeset
1678 (Get_Gnatchop_File (Decl, Full_Path_Name));
kono
parents:
diff changeset
1679
kono
parents:
diff changeset
1680 if F = null then
kono
parents:
diff changeset
1681 Print80 ("<unknown> ");
kono
parents:
diff changeset
1682 else
kono
parents:
diff changeset
1683 Print80 (F.all & ' ');
kono
parents:
diff changeset
1684 Free (F);
kono
parents:
diff changeset
1685 end if;
kono
parents:
diff changeset
1686
kono
parents:
diff changeset
1687 Print_Ref (Get_Line (Decl), Get_Column (Decl));
kono
parents:
diff changeset
1688
kono
parents:
diff changeset
1689 Print_List
kono
parents:
diff changeset
1690 (Decl, " Body: ", Get_Bodies => True);
kono
parents:
diff changeset
1691 Print_List
kono
parents:
diff changeset
1692 (Decl, " Modi: ", Get_Writes => True);
kono
parents:
diff changeset
1693 Print_List
kono
parents:
diff changeset
1694 (Decl, " Ref: ", Get_Reads => True);
kono
parents:
diff changeset
1695 Write_Eol;
kono
parents:
diff changeset
1696 end loop;
kono
parents:
diff changeset
1697 end Print_Xref;
kono
parents:
diff changeset
1698
kono
parents:
diff changeset
1699 ------------
kono
parents:
diff changeset
1700 -- Search --
kono
parents:
diff changeset
1701 ------------
kono
parents:
diff changeset
1702
kono
parents:
diff changeset
1703 procedure Search
kono
parents:
diff changeset
1704 (Pattern : Search_Pattern;
kono
parents:
diff changeset
1705 Local_Symbols : Boolean;
kono
parents:
diff changeset
1706 Wide_Search : Boolean;
kono
parents:
diff changeset
1707 Read_Only : Boolean;
kono
parents:
diff changeset
1708 Der_Info : Boolean;
kono
parents:
diff changeset
1709 Type_Tree : Boolean)
kono
parents:
diff changeset
1710 is
kono
parents:
diff changeset
1711 type String_Access is access String;
kono
parents:
diff changeset
1712 procedure Free is new Unchecked_Deallocation (String, String_Access);
kono
parents:
diff changeset
1713
kono
parents:
diff changeset
1714 ALIfile : ALI_File;
kono
parents:
diff changeset
1715 File_Ref : File_Reference;
kono
parents:
diff changeset
1716 Strip_Num : Natural := 0;
kono
parents:
diff changeset
1717 Ali_Name : String_Access;
kono
parents:
diff changeset
1718
kono
parents:
diff changeset
1719 begin
kono
parents:
diff changeset
1720 -- If we want all the .ali files, then find them
kono
parents:
diff changeset
1721
kono
parents:
diff changeset
1722 if Wide_Search then
kono
parents:
diff changeset
1723 Find_ALI_Files;
kono
parents:
diff changeset
1724 end if;
kono
parents:
diff changeset
1725
kono
parents:
diff changeset
1726 loop
kono
parents:
diff changeset
1727 -- Get the next unread ali file
kono
parents:
diff changeset
1728
kono
parents:
diff changeset
1729 File_Ref := Next_Unvisited_File;
kono
parents:
diff changeset
1730
kono
parents:
diff changeset
1731 exit when File_Ref = Empty_File;
kono
parents:
diff changeset
1732
kono
parents:
diff changeset
1733 -- Find the ALI file to use. Most of the time, it will be the unit
kono
parents:
diff changeset
1734 -- name, with a different extension. However, when dealing with
kono
parents:
diff changeset
1735 -- separates the ALI file is in fact the parent's ALI file (and this
kono
parents:
diff changeset
1736 -- is recursive, in case the parent itself is a separate).
kono
parents:
diff changeset
1737
kono
parents:
diff changeset
1738 Strip_Num := 0;
kono
parents:
diff changeset
1739 loop
kono
parents:
diff changeset
1740 Free (Ali_Name);
kono
parents:
diff changeset
1741 Ali_Name := new String'
kono
parents:
diff changeset
1742 (Get_File (File_Ref, With_Dir => True, Strip => Strip_Num));
kono
parents:
diff changeset
1743
kono
parents:
diff changeset
1744 -- Stripped too many things...
kono
parents:
diff changeset
1745
kono
parents:
diff changeset
1746 if Ali_Name.all = "" then
kono
parents:
diff changeset
1747 if Get_Emit_Warning (File_Ref) then
kono
parents:
diff changeset
1748 Set_Standard_Error;
kono
parents:
diff changeset
1749 Write_Line
kono
parents:
diff changeset
1750 ("warning : file " & Get_File (File_Ref, With_Dir => True)
kono
parents:
diff changeset
1751 & " not found");
kono
parents:
diff changeset
1752 Set_Standard_Output;
kono
parents:
diff changeset
1753 end if;
kono
parents:
diff changeset
1754 Free (Ali_Name);
kono
parents:
diff changeset
1755 exit;
kono
parents:
diff changeset
1756
kono
parents:
diff changeset
1757 -- If not found, try the parent's ALI file (this is needed for
kono
parents:
diff changeset
1758 -- separate units and subprograms).
kono
parents:
diff changeset
1759
kono
parents:
diff changeset
1760 -- Reset the cached directory first, in case the separate's
kono
parents:
diff changeset
1761 -- ALI file is not in the same directory.
kono
parents:
diff changeset
1762
kono
parents:
diff changeset
1763 elsif not File_Exists (Ali_Name.all) then
kono
parents:
diff changeset
1764 Strip_Num := Strip_Num + 1;
kono
parents:
diff changeset
1765 Reset_Directory (File_Ref);
kono
parents:
diff changeset
1766
kono
parents:
diff changeset
1767 -- Else we finally found it
kono
parents:
diff changeset
1768
kono
parents:
diff changeset
1769 else
kono
parents:
diff changeset
1770 exit;
kono
parents:
diff changeset
1771 end if;
kono
parents:
diff changeset
1772 end loop;
kono
parents:
diff changeset
1773
kono
parents:
diff changeset
1774 -- If we had to get the parent's ALI, insert it in the list as usual.
kono
parents:
diff changeset
1775 -- This is to avoid parsing it twice in case it has already been
kono
parents:
diff changeset
1776 -- parsed.
kono
parents:
diff changeset
1777
kono
parents:
diff changeset
1778 if Ali_Name /= null and then Strip_Num /= 0 then
kono
parents:
diff changeset
1779 File_Ref := Add_To_Xref_File
kono
parents:
diff changeset
1780 (File_Name => Ali_Name.all,
kono
parents:
diff changeset
1781 Visited => False);
kono
parents:
diff changeset
1782
kono
parents:
diff changeset
1783 -- Now that we have a file name, parse it to find any reference to
kono
parents:
diff changeset
1784 -- the entity.
kono
parents:
diff changeset
1785
kono
parents:
diff changeset
1786 elsif Ali_Name /= null
kono
parents:
diff changeset
1787 and then (Read_Only or else Is_Writable_File (Ali_Name.all))
kono
parents:
diff changeset
1788 then
kono
parents:
diff changeset
1789 begin
kono
parents:
diff changeset
1790 Open (Ali_Name.all, ALIfile);
kono
parents:
diff changeset
1791
kono
parents:
diff changeset
1792 -- The cross-reference section in the ALI file may be followed
kono
parents:
diff changeset
1793 -- by other sections, which can be identified by the starting
kono
parents:
diff changeset
1794 -- character of every line, which should neither be 'X' nor a
kono
parents:
diff changeset
1795 -- figure in '1' .. '9'.
kono
parents:
diff changeset
1796
kono
parents:
diff changeset
1797 -- The loop tests below also take into account the end-of-file
kono
parents:
diff changeset
1798 -- possibility.
kono
parents:
diff changeset
1799
kono
parents:
diff changeset
1800 while ALIfile.Buffer (ALIfile.Current_Line) = 'X' loop
kono
parents:
diff changeset
1801 Parse_X_Filename (ALIfile);
kono
parents:
diff changeset
1802
kono
parents:
diff changeset
1803 while ALIfile.Buffer (ALIfile.Current_Line) in '1' .. '9'
kono
parents:
diff changeset
1804 loop
kono
parents:
diff changeset
1805 Parse_Identifier_Info
kono
parents:
diff changeset
1806 (Pattern, ALIfile, Local_Symbols, Der_Info, Type_Tree,
kono
parents:
diff changeset
1807 Wide_Search, Labels_As_Ref => True);
kono
parents:
diff changeset
1808 end loop;
kono
parents:
diff changeset
1809 end loop;
kono
parents:
diff changeset
1810
kono
parents:
diff changeset
1811 exception
kono
parents:
diff changeset
1812 when No_Xref_Information =>
kono
parents:
diff changeset
1813 if Get_Emit_Warning (File_Ref) then
kono
parents:
diff changeset
1814 Set_Standard_Error;
kono
parents:
diff changeset
1815 Write_Line
kono
parents:
diff changeset
1816 ("warning : No cross-referencing information in "
kono
parents:
diff changeset
1817 & Ali_Name.all);
kono
parents:
diff changeset
1818 Set_Standard_Output;
kono
parents:
diff changeset
1819 end if;
kono
parents:
diff changeset
1820 end;
kono
parents:
diff changeset
1821 end if;
kono
parents:
diff changeset
1822 end loop;
kono
parents:
diff changeset
1823
kono
parents:
diff changeset
1824 Free (Ali_Name);
kono
parents:
diff changeset
1825 end Search;
kono
parents:
diff changeset
1826
kono
parents:
diff changeset
1827 -----------------
kono
parents:
diff changeset
1828 -- Search_Xref --
kono
parents:
diff changeset
1829 -----------------
kono
parents:
diff changeset
1830
kono
parents:
diff changeset
1831 procedure Search_Xref
kono
parents:
diff changeset
1832 (Local_Symbols : Boolean;
kono
parents:
diff changeset
1833 Read_Only : Boolean;
kono
parents:
diff changeset
1834 Der_Info : Boolean)
kono
parents:
diff changeset
1835 is
kono
parents:
diff changeset
1836 ALIfile : ALI_File;
kono
parents:
diff changeset
1837 File_Ref : File_Reference;
kono
parents:
diff changeset
1838 Null_Pattern : Search_Pattern;
kono
parents:
diff changeset
1839
kono
parents:
diff changeset
1840 begin
kono
parents:
diff changeset
1841 Null_Pattern.Initialized := False;
kono
parents:
diff changeset
1842
kono
parents:
diff changeset
1843 loop
kono
parents:
diff changeset
1844 -- Find the next unvisited file
kono
parents:
diff changeset
1845
kono
parents:
diff changeset
1846 File_Ref := Next_Unvisited_File;
kono
parents:
diff changeset
1847 exit when File_Ref = Empty_File;
kono
parents:
diff changeset
1848
kono
parents:
diff changeset
1849 -- Search the object directories for the .ali file
kono
parents:
diff changeset
1850
kono
parents:
diff changeset
1851 declare
kono
parents:
diff changeset
1852 F : constant String := Get_File (File_Ref, With_Dir => True);
kono
parents:
diff changeset
1853
kono
parents:
diff changeset
1854 begin
kono
parents:
diff changeset
1855 if Read_Only or else Is_Writable_File (F) then
kono
parents:
diff changeset
1856 Open (F, ALIfile, True);
kono
parents:
diff changeset
1857
kono
parents:
diff changeset
1858 -- The cross-reference section in the ALI file may be followed
kono
parents:
diff changeset
1859 -- by other sections, which can be identified by the starting
kono
parents:
diff changeset
1860 -- character of every line, which should neither be 'X' nor a
kono
parents:
diff changeset
1861 -- figure in '1' .. '9'.
kono
parents:
diff changeset
1862
kono
parents:
diff changeset
1863 -- The loop tests below also take into account the end-of-file
kono
parents:
diff changeset
1864 -- possibility.
kono
parents:
diff changeset
1865
kono
parents:
diff changeset
1866 while ALIfile.Buffer (ALIfile.Current_Line) = 'X' loop
kono
parents:
diff changeset
1867 Parse_X_Filename (ALIfile);
kono
parents:
diff changeset
1868
kono
parents:
diff changeset
1869 while ALIfile.Buffer (ALIfile.Current_Line) in '1' .. '9'
kono
parents:
diff changeset
1870 loop
kono
parents:
diff changeset
1871 Parse_Identifier_Info
kono
parents:
diff changeset
1872 (Null_Pattern, ALIfile, Local_Symbols, Der_Info,
kono
parents:
diff changeset
1873 Labels_As_Ref => False);
kono
parents:
diff changeset
1874 end loop;
kono
parents:
diff changeset
1875 end loop;
kono
parents:
diff changeset
1876 end if;
kono
parents:
diff changeset
1877
kono
parents:
diff changeset
1878 exception
kono
parents:
diff changeset
1879 when No_Xref_Information => null;
kono
parents:
diff changeset
1880 end;
kono
parents:
diff changeset
1881 end loop;
kono
parents:
diff changeset
1882 end Search_Xref;
kono
parents:
diff changeset
1883
kono
parents:
diff changeset
1884 end Xref_Lib;