nitlanguage
/
nit.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
nitserial: do not generate constructors for abstract classes
[nit.git]
/
src
/
frontend
/
serialization_phase.nit
diff --git
a/src/frontend/serialization_phase.nit
b/src/frontend/serialization_phase.nit
index
25574e7
..
2b68eea
100644
(file)
--- a/
src/frontend/serialization_phase.nit
+++ b/
src/frontend/serialization_phase.nit
@@
-24,7
+24,10
@@
import modelize
private import annotation
redef class ToolContext
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)
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])
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
# 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]
@@
-122,13
+128,13
@@
private class SerializationPhasePreModel
code.add "end"
code.add "end"
- var npropdef = toolcontext.parse_propdef(code.join("\n")).as(AConcreteInitPropdef)
+ var npropdef = toolcontext.parse_propdef(code.join("\n")).as(AMethPropdef)
npropdefs.add npropdef
nclassdef.parent.as(AModule).inits_to_retype.add npropdef
end
# Added to the abstract serialization service
npropdefs.add npropdef
nclassdef.parent.as(AModule).inits_to_retype.add npropdef
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]
@@
-153,7
+159,9
@@
private class SerializationPhasePreModel
for nclassdef in nclassdefs do
var name = nclassdef.n_id.text
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
@@
-186,17
+194,10
@@
end
private class PreciseTypeVisitor
super Visitor
private class PreciseTypeVisitor
super Visitor
- var npropdef: AConcreteInitPropdef
+ var npropdef: AMethPropdef
var mclassdef: MClassDef
var toolcontext: ToolContext
var mclassdef: MClassDef
var toolcontext: ToolContext
- init(npropdef: AConcreteInitPropdef, 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
redef fun visit(n) do n.accept_precise_type_visitor(self)
end
@@
-223,8
+224,7
@@
end
redef class AAttrPropdef
private fun name: String
do
redef class AAttrPropdef
private fun name: String
do
- if n_id == null then return n_id2.text
- return n_id.text
+ return n_id2.text
end
end
end
end
@@
-256,7
+256,7
@@
redef class AModule
return null
end
return null
end
- private var inits_to_retype = new Array[AConcreteInitPropdef]
+ private var inits_to_retype = new Array[AMethPropdef]
end
redef class AStdClassdef
end
redef class AStdClassdef