Source file f_change.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
module Triple = Diffast_core.Triple
module Change_base = Diffast_core.Change_base
module Info = Diffast_core.Info
module Edit = Diffast_core.Edit
module F_label = Fortran_base.F_label
module UID = Diffast_misc.UID
module F (L : F_label.T) = struct
module I = Info
module E = Edit
include Change_base
module CB = F(L)
let getlab = L.getlab
let is_named nd = L.is_named (getlab nd)
let is_case_construct nd = L.is_case_construct (getlab nd)
let is_do_construct nd = L.is_do_construct (getlab nd)
let is_forall_construct nd = L.is_forall_construct (getlab nd)
let is_if_construct nd = L.is_if_construct (getlab nd)
let is_where_construct nd = L.is_where_construct (getlab nd)
let is_derived_type_def nd = L.is_derived_type_def (getlab nd)
let is_interface_block nd = L.is_interface_block (getlab nd)
let is_primary nd = L.is_primary (getlab nd)
let is_expr nd = L.is_expr (getlab nd)
let is_stmt nd = L.is_stmt (getlab nd)
let is_if_stmt nd = L.is_if_stmt (getlab nd)
let is_arithmetic_if_stmt nd = L.is_arithmetic_if_stmt (getlab nd)
let is_if_then_stmt nd = L.is_if_then_stmt (getlab nd)
let is_else_if_stmt nd = L.is_else_if_stmt (getlab nd)
let is_else_stmt nd = L.is_else_stmt (getlab nd)
let is_pp_directive nd = L.is_pp_directive (getlab nd)
let is_pp_define nd = L.is_pp_define (getlab nd)
let is_pp_include nd = L.is_pp_include (getlab nd)
let is_ocl_directive nd = L.is_ocl_directive (getlab nd)
let is_program_unit nd = L.is_program_unit (getlab nd)
let is_block nd = L.is_block (getlab nd)
let is_sect_subscr_list nd = L.is_section_subscript_list (getlab nd)
let is_ambiguous nd = L.is_ambiguous (getlab nd)
let is_if nd =
is_if_stmt nd ||
is_arithmetic_if_stmt nd ||
is_if_then_stmt nd ||
is_else_if_stmt nd
let is_if_cond nd =
try
let pnd = nd#initial_parent in
is_if pnd && is_expr nd
with
_ -> false
let is_then_branch nd =
try
let pnd = nd#initial_parent in
is_if_then_stmt pnd && is_block nd
with
_ -> false
let is_else_if_branch nd =
try
let pnd = nd#initial_parent in
is_else_if_stmt pnd && is_block nd
with
_ -> false
let is_else_branch nd =
try
let pnd = nd#initial_parent in
is_else_stmt pnd && is_block nd
with
_ -> false
let get_unit tree nd =
try
let u = tree#get_nearest_containing_unit nd in
u#data#label
with
Not_found -> ""
let ids_to_str ids =
if ids = [] then "" else sprintf "{%s}" (String.concat "," ids)
let subtree_to_str tree nd =
sprintf "[%s]" (tree#subtree_to_simple_string nd#gindex)
let get_desc1 _ tree nd =
let ids = tree#get_ident_use_list nd#gindex in
let =
if true then
subtree_to_str tree nd
else
""
in
nd#data#label^(ids_to_str ids)^extra2
let get_desc2 tree1 tree2 nd1 nd2 =
let ids1 = tree1#get_ident_use_list nd1#gindex in
let ids2 = tree2#get_ident_use_list nd2#gindex in
sprintf "%s%s%s -> %s%s%s"
nd1#data#label (ids_to_str ids1) (subtree_to_str tree1 nd1)
nd2#data#label (ids_to_str ids2) (subtree_to_str tree2 nd2)
class c options tree1 tree2 uidmapping edits get_unit get_desc1 get_desc2 = object(self)
inherit CB.c options tree1 tree2 uidmapping edits get_unit get_desc1 get_desc2
method! make_changes_list () =
let mkt_del = self#mkt_deleted ~category:Triple.ghost in
let mkt_ins = self#mkt_inserted ~category:Triple.ghost in
let mkt_mod = self#mkt_modified ~category:Triple.ghost in
let mkt_chgto = self#mkt_changed_to ~category:Triple.ghost in
let mkt_ren = self#mkt_renamed ~category:Triple.ghost in
let mkt_mov = self#mkt_moved_to ~category:Triple.ghost in
let mkt_odrchg = self#mkt_order_changed ~category:Triple.ghost in
[
"case-construct removed", Smedium, (self#make_delete_st is_case_construct), mkt_del;
"case-construct added", Smedium, (self#make_insert_st is_case_construct), mkt_ins;
"case-construct modified", Smedium, (self#aggregate_changes is_case_construct), mkt_mod;
"do-construct removed", Smedium, (self#make_delete_st is_do_construct), mkt_del;
"do-construct added", Smedium, (self#make_insert_st is_do_construct), mkt_ins;
"do-construct modified", Smedium, (self#aggregate_changes is_do_construct), mkt_mod;
"forall-construct removed", Smedium, (self#make_delete_st is_forall_construct), mkt_del;
"forall-construct added", Smedium, (self#make_insert_st is_forall_construct), mkt_ins;
"forall-construct modified", Smedium, (self#aggregate_changes is_forall_construct), mkt_mod;
"if-construct removed", Smedium, (self#make_delete_st is_if_construct), mkt_del;
"if-construct added", Smedium, (self#make_insert_st is_if_construct), mkt_ins;
"if-construct modified", Smedium, (self#aggregate_changes is_if_construct), mkt_mod;
"where-construct removed", Smedium, (self#make_delete_st is_where_construct), mkt_del;
"where-construct added", Smedium, (self#make_insert_st is_where_construct), mkt_ins;
"where-construct modified", Smedium, (self#aggregate_changes is_where_construct), mkt_mod;
"derived-type-def removed", Smedium, (self#make_delete_st is_derived_type_def), mkt_del;
"derived-type-def added", Smedium, (self#make_insert_st is_derived_type_def), mkt_ins;
"derived-type-def modified", Smedium, (self#aggregate_changes is_derived_type_def), mkt_mod;
"interface-block removed", Smedium, (self#make_delete_st is_interface_block), mkt_del;
"interface-block added", Smedium, (self#make_insert_st is_interface_block), mkt_ins;
"interface-block modified", Smedium, (self#aggregate_changes is_interface_block), mkt_mod;
"if-condition modified", Smedium, (self#aggregate_changes is_if_cond), mkt_mod;
"then-branch deleted", Smedium, (self#make_delete is_then_branch), mkt_del;
"then-branch inserted", Smedium, (self#make_insert is_then_branch), mkt_ins;
"then-branch removed", Smedium, (self#make_delete_st is_then_branch), mkt_del;
"then-branch added", Smedium, (self#make_insert_st is_then_branch), mkt_ins;
"else-if-branch deleted", Smedium, (self#make_delete is_else_if_branch), mkt_del;
"else-if-branch inserted", Smedium, (self#make_insert is_else_if_branch), mkt_ins;
"else-if-branch removed", Smedium, (self#make_delete_st is_else_if_branch), mkt_del;
"else-if-branch added", Smedium, (self#make_insert_st is_else_if_branch), mkt_ins;
"else-branch deleted", Smedium, (self#make_delete is_else_branch), mkt_del;
"else-branch inserted", Smedium, (self#make_insert is_else_branch), mkt_ins;
"else-branch removed", Smedium, (self#make_delete_st is_else_branch), mkt_del;
"else-branch added", Smedium, (self#make_insert_st is_else_branch), mkt_ins;
"define-directive removed", Smedium, (self#make_delete_st is_pp_define), mkt_del;
"define-directive added", Smedium, (self#make_insert_st is_pp_define), mkt_ins;
"define-directive modified", Smedium, (self#aggregate_changes is_pp_define), mkt_mod;
"include-directive removed", Smedium, (self#make_delete_st is_pp_include), mkt_del;
"include-directive added", Smedium, (self#make_insert_st is_pp_include), mkt_ins;
"include-directive modified", Smedium, (self#aggregate_changes is_pp_include), mkt_mod;
"pp-directive removed", Smedium, (self#make_delete_st is_pp_directive), mkt_del;
"pp-directive added", Smedium, (self#make_insert_st is_pp_directive), mkt_ins;
"pp-directive modified", Smedium, (self#aggregate_changes is_pp_directive), mkt_mod;
"ocl-directive removed", Smedium, (self#make_delete_st is_ocl_directive), mkt_del;
"ocl-directive added", Smedium, (self#make_insert_st is_ocl_directive), mkt_ins;
"ocl-directive modified", Smedium, (self#aggregate_changes is_ocl_directive), mkt_mod;
"section-subscript-list modified", Smedium, (self#aggregate_changes is_sect_subscr_list), mkt_mod;
"ambiguous entity modified", Smedium, (self#aggregate_changes is_ambiguous), mkt_mod;
"(removed)", Slow, (self#make_delete_st (fun _ -> true)), mkt_del;
"(added)", Slow, (self#make_insert_st (fun _ -> true)), mkt_ins;
"(deleted)", Slow, (self#make_delete (fun _ -> true)), mkt_del;
"(inserted)", Slow, (self#make_insert (fun _ -> true)), mkt_ins;
"(moved)", Slow, (self#make_move (fun _ -> true)), mkt_mov;
"(changed)", Slow, (self#make_changed_to (fun _ -> true)), mkt_chgto;
"(renamed)", Slow, (self#make_renaming is_named), mkt_ren;
"(order changed)", Slow, (self#make_order_change (fun _ -> true)), mkt_odrchg;
]
end
let options tree1 tree2 uidmapping edits =
let chg = new c options tree1 tree2 uidmapping edits get_unit get_desc1 get_desc2 in
let res = chg#extract in
chg#recover_edits;
res
end