1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 # Make model entities Serializable.
17 # To avoid cycles, every reference from a MEntity to another is replaced by a
20 # How subobjects are retrieved using the MEntityRef is the responsability of the
21 # client. Json objects can be returned as this or inflated with concrete objet
22 # rather than the refs.
24 # TODO consider serialization module?
27 import model
::model_collect
29 import json
::serialization_write
32 # A reference to another mentity.
39 redef fun core_serialize_to
(v
) do
40 v
.serialize_attribute
("full_name", mentity
.full_name
)
47 redef fun core_serialize_to
(v
) do
48 v
.serialize_attribute
("name", name
)
49 v
.serialize_attribute
("class_name", class_name
)
50 v
.serialize_attribute
("full_name", full_name
)
51 v
.serialize_attribute
("mdoc", mdoc_or_fallback
)
52 v
.serialize_attribute
("visibility", visibility
.to_s
)
53 v
.serialize_attribute
("modifiers", collect_modifiers
)
54 v
.serialize_attribute
("location", location
)
57 # Serialize the full version of `self` to JSON
59 # See: `FullJsonSerializer`
60 fun serialize_to_full_json
(mainmodule
: MModule, plain
, pretty
: nullable Bool): String do
61 var stream
= new StringWriter
62 var serializer
= new FullJsonSerializer(stream
, mainmodule
)
63 serializer
.plain_json
= plain
or else false
64 serializer
.pretty_json
= pretty
or else false
65 serializer
.serialize
self
70 # Return the full json representation of `self` with references.
72 # By default, every reference to another MEntity is replaced by a pointer
73 # to the MEntity::json_id.
74 # Use this method to obtain a full object with mentities instead of pointers.
75 fun to_full_json
(mainmodule
: MModule): String do
76 return serialize_to_full_json
(mainmodule
, plain
=true)
79 # Same as `to_full_json` but with pretty json.
80 fun to_pretty_full_json
(mainmodule
: MModule): String do
81 return serialize_to_full_json
(mainmodule
, plain
=true, pretty
=true)
84 # Sort mentities by name
85 private fun sort_entities
(mentities
: Collection[MEntity]): Array[MEntity] do
86 var sorter
= new MEntityNameSorter
87 var sorted
= mentities
.to_a
96 redef fun core_serialize_to
(v
) do
98 v
.serialize_attribute
("content", content
.join
("\n"))
99 v
.serialize_attribute
("location", location
)
103 redef class nitc
::Location
106 redef fun core_serialize_to
(v
) do
107 v
.serialize_attribute
("column_end", column_end
)
108 v
.serialize_attribute
("column_start", column_start
)
109 v
.serialize_attribute
("line_end", line_end
)
110 v
.serialize_attribute
("line_start", line_start
)
113 v
.serialize_attribute
("file", file
.filename
)
119 redef fun core_serialize_to
(v
) do
121 if v
isa FullJsonSerializer then
122 v
.serialize_attribute
("root", to_mentity_ref
(root
))
123 v
.serialize_attribute
("mgroups", to_mentity_refs
(sort_entities
(mgroups
)))
125 if ini
!= null then v
.serialize_attribute
("ini", ini
.to_map
)
131 redef fun core_serialize_to
(v
) do
133 if v
isa FullJsonSerializer then
134 v
.serialize_attribute
("is_root", is_root
)
135 v
.serialize_attribute
("mpackage", to_mentity_ref
(mpackage
))
136 v
.serialize_attribute
("default_mmodule", to_mentity_ref
(default_mmodule
))
137 v
.serialize_attribute
("parent", to_mentity_ref
(parent
))
138 v
.serialize_attribute
("mmodules", to_mentity_refs
(sort_entities
(mmodules
)))
139 v
.serialize_attribute
("mgroups", to_mentity_refs
(sort_entities
(in_nesting
.direct_smallers
)))
145 redef fun core_serialize_to
(v
) do
147 if v
isa FullJsonSerializer then
148 var view
= new ModelView(model
, v
.mainmodule
)
149 v
.serialize_attribute
("mpackage", to_mentity_ref
(mpackage
))
150 v
.serialize_attribute
("mgroup", to_mentity_ref
(mgroup
))
151 v
.serialize_attribute
("intro_mclasses", to_mentity_refs
(sort_entities
(intro_mclasses
)))
152 v
.serialize_attribute
("mclassdefs", to_mentity_refs
(sort_entities
(mclassdefs
)))
153 v
.serialize_attribute
("intro_mclassdefs", to_mentity_refs
(sort_entities
(collect_intro_mclassdefs
(view
))))
154 v
.serialize_attribute
("redef_mclassdefs", to_mentity_refs
(sort_entities
(collect_redef_mclassdefs
(view
))))
155 v
.serialize_attribute
("imports", to_mentity_refs
(in_importation
.direct_greaters
))
161 redef fun core_serialize_to
(v
) do
163 v
.serialize_attribute
("mparameters", mparameters
)
164 if v
isa FullJsonSerializer then
165 var filter
= new ModelFilter(private_visibility
)
166 var view
= new ModelView(model
, v
.mainmodule
, filter
)
167 v
.serialize_attribute
("intro", to_mentity_ref
(intro
))
168 v
.serialize_attribute
("intro_mmodule", to_mentity_ref
(intro_mmodule
))
169 v
.serialize_attribute
("mpackage", to_mentity_ref
(intro_mmodule
.mpackage
))
170 v
.serialize_attribute
("mclassdefs", to_mentity_refs
(mclassdefs
))
171 v
.serialize_attribute
("all_mproperties", to_mentity_refs
(sort_entities
(collect_accessible_mproperties
(view
))))
172 v
.serialize_attribute
("intro_mproperties", to_mentity_refs
(sort_entities
(collect_intro_mproperties
(view
))))
173 v
.serialize_attribute
("redef_mproperties", to_mentity_refs
(sort_entities
(collect_redef_mproperties
(view
))))
174 v
.serialize_attribute
("parents", to_mentity_refs
(sort_entities
(collect_parents
(view
))))
179 redef class MClassDef
180 redef fun core_serialize_to
(v
) do
182 v
.serialize_attribute
("is_intro", is_intro
)
183 v
.serialize_attribute
("mparameters", mclass
.mparameters
)
184 if v
isa FullJsonSerializer then
185 var filter
= new ModelFilter(private_visibility
)
186 var view
= new ModelView(model
, v
.mainmodule
, filter
)
187 v
.serialize_attribute
("mmodule", to_mentity_ref
(mmodule
))
188 v
.serialize_attribute
("mclass", to_mentity_ref
(mclass
))
189 v
.serialize_attribute
("mpropdefs", to_mentity_refs
(sort_entities
(mpropdefs
)))
190 v
.serialize_attribute
("intro_mproperties", to_mentity_refs
(sort_entities
(intro_mproperties
)))
191 v
.serialize_attribute
("intro", to_mentity_ref
(mclass
.intro
))
192 v
.serialize_attribute
("mpackage", to_mentity_ref
(mmodule
.mpackage
))
193 v
.serialize_attribute
("intro_mpropdefs", to_mentity_refs
(sort_entities
(collect_intro_mpropdefs
(view
))))
194 v
.serialize_attribute
("redef_mpropdefs", to_mentity_refs
(sort_entities
(collect_redef_mpropdefs
(view
))))
199 redef class MProperty
200 redef fun core_serialize_to
(v
) do
202 if v
isa FullJsonSerializer then
203 v
.serialize_attribute
("intro", to_mentity_ref
(intro
))
204 v
.serialize_attribute
("intro_mclassdef", to_mentity_ref
(intro_mclassdef
))
205 v
.serialize_attribute
("mpropdefs", to_mentity_refs
(sort_entities
(mpropdefs
)))
206 v
.serialize_attribute
("intro_mclass", to_mentity_ref
(intro_mclassdef
.mclass
))
207 v
.serialize_attribute
("mpackage", to_mentity_ref
(intro_mclassdef
.mmodule
.mpackage
))
213 redef fun core_serialize_to
(v
) do
215 v
.serialize_attribute
("is_init", is_init
)
216 v
.serialize_attribute
("msignature", intro
.msignature
)
220 redef class MAttribute
221 redef fun core_serialize_to
(v
) do
223 v
.serialize_attribute
("static_mtype", to_mentity_ref
(intro
.static_mtype
))
227 redef class MVirtualTypeProp
228 redef fun core_serialize_to
(v
) do
230 v
.serialize_attribute
("mvirtualtype", to_mentity_ref
(mvirtualtype
))
231 v
.serialize_attribute
("bound", to_mentity_ref
(intro
.bound
))
236 redef fun core_serialize_to
(v
) do
238 v
.serialize_attribute
("is_intro", is_intro
)
239 if v
isa FullJsonSerializer then
240 v
.serialize_attribute
("mclassdef", to_mentity_ref
(mclassdef
))
241 v
.serialize_attribute
("mproperty", to_mentity_ref
(mproperty
))
242 v
.serialize_attribute
("intro", to_mentity_ref
(mproperty
.intro
))
243 v
.serialize_attribute
("intro_mclassdef", to_mentity_ref
(mproperty
.intro
.mclassdef
))
244 v
.serialize_attribute
("mmodule", to_mentity_ref
(mclassdef
.mmodule
))
245 v
.serialize_attribute
("mgroup", to_mentity_ref
(mclassdef
.mmodule
.mgroup
))
246 v
.serialize_attribute
("mpackage", to_mentity_ref
(mclassdef
.mmodule
.mpackage
))
251 redef class MMethodDef
252 redef fun core_serialize_to
(v
) do
254 v
.serialize_attribute
("msignature", msignature
)
258 redef class MAttributeDef
259 redef fun core_serialize_to
(v
) do
261 v
.serialize_attribute
("static_mtype", to_mentity_ref
(static_mtype
))
265 redef class MVirtualTypeDef
266 redef fun core_serialize_to
(v
) do
268 v
.serialize_attribute
("bound", to_mentity_ref
(bound
))
269 v
.serialize_attribute
("is_fixed", is_fixed
)
273 redef class MSignature
274 redef fun core_serialize_to
(v
) do
275 v
.serialize_attribute
("arity", arity
)
276 v
.serialize_attribute
("mparams", mparameters
)
277 v
.serialize_attribute
("return_mtype", to_mentity_ref
(return_mtype
))
278 v
.serialize_attribute
("vararg_rank", vararg_rank
)
282 redef class MParameterType
283 redef fun core_serialize_to
(v
) do
284 v
.serialize_attribute
("name", name
)
285 v
.serialize_attribute
("rank", rank
)
286 v
.serialize_attribute
("mtype", to_mentity_ref
(mclass
.intro
.bound_mtype
.arguments
[rank
]))
290 redef class MParameter
291 redef fun core_serialize_to
(v
) do
292 v
.serialize_attribute
("is_vararg", is_vararg
)
293 v
.serialize_attribute
("name", name
)
294 v
.serialize_attribute
("mtype", to_mentity_ref
(mtype
))
298 # Create a ref to a `mentity`.
299 fun to_mentity_ref
(mentity
: nullable MEntity): nullable MEntityRef do
300 if mentity
== null then return null
301 return new MEntityRef(mentity
)
304 # Return a collection of `mentities` as a JsonArray of MEntityRefs.
305 fun to_mentity_refs
(mentities
: Collection[MEntity]): Array[MEntityRef] do
306 var array
= new Array[MEntityRef]
307 for mentity
in mentities
do
308 var ref
= to_mentity_ref
(mentity
)
309 if ref
== null then continue
315 # Use the FullJsonSerializer to generate the full json representation of a MEntity.
317 # See MEntity::to_full_json.
318 class FullJsonSerializer
321 # FIXME tmp use of the mainmodule, a PR is comming to clean all the JSON mess
322 var mainmodule
: MModule