X-Git-Url: http://nitlanguage.org?ds=sidebyside diff --git a/src/frontend/serialization_phase.nit b/src/frontend/serialization_phase.nit index 7f0427d..976d532 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]) @@ -40,14 +43,14 @@ private class SerializationPhasePreModel # Skip if we are not interested if nat.n_atid.n_id.text != "auto_serializable" then return if not nclassdef isa AStdClassdef then - toolcontext.error(nclassdef.location, "Syntax error: only a concrete class can be automatically serialized.") + toolcontext.error(nclassdef.location, "Syntax Error: only a concrete class can be automatically serialized.") return end # 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] @@ -147,13 +153,15 @@ private class SerializationPhasePreModel code.add " redef fun deserialize_class(name)" code.add " do" else - toolcontext.error(deserializer_npropdef.location, "Annotation error: you cannot define Deserializer::deserialize_class in a module where you use \"auto_serializable\".") + toolcontext.error(deserializer_npropdef.location, "Error: you cannot define `Deserializer::deserialize_class` in a module where you use `auto_serializable`.") return end 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 @@ -190,13 +200,6 @@ private class PreciseTypeVisitor var mclassdef: MClassDef var toolcontext: ToolContext - init(npropdef: AMethPropdef, mclassdef: MClassDef, toolcontext: ToolContext) - do - self.npropdef = npropdef - self.mclassdef = mclassdef - self.toolcontext = toolcontext - end - redef fun visit(n) do n.accept_precise_type_visitor(self) end