Make the concatenate() routine in the element.py installed by pitree --install-elemen...
authorNick Downing <nick@ndcode.org>
Wed, 6 Dec 2023 01:37:26 +0000 (12:37 +1100)
committerNick Downing <nick@ndcode.org>
Wed, 6 Dec 2023 04:19:40 +0000 (15:19 +1100)
ndcode/pitree/pitree.t
ndcode/pitree/skel/element.py

index c54f23c..c4d7e07 100644 (file)
@@ -255,27 +255,11 @@ def generate_class_or_field_def(self, context):
 '''.format(
           indent_save2,
           context.field_name,
-          i.children[2].children[0].generate_expression(i.children[0]),
-          indent_save2,
-          indent_save2,
-          context.field_name,
-          indent_save2,
-          indent_save2,
-          i.children[0].generate_serialize(
-            context,
-            'self.{0:s}'.format(context.field_name)
+          (
+            i.children[2].children[0].generate_expression(i.children[0])
+          if len(i.children[2].children) else
+            i.children[0].null_value()
           ),
-          indent_save2,
-          indent_save2
-        )
-      if len(i.children[2].children) else
-        '''{0:s}  _element.set(
-{1:s}    '{2:s}',
-{3:s}    json.dumps(
-{4:s}      {5:s}
-{6:s}    )
-{7:s}  )
-'''.format(
           indent_save2,
           indent_save2,
           context.field_name,
@@ -312,16 +296,14 @@ def generate_class_or_field_def(self, context):
           context.field_name,
           i.children[0].generate_deserialize(
             context,
-            'json.loads(_element.get(\'{0:s}\'{1:s}))'.format(
+            'json.loads(_element.get(\'{0:s}\', \'{1:s}\'))'.format(
               context.field_name,
               (
-                ', \'{0:s}\''.format(
-                  json.dumps(
-                    i.children[2].children[0].generate_expression_json(i.children[0])
-                  ).replace('\\', '\\\\').replace('\'', '\\\'')
-                )
+                json.dumps(
+                  i.children[2].children[0].generate_expression_json(i.children[0])
+                ).replace('\\', '\\\\').replace('\'', '\\\'')
               if len(i.children[2].children) else
-                ''
+                i.children[0].null_value_json()
               )
             )
           )
@@ -706,6 +688,39 @@ def null_value(self):
   return '\'\''
 del null_value
 
+# note: unlike generate_expression_json() this can't return \ or '
+@method(AST.Type)
+def null_value_json(self):
+  raise NotImplementedError
+@method(AST.TypeBool)
+def null_value_json(self):
+  return 'false'
+@method(AST.TypeDict)
+def null_value_json(self):
+  return '{}'
+@method(AST.TypeInt)
+def null_value_json(self):
+  return '0'
+@method(AST.TypeFloat)
+def null_value_json(self):
+  return '0.0'
+@method(AST.TypeList)
+def null_value_json(self):
+  return '[]'
+@method(AST.TypeMPFR)
+def null_value_json(self):
+  return '"0"'
+@method(AST.TypeRef)
+def null_value_json(self):
+  return '-1'
+@method(AST.TypeSet)
+def null_value_json(self):
+  return '[]'
+@method(AST.TypeStr)
+def null_value_json(self):
+  return '""'
+del null_value_json
+
 @method(AST.Identifier)
 def get_text(self):
   return self.text[0]
index f40c9cf..5edb218 100644 (file)
@@ -132,12 +132,10 @@ def to_text(root):
   )
 
 def concatenate(children, factory = Element, *args, **kwargs):
-  root = factory(*args, **kwargs)
+  text1 = ['']
+  children1 = []
   for child in children:
-    assert len(root.text) == len(root.children) + 1
-    assert len(child.text) == len(child.children) + 1
-    root.text[-1] += child.text[0]
-    root.children.extend(child.children)
-    root.text.extend(child.text[1:])
-  assert len(root.text) == len(root.children) + 1
-  return root
+    text1[-1] += child.text[0]
+    children1.extend(child.children)
+    text1.extend(child.text[1:])
+  return factory(text = text1, children = children1, *args, **kwargs)