@@ -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
# 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
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)
generate_serialization_method(nclassdef)
@@ -73,7+76,7 @@ private class SerializationPhasePreModel
end
end
end
end
- private fun generate_serialization_method(nclassdef: AClassdef)
+ fun generate_serialization_method(nclassdef: AClassdef)
do
var npropdefs = nclassdef.n_propdefs
do
var npropdefs = nclassdef.n_propdefs
@@ -94,8+97,11 @@ private class SerializationPhasePreModel
end
# Add a constructor to the automated nclassdef
end
# Add a constructor to the automated nclassdef
- private fun generate_deserialization_init(nclassdef: AClassdef)
+ fun generate_deserialization_init(nclassdef: AStdClassdef)
do
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]
var npropdefs = nclassdef.n_propdefs
var code = new Array[String]
@@ -128,7+134,7 @@ private class SerializationPhasePreModel
end
# Added to the abstract serialization service
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]
do
var code = new Array[String]
@@ -147,13+153,15 @@ private class SerializationPhasePreModel
code.add " redef fun deserialize_class(name)"
code.add " do"
else
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
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
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
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
npropdef.accept_precise_type_visitor v
end
end
@@ -190,13+200,6 @@ private class PreciseTypeVisitor