various phases: more robust for keep-going
[nit.git] / src / frontend / serialization_phase.nit
index 28b9127..0d7e4ec 100644 (file)
@@ -24,7 +24,10 @@ import modelize
 private import annotation
 
 redef class ToolContext
+       # Generate serialization and deserialization methods on `auto_serializable` annotated classes.
        var serialization_phase_pre_model: Phase = new SerializationPhasePreModel(self, null)
+
+       # The second phase of the serialization
        var serialization_phase_post_model: Phase = new SerializationPhasePostModel(self,
                [modelize_class_phase, serialization_phase_pre_model])
 
@@ -47,7 +50,7 @@ private class SerializationPhasePreModel
                # Add `super Serializable`
                var sc = toolcontext.parse_superclass("Serializable")
                sc.location = nat.location
-               nclassdef.n_superclasses.add sc
+               nclassdef.n_propdefs.add sc
 
                generate_serialization_method(nclassdef)
 
@@ -73,7 +76,7 @@ private class SerializationPhasePreModel
                end
        end
 
-       private fun generate_serialization_method(nclassdef: AClassdef)
+       fun generate_serialization_method(nclassdef: AClassdef)
        do
                var npropdefs = nclassdef.n_propdefs
 
@@ -94,8 +97,11 @@ private class SerializationPhasePreModel
        end
 
        # Add a constructor to the automated nclassdef
-       private fun generate_deserialization_init(nclassdef: AClassdef)
+       fun generate_deserialization_init(nclassdef: AStdClassdef)
        do
+               # Do not generate constructors for abstract classes
+               if nclassdef.n_classkind isa AAbstractClasskind then return
+
                var npropdefs = nclassdef.n_propdefs
 
                var code = new Array[String]
@@ -128,7 +134,7 @@ private class SerializationPhasePreModel
        end
 
        # Added to the abstract serialization service
-       private fun generate_deserialization_method(nmodule: AModule, nclassdefs: Array[AStdClassdef])
+       fun generate_deserialization_method(nmodule: AModule, nclassdefs: Array[AStdClassdef])
        do
                var code = new Array[String]
 
@@ -153,7 +159,9 @@ private class SerializationPhasePreModel
 
                for nclassdef in nclassdefs do
                        var name = nclassdef.n_id.text
-                       if nclassdef.n_formaldefs.is_empty then
+                       if nclassdef.n_formaldefs.is_empty and
+                               not nclassdef.n_classkind isa AAbstractClasskind then
+
                                code.add "              if name == \"{name}\" then return new {name}.from_deserializer(self)"
                        end
                end
@@ -176,7 +184,9 @@ private class SerializationPhasePostModel
        redef fun process_nmodule(nmodule)
        do
                for npropdef in nmodule.inits_to_retype do
-                       var v = new PreciseTypeVisitor(npropdef, npropdef.mpropdef.mclassdef, toolcontext)
+                       var mpropdef = npropdef.mpropdef
+                       if mpropdef == null then continue # skip error
+                       var v = new PreciseTypeVisitor(npropdef, mpropdef.mclassdef, toolcontext)
                        npropdef.accept_precise_type_visitor v
                end
        end