Merge: Advice on useless repeated types
[nit.git] / src / frontend / serialization_phase.nit
index 78c8c89..90924f2 100644 (file)
@@ -43,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)
 
@@ -97,13 +97,14 @@ private class SerializationPhasePreModel
        end
 
        # Add a constructor to the automated nclassdef
-       fun generate_deserialization_init(nclassdef: AClassdef)
+       fun generate_deserialization_init(nclassdef: AStdClassdef)
        do
                var npropdefs = nclassdef.n_propdefs
 
                var code = new Array[String]
-               code.add "init from_deserializer(v: Deserializer)"
+               code.add "redef init from_deserializer(v: Deserializer)"
                code.add "do"
+               code.add "      super"
                code.add "      v.notify_of_creation self"
 
                for attribute in npropdefs do if attribute isa AAttrPropdef then
@@ -119,7 +120,7 @@ private class SerializationPhasePreModel
 
                        code.add ""
                        code.add "\tvar {name} = v.deserialize_attribute(\"{name}\")"
-                       code.add "\tassert {name} isa {type_name} else print \"Unsupported type for attribute '{name}', got '\{{name}.class_name\}' (ex {type_name})\""
+                       code.add "\tassert {name} isa {type_name} else print \"Unsupported type for `\{class_name\}::{name}`, got '\{{name}.class_name\}'; expected {type_name}\""
                        code.add "\tself.{name} = {name}"
                end
 
@@ -150,13 +151,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
@@ -179,7 +182,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