Commit | Line | Data |
---|---|---|
34e49164 C |
1 | (* Copyright (C) 2002-2008 Yoann Padioleau |
2 | * | |
3 | * This program is free software; you can redistribute it and/or | |
4 | * modify it under the terms of the GNU General Public License (GPL) | |
5 | * version 2 as published by the Free Software Foundation. | |
6 | * | |
7 | * This program is distributed in the hope that it will be useful, | |
8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
10 | * file license.txt for more details. | |
11 | *) | |
12 | open Common | |
13 | ||
14 | (*****************************************************************************) | |
15 | (* Abstract line *) | |
16 | (*****************************************************************************) | |
17 | ||
18 | (* todo?: al_expr doit enlever les infos de type ? et doit remettre en | |
19 | * emptyAnnot ? | |
20 | *) | |
21 | ||
22 | (* drop all info information *) | |
23 | ||
24 | let strip_info_visitor _ = | |
25 | { Visitor_c.default_visitor_c_s with | |
26 | Visitor_c.kinfo_s = | |
27 | (* traversal should be deterministic... *) | |
28 | (let ctr = ref 0 in | |
29 | (function (k,_) -> | |
30 | function i -> ctr := !ctr + 1; Ast_c.al_info !ctr i)); | |
31 | ||
32 | Visitor_c.kexpr_s = (fun (k,_) e -> | |
33 | let (e', ty),ii' = k e in | |
34 | (e', Ast_c.noType()(*ref !ty*)), ii' (* keep type - jll *) | |
35 | ); | |
36 | ||
37 | (* | |
38 | Visitor_c.ktype_s = (fun (k,_) ft -> | |
39 | let ft' = k ft in | |
40 | match Ast_c.unwrap_typeC ft' with | |
41 | | Ast_c.TypeName (s,_typ) -> | |
42 | Ast_c.TypeName (s, Ast_c.noTypedefDef()) +> Ast_c.rewrap_typeC ft' | |
43 | | _ -> ft' | |
44 | ||
45 | ); | |
46 | *) | |
47 | ||
48 | } | |
49 | ||
50 | let al_expr x = Visitor_c.vk_expr_s (strip_info_visitor()) x | |
51 | let al_statement x = Visitor_c.vk_statement_s (strip_info_visitor()) x | |
52 | let al_type x = Visitor_c.vk_type_s (strip_info_visitor()) x | |
53 | let al_param x = Visitor_c.vk_param_s (strip_info_visitor()) x | |
54 | let al_params x = Visitor_c.vk_params_s (strip_info_visitor()) x | |
55 | let al_arguments x = Visitor_c.vk_arguments_s (strip_info_visitor()) x | |
56 | ||
57 | let al_program x = List.map (Visitor_c.vk_toplevel_s (strip_info_visitor())) x | |
58 | ||
59 | let semi_strip_info_visitor = (* keep position information *) | |
60 | { Visitor_c.default_visitor_c_s with | |
61 | Visitor_c.kinfo_s = (fun (k,_) i -> Ast_c.semi_al_info i); | |
62 | ||
63 | Visitor_c.kexpr_s = (fun (k,_) e -> | |
64 | let (e', ty),ii' = k e in | |
65 | (e', Ast_c.noType()(*ref !ty*)), ii' (* keep type - jll *) | |
66 | ); | |
67 | ||
68 | } | |
69 | ||
70 | let semi_al_expr = Visitor_c.vk_expr_s semi_strip_info_visitor | |
71 | let semi_al_statement = Visitor_c.vk_statement_s semi_strip_info_visitor | |
72 | let semi_al_type = Visitor_c.vk_type_s semi_strip_info_visitor | |
73 | let semi_al_param = Visitor_c.vk_param_s semi_strip_info_visitor | |
74 | let semi_al_params = Visitor_c.vk_params_s semi_strip_info_visitor | |
75 | let semi_al_arguments = Visitor_c.vk_arguments_s semi_strip_info_visitor | |
76 | ||
77 | let semi_al_program = List.map (Visitor_c.vk_toplevel_s semi_strip_info_visitor) | |
78 | ||
79 | (*****************************************************************************) | |
80 | (* Extract infos *) | |
81 | (*****************************************************************************) | |
82 | ||
83 | let extract_info_visitor recursor x = | |
84 | let globals = ref [] in | |
85 | let visitor = | |
86 | { | |
87 | Visitor_c.default_visitor_c with | |
88 | Visitor_c.kinfo = (fun (k, _) i -> Common.push2 i globals) | |
89 | } in | |
90 | begin | |
91 | recursor visitor x; | |
92 | !globals | |
93 | end | |
94 | ||
95 | let ii_of_decl = extract_info_visitor Visitor_c.vk_decl | |
96 | let ii_of_node = extract_info_visitor Visitor_c.vk_node | |
97 | let ii_of_expr = extract_info_visitor Visitor_c.vk_expr | |
98 | let ii_of_stmt = extract_info_visitor Visitor_c.vk_statement | |
99 | let ii_of_args = extract_info_visitor Visitor_c.vk_args_splitted | |
100 | let ii_of_type = extract_info_visitor Visitor_c.vk_type | |
101 | let ii_of_ini = extract_info_visitor Visitor_c.vk_ini | |
102 | let ii_of_param = extract_info_visitor Visitor_c.vk_param | |
103 | let ii_of_params = extract_info_visitor Visitor_c.vk_params_splitted | |
104 | let ii_of_struct_fields = extract_info_visitor Visitor_c.vk_struct_fields | |
105 | let ii_of_struct_field = extract_info_visitor Visitor_c.vk_struct_field | |
106 | let ii_of_cst = extract_info_visitor Visitor_c.vk_cst | |
107 | let ii_of_define_params = | |
108 | extract_info_visitor Visitor_c.vk_define_params_splitted | |
109 | ||
110 | let max_min_ii_by_pos xs = | |
111 | match xs with | |
112 | | [] -> failwith "empty list, max_min_ii_by_pos" | |
113 | | [x] -> (x, x) | |
114 | | x::xs -> | |
115 | let pos_leq p1 p2 = (Ast_c.compare_pos p1 p2) = (-1) in | |
116 | xs +> List.fold_left (fun (maxii,minii) e -> | |
117 | let maxii' = if pos_leq maxii e then e else maxii in | |
118 | let minii' = if pos_leq e minii then e else minii in | |
119 | maxii', minii' | |
120 | ) (x,x) | |
121 | ||
122 | let info_to_fixpos ii = | |
123 | match Ast_c.pinfo_of_info ii with | |
124 | Ast_c.OriginTok pi -> Ast_cocci.Real pi.Common.charpos | |
125 | | Ast_c.ExpandedTok (_,(pi,offset)) -> | |
126 | Ast_cocci.Virt (pi.Common.charpos,offset) | |
127 | | Ast_c.FakeTok (_,(pi,offset)) -> | |
128 | Ast_cocci.Virt (pi.Common.charpos,offset) | |
129 | | Ast_c.AbstractLineTok pi -> failwith "unexpected abstract" | |
130 | ||
131 | let max_min_by_pos xs = | |
132 | let (i1, i2) = max_min_ii_by_pos xs in | |
133 | (info_to_fixpos i1, info_to_fixpos i2) | |
134 | ||
135 | let lin_col_by_pos xs = | |
136 | (* put min before max; no idea why they are backwards above *) | |
137 | let (i2, i1) = max_min_ii_by_pos xs in | |
138 | let posf x = Ast_c.col_of_info x in | |
139 | let mposf x = Ast_c.col_of_info x + String.length (Ast_c.str_of_info x) in | |
140 | (Ast_c.file_of_info i1, | |
141 | (Ast_c.line_of_info i1, posf i1), (Ast_c.line_of_info i2, mposf i2)) | |
142 | ||
143 |