@@ -13,6 +13,7 @@ class Update(EditOperation):
1313class Insert (EditOperation ):
1414 node : Tuple [str , Any ]
1515 position : int
16+ insert_id : int # This is necessary to keep track of nodes (TODO: Better solution?)
1617
1718@dataclass
1819class Move (EditOperation ):
@@ -21,4 +22,70 @@ class Move(EditOperation):
2122
2223@dataclass
2324class Delete (EditOperation ):
24- pass
25+ pass
26+
27+
28+ # Serialization --------------------------------
29+
30+ import json
31+
32+
33+ def _serialize_new_node (new_node_index , node ):
34+
35+ if node .node_id not in new_node_index :
36+ new_node_index [node .node_id ] = len (new_node_index )
37+
38+ return "N%d" % new_node_index [node .node_id ]
39+
40+ def _serialize_ast_node (node ):
41+ position = node .position
42+ node_text = node .type
43+
44+ if node .text : node_text += ":" + node .text
45+
46+ return "(%s, line %d:%d - %d:%d)" % (node_text , position [0 ][0 ], position [0 ][1 ], position [1 ][0 ], position [1 ][1 ])
47+
48+
49+ def _serialize_node (new_node_index , node ):
50+
51+ if hasattr (node , 'node_id' ):
52+ return _serialize_new_node (new_node_index , node )
53+
54+ return _serialize_ast_node (node )
55+
56+
57+ def serialize_script (edit_script ):
58+
59+ sedit_script = []
60+ new_node_index = {}
61+
62+ for operation in edit_script :
63+
64+ operation_name = operation .__class__ .__name__
65+ target_node_str = _serialize_node (new_node_index , operation .target_node )
66+
67+ if operation_name == "Update" :
68+ sedit_script .append ("%s(%s, %s)" % (operation_name , target_node_str , operation .value ))
69+
70+ elif operation_name == "Insert" :
71+
72+ new_node = operation .node
73+
74+ if new_node [1 ] is None :
75+ new_node_index [operation .insert_id ] = len (new_node_index )
76+ new_node_str = "(%s, %s)" % (new_node [0 ], "N%d" % new_node_index [operation .insert_id ])
77+ else : # Leaf node
78+ new_node_str = "%s:%s" % new_node
79+
80+ sedit_script .append ("%s(%s, %s, %d)" % (operation_name , target_node_str , new_node_str , operation .position ))
81+
82+ elif operation_name == "Move" :
83+
84+ new_node_str = _serialize_node (new_node_index , operation .node )
85+
86+ sedit_script .append ("%s(%s, %s, %d)" % (operation_name , target_node_str , new_node_str , operation .position ))
87+
88+ elif operation_name == "Delete" :
89+ sedit_script .append ("%s(%s)" % (operation_name , target_node_str ))
90+
91+ return json .dumps (sedit_script , indent = 2 )
0 commit comments