Skip to content

Commit e35a575

Browse files
authored
Merge pull request #16 from codinuum/develop
Develop
2 parents 85fd442 + bbc1be6 commit e35a575

File tree

15 files changed

+442
-138
lines changed

15 files changed

+442
-138
lines changed

src/ast/analyzing/common/comparison.ml

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,12 +1460,33 @@ class ['node_t, 'tree_t] c
14601460
let ancsim_old = self#get_ancestors_similarity nd1old nd2old in
14611461
let ancsim_new = self#get_ancestors_similarity nd1new nd2new in
14621462

1463+
let ancsim_old, ancsim_new, prefer_sim =
1464+
if nd1old == nd1new then
1465+
if nd2old#initial_parent == nd2new && nd2new#initial_nchildren = 1 then
1466+
ancsim_new, ancsim_new, true
1467+
else if nd2old == nd2new#initial_parent && nd2old#initial_nchildren = 1 then
1468+
ancsim_old, ancsim_old, true
1469+
else
1470+
ancsim_old, ancsim_new, false
1471+
else if nd2old == nd2new then
1472+
if nd1old#initial_parent == nd1new && nd1new#initial_nchildren = 1 then
1473+
ancsim_new, ancsim_new, true
1474+
else if nd1old == nd1new#initial_parent && nd1old#initial_nchildren = 1 then
1475+
ancsim_old, ancsim_old, true
1476+
else
1477+
ancsim_old, ancsim_new, false
1478+
else
1479+
ancsim_old, ancsim_new, false
1480+
in
1481+
14631482
DEBUG_MSG "ancestors similarity: %f --> %f" ancsim_old ancsim_new;
14641483

14651484
let anc_sim_ratio = (Xlist.min [ancsim_old; ancsim_new]) /. (Xlist.max [ancsim_old; ancsim_new]) in
14661485

14671486
DEBUG_MSG "ancestors similarity ratio: %f" anc_sim_ratio;
14681487

1488+
DEBUG_MSG "prefer_sim: %B" prefer_sim;
1489+
14691490

14701491
let subtree_sim_old = self#get_similarity_score nd1old nd2old in
14711492
let subtree_sim_new = self#get_similarity_score nd1new nd2new in
@@ -1566,7 +1587,8 @@ class ['node_t, 'tree_t] c
15661587
if
15671588
(ancsim_old = 1.0 && subtree_sim_old = 1.0 && ancsim_new < 1.0 && subtree_sim_new < 1.0) ||
15681589
(anc_sim_almost_same && subtree_sim_old = 1.0 && subtree_sim_new < 1.0 && chk_for_old() ||
1569-
is_plausible nd1old nd2old && not (is_plausible nd1new nd2new))
1590+
is_plausible nd1old nd2old && not (is_plausible nd1new nd2new)) ||
1591+
prefer_sim && subtree_sim_old > subtree_sim_new
15701592
(* || (subtree_sim_old > subtree_sim_new && subtree_sim_ratio < subtree_similarity_ratio_lower_thresh) *)
15711593
then begin
15721594
let b, ncd, ncsim =
@@ -1578,7 +1600,8 @@ class ['node_t, 'tree_t] c
15781600
else if
15791601
(ancsim_new = 1.0 && subtree_sim_new = 1.0 && ancsim_old < 1.0 && subtree_sim_old < 1.0) ||
15801602
(anc_sim_almost_same && subtree_sim_new = 1.0 && subtree_sim_old < 1.0 && chk_for_new() ||
1581-
is_plausible nd1new nd2new && not (is_plausible nd1old nd2old))
1603+
is_plausible nd1new nd2new && not (is_plausible nd1old nd2old)) ||
1604+
prefer_sim && subtree_sim_new > subtree_sim_old
15821605
(* || (subtree_sim_new > subtree_sim_old && subtree_sim_ratio < subtree_similarity_ratio_lower_thresh) *)
15831606
then begin
15841607
let b, ncd, ncsim =

src/ast/analyzing/common/delta.ml

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ module Edit = struct
350350
edit_seq
351351
(*(edit_seq : ('data node_t, 'tree tree_t) Edit_base.seq_base)*)
352352
=
353+
let is_indivisible_move = edits_copy#is_indivisible_move in
353354
let edit_list =
354355
(*if options#minimize_delta_flag then
355356
Xlist.filter_map (op_of_editop_filt ~more uidmapping edit_seq tree1) edit_seq#content
@@ -11090,8 +11091,14 @@ module Edit = struct
1109011091
in
1109111092

1109211093
if irreversible_flag then begin
11094+
let mctl_opt =
11095+
if is_indivisible_move mid then
11096+
Some Mfull
11097+
else
11098+
None
11099+
in
1109311100
let fmt =
11094-
irrf (Fmt.Irr.mkmov mid
11101+
irrf (Fmt.Irr.mkmov mid mctl_opt
1109511102
path1from excepted_paths1from path1to excepted_paths1to
1109611103
key_opt1 adj_opt1 depth_opt1 shift_opt1)
1109711104
in
@@ -11328,8 +11335,15 @@ module Edit = struct
1132811335

1132911336
self#reg_parent_key2 excepted_paths2to mid_key;
1133011337

11338+
let mctl_opt =
11339+
if is_indivisible_move mid then
11340+
Some Mfull
11341+
else
11342+
None
11343+
in
11344+
1133111345
let fmt =
11332-
revf (Fmt.Rev.mkmov mid
11346+
revf (Fmt.Rev.mkmov mid mctl_opt
1133311347
path1from excepted_paths1from path1to excepted_paths1to
1133411348
key_opt1 adj_opt1 depth_opt1 shift_opt1
1133511349
path2from excepted_paths2from path2to excepted_paths2to
@@ -11707,25 +11721,25 @@ module Edit = struct
1170711721
with
1170811722
Not_found -> fmt
1170911723
end
11710-
| Irr (Irr.Mov(mid, path1, paths1, path2, paths2, x0, x1, x2, x3)) -> begin
11724+
| Irr (Irr.Mov(mid, mctl_opt, path1, paths1, path2, paths2, x0, x1, x2, x3)) -> begin
1171111725
modify lift_tbl1 edit_parent_tbl1 path1 paths1;
1171211726
try
1171311727
let c = get_conv conv_tbl1 (K_mid mid) in
11714-
Irr (Irr.Mov(mid, path1, paths1,
11728+
Irr (Irr.Mov(mid, mctl_opt, path1, paths1,
1171511729
conv_path path2 c, conv_paths paths2 c,
1171611730
x0, x1, x2, x3))
1171711731
with
1171811732
Not_found -> fmt
1171911733
end
11720-
| Rev (Rev.Mov(mid, path1, paths1, path2, paths2, x0, x1, x2, x3,
11734+
| Rev (Rev.Mov(mid, mctl_opt, path1, paths1, path2, paths2, x0, x1, x2, x3,
1172111735
path1', paths1', path2', paths2', x4, x5, x6, x7))
1172211736
-> begin
1172311737
modify lift_tbl1 edit_parent_tbl1 path1 paths1;
1172411738
modify lift_tbl2 edit_parent_tbl2 path1' paths1';
1172511739
try
1172611740
let c = get_conv conv_tbl1 (K_mid mid) in
1172711741
let c' = get_conv conv_tbl2 (K_mid mid) in
11728-
Rev (Rev.Mov(mid, path1, paths1,
11742+
Rev (Rev.Mov(mid, mctl_opt, path1, paths1,
1172911743
conv_path path2 c, conv_paths paths2 c,
1173011744
x0, x1, x2, x3, path1', paths1',
1173111745
conv_path path2' c', conv_paths paths2' c',

src/ast/analyzing/common/delta_base.ml

Lines changed: 61 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,19 @@ let shift1_attr = mktag "shift"
101101
let shift2_attr = mktag "shift_"
102102

103103
(* for partial application of move *)
104+
type move_control = Mfull | MdeleteOnly | MinsertOnly
105+
106+
let move_control_to_string = function
107+
| Mfull -> "F"
108+
| MdeleteOnly -> "D"
109+
| MinsertOnly -> "I"
110+
111+
let move_control_of_string = function
112+
| "F" -> Mfull
113+
| "D" -> MdeleteOnly
114+
| "I" -> MinsertOnly
115+
| _ -> Mfull
116+
104117
let move_control_attr = mktag "mctl"
105118

106119
let is_file_edit_tag n =
@@ -711,14 +724,25 @@ let make_change_file_elem path ch =
711724

712725

713726
(* for move *)
714-
let output_elem_mov ch mid
727+
let output_elem_mov ch mid mctl_opt
715728
path_from paths_from path_to paths_to key_opt adj_opt depth_opt shift_opt
716729
=
730+
let _al =
731+
match mctl_opt with
732+
| Some mctl ->
733+
[ mid_attr, MID.to_raw mid;
734+
move_control_attr, move_control_to_string mctl;
735+
path_from_attr,path_from#to_string;
736+
path_to_attr, path_to#to_string;
737+
]
738+
| None ->
739+
[ mid_attr, MID.to_raw mid;
740+
path_from_attr,path_from#to_string;
741+
path_to_attr, path_to#to_string;
742+
]
743+
in
717744
let al =
718-
[ mid_attr, MID.to_raw mid;
719-
path_from_attr,path_from#to_string;
720-
path_to_attr, path_to#to_string;
721-
] @
745+
_al @
722746
(key_opt_to_attr parent_attr key_opt) @
723747
(int_opt_to_attr adj_attr adj_opt) @
724748
(int_opt_to_attr depth_attr depth_opt) @
@@ -727,17 +751,30 @@ let output_elem_mov ch mid
727751
fprintf ch "<%s %s%s%s/>" mov_tag
728752
(attrs_to_string al) (mkbdry_from paths_from) (mkbdry_to paths_to)
729753

730-
let output_elem_bi_mov ch mid
754+
let output_elem_bi_mov ch mid mctl_opt
731755
path1from paths1from path1to paths1to key_opt1 adj_opt1 depth_opt1 shift_opt1
732756
path2from paths2from path2to paths2to key_opt2 adj_opt2 depth_opt2 shift_opt2
733757
=
758+
let _al =
759+
match mctl_opt with
760+
| Some mctl ->
761+
[ mid_attr, MID.to_raw mid;
762+
move_control_attr, move_control_to_string mctl;
763+
path1from_attr,path1from#to_string;
764+
path1to_attr, path1to#to_string;
765+
path2from_attr,path2from#to_string;
766+
path2to_attr, path2to#to_string;
767+
]
768+
| None ->
769+
[ mid_attr, MID.to_raw mid;
770+
path1from_attr,path1from#to_string;
771+
path1to_attr, path1to#to_string;
772+
path2from_attr,path2from#to_string;
773+
path2to_attr, path2to#to_string;
774+
]
775+
in
734776
let al =
735-
[ mid_attr, MID.to_raw mid;
736-
path1from_attr,path1from#to_string;
737-
path1to_attr, path1to#to_string;
738-
path2from_attr,path2from#to_string;
739-
path2to_attr, path2to#to_string;
740-
] @
777+
_al @
741778
(key_opt_to_attr parent1_attr key_opt1) @
742779
(int_opt_to_attr adj1_attr adj_opt1) @
743780
(int_opt_to_attr depth1_attr depth_opt1) @
@@ -1000,6 +1037,7 @@ module Fmt = struct
10001037
* content_dumper
10011038

10021039
| Mov of MID.t
1040+
* move_control option
10031041
* path_c * boundary * path_c * boundary
10041042
* subtree_key option * int option * int option * int option
10051043

@@ -1015,9 +1053,9 @@ module Fmt = struct
10151053
let mkins stid path paths key_opt adj_opt depth_opt shift_opt dumper =
10161054
Ins(stid, path, paths, key_opt, adj_opt, depth_opt, shift_opt, dumper)
10171055

1018-
let mkmov mid path_from paths_from path_to paths_to
1056+
let mkmov mid mctl_opt path_from paths_from path_to paths_to
10191057
key_opt adj_opt depth_opt shift_opt =
1020-
Mov(mid, path_from, paths_from, path_to, paths_to,
1058+
Mov(mid, mctl_opt, path_from, paths_from, path_to, paths_to,
10211059
key_opt, adj_opt, depth_opt, shift_opt)
10221060

10231061
let mkchg path paths dumper =
@@ -1043,9 +1081,9 @@ module Fmt = struct
10431081
dumper ch;
10441082
output_ed_elem_ins ch
10451083

1046-
| Mov(mid, path_from, paths_from, path_to, paths_to,
1084+
| Mov(mid, mctl_opt, path_from, paths_from, path_to, paths_to,
10471085
key_opt, adj_opt, depth_opt, shift_opt) ->
1048-
output_elem_mov ch mid
1086+
output_elem_mov ch mid mctl_opt
10491087
path_from paths_from path_to paths_to
10501088
key_opt adj_opt depth_opt shift_opt
10511089

@@ -1080,6 +1118,7 @@ module Fmt = struct
10801118
* path_c * boundary
10811119

10821120
| Mov of MID.t
1121+
* move_control option
10831122
* path_c * boundary * path_c * boundary
10841123
* subtree_key option * int option * int option * int option
10851124
* path_c * boundary * path_c * boundary
@@ -1104,11 +1143,12 @@ module Fmt = struct
11041143
path', paths')
11051144

11061145
let mkmov mid
1146+
mctl_opt
11071147
path_from paths_from path_to paths_to
11081148
key_opt adj_opt depth_opt shift_opt
11091149
path_from' paths_from' path_to' paths_to'
11101150
key_opt' adj_opt' depth_opt' shift_opt' =
1111-
Mov(mid, path_from, paths_from, path_to, paths_to,
1151+
Mov(mid, mctl_opt, path_from, paths_from, path_to, paths_to,
11121152
key_opt, adj_opt, depth_opt, shift_opt,
11131153
path_from', paths_from', path_to', paths_to',
11141154
key_opt', adj_opt', depth_opt', shift_opt')
@@ -1142,12 +1182,12 @@ module Fmt = struct
11421182
dumper ch;
11431183
output_ed_elem_ins ch
11441184

1145-
| Mov(mid, path_from, paths_from, path_to, paths_to,
1185+
| Mov(mid, mctl_opt, path_from, paths_from, path_to, paths_to,
11461186
key_opt, adj_opt, depth_opt, shift_opt,
11471187
path_from', paths_from', path_to', paths_to',
11481188
key_opt', adj_opt', depth_opt', shift_opt')
11491189
->
1150-
output_elem_bi_mov ch mid
1190+
output_elem_bi_mov ch mid mctl_opt
11511191
path_from paths_from path_to paths_to
11521192
key_opt adj_opt depth_opt shift_opt
11531193
path_from' paths_from' path_to' paths_to'
@@ -1180,12 +1220,12 @@ module Fmt = struct
11801220
Del(stid, path', paths',
11811221
path, paths, key_opt, adj_opt, depth_opt, shift_opt, dumper)
11821222

1183-
| Mov(mid, path_from, paths_from, path_to, paths_to,
1223+
| Mov(mid, mctl_opt, path_from, paths_from, path_to, paths_to,
11841224
key_opt, adj_opt, depth_opt, shift_opt,
11851225
path_from', paths_from', path_to', paths_to',
11861226
key_opt', adj_opt', depth_opt', shift_opt')
11871227
->
1188-
Mov(mid, path_from', paths_from', path_to', paths_to',
1228+
Mov(mid, mctl_opt, path_from', paths_from', path_to', paths_to',
11891229
key_opt', adj_opt', depth_opt', shift_opt',
11901230
path_from, paths_from, path_to, paths_to,
11911231
key_opt, adj_opt, depth_opt, shift_opt)

src/ast/analyzing/common/delta_common.ml

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -435,19 +435,6 @@ let postorder_node_sort rt nds = (* when gindexes not set *)
435435
in
436436
List.fast_sort cmp nds
437437

438-
type move_control = Mfull | MdeleteOnly | MinsertOnly
439-
440-
let move_control_to_string = function
441-
| Mfull -> "F"
442-
| MdeleteOnly -> "D"
443-
| MinsertOnly -> "I"
444-
445-
let move_control_of_string = function
446-
| "F" -> Mfull
447-
| "D" -> MdeleteOnly
448-
| "I" -> MinsertOnly
449-
| _ -> Mfull
450-
451438
let get_adjusted_path
452439
?(get_group=fun _ -> raise Not_found)
453440
?(group_heads=[])

src/ast/analyzing/common/delta_format.ml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,15 +327,17 @@ module IrreversibleFormat = struct
327327
DEBUG_MSG "_ppath=%s elem=%s nd=%a %s %s" (Path.to_string _ppath) (Path.Elem.to_string elem)
328328
nps nd nd#data#label (Loc.to_string nd#data#src_loc);
329329
DEBUG_MSG "mid=%a" MID.ps mid;
330+
let _rp' = ref Path.root in
330331
match Hashtbl.find mov_tbl mid with
331332
| Dmove(mctl, mid, path_from, paths_from, path_to, (*[]*)_, _, _, _, _) as mov when begin
332333
DEBUG_MSG "checking %s" (edit_to_string mov);
333334
path_to#parent_path <> path_from#path &&
334-
List.for_all (fun p -> p#upstream = 0 && p#key_opt = None) paths_from
335+
let _ = _rp' := Path.remove_head path_from#path _ppath in
336+
List.for_all (fun p -> p#upstream = 0 && p#key_opt = None && !_rp' <> p#parent_path) paths_from
335337
end -> begin
336338
DEBUG_MSG "found: %s" (edit_to_string mov);
337339
let _path', depth' =
338-
let rp' = Path.append (Path.remove_head path_from#path _ppath) elem in
340+
let rp' = Path.append !_rp' elem in
339341
Path.concat path_to#path rp', Path.length rp'
340342
in
341343
let path' = new path_c _path' in
@@ -364,14 +366,16 @@ module IrreversibleFormat = struct
364366
DEBUG_MSG "_ppath=%s elem=%s nd=%a %s %s" (Path.to_string _ppath) (Path.Elem.to_string elem)
365367
nps nd nd#data#label (Loc.to_string nd#data#src_loc);
366368
DEBUG_MSG "mid=%a" MID.ps mid;
369+
let _rp' = ref Path.root in
367370
match Hashtbl.find mov_tbl mid with
368371
| Dmove(mctl, mid, path_from, paths_from, path_to, (*[]*)_, _, _, _, _) as mov when begin
369372
path_to#parent_path <> path_from#path &&
373+
let _ = _rp' := Path.remove_head path_from#path _ppath in
370374
List.for_all (fun p -> p#upstream = 0 && p#key_opt = None) paths_from
371375
end -> begin
372376
DEBUG_MSG "found: %s" (edit_to_string mov);
373377
let _path', depth' =
374-
let rp' = Path.append (Path.remove_head path_from#path _ppath) elem in
378+
let rp' = Path.append !_rp' elem in
375379
Path.concat path_to#path rp', Path.length rp'
376380
in
377381
let path' = new path_c _path' in

0 commit comments

Comments
 (0)