X-Git-Url: http://nitlanguage.org diff --git a/src/frontend/serialization_phase.nit b/src/frontend/serialization_phase.nit index 28b9127..0d7e4ec 100644 --- a/src/frontend/serialization_phase.nit +++ b/src/frontend/serialization_phase.nit @@ -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