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 Jsonable.
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
)
48 redef fun core_serialize_to
(v
) do
49 v
.serialize_attribute
("name", name
)
50 v
.serialize_attribute
("class_name", class_name
)
51 v
.serialize_attribute
("full_name", full_name
)
52 v
.serialize_attribute
("mdoc", mdoc_or_fallback
)
53 v
.serialize_attribute
("visibility", visibility
.to_s
)
54 v
.serialize_attribute
("modifiers", collect_modifiers
)
55 v
.serialize_attribute
("location", location
)
58 # Serialize the full version of `self` to JSON
60 # See: `FullJsonSerializer`
61 fun serialize_to_full_json
(plain
, pretty
: nullable Bool): String do
62 var stream
= new StringWriter
63 var serializer
= new FullJsonSerializer(stream
)
64 serializer
.plain_json
= plain
or else false
65 serializer
.pretty_json
= pretty
or else false
66 serializer
.serialize
self
71 # Return the full json representation of `self` with references.
73 # By default, every reference to another MEntity is replaced by a pointer
74 # to the MEntity::json_id.
75 # Use this method to obtain a full object with mentities instead of pointers.
76 fun to_full_json
: String do return serialize_to_full_json
(plain
=true)
78 # Same as `to_full_json` but with pretty json.
79 fun to_pretty_full_json
: String do return serialize_to_full_json
(plain
=true, pretty
=true)
81 # Sort mentities by name
82 private fun sort_entities
(mentities
: Collection[MEntity]): Array[MEntity] do
83 var sorter
= new MEntityNameSorter
84 var sorted
= mentities
.to_a
94 redef fun core_serialize_to
(v
) do
96 v
.serialize_attribute
("content", content
.join
("\n"))
97 v
.serialize_attribute
("location", location
)
105 redef fun core_serialize_to
(v
) do
106 v
.serialize_attribute
("column_end", column_end
)
107 v
.serialize_attribute
("column_start", column_start
)
108 v
.serialize_attribute
("line_end", line_end
)
109 v
.serialize_attribute
("line_start", line_start
)
112 v
.serialize_attribute
("file", file
.filename
)
118 redef fun core_serialize_to
(v
) do
120 if v
isa FullJsonSerializer then
121 v
.serialize_attribute
("root", to_mentity_ref
(root
))
122 v
.serialize_attribute
("mgroups", to_mentity_refs
(sort_entities
(mgroups
)))
124 if ini
!= null then v
.serialize_attribute
("ini", ini
.to_map
)
130 redef fun core_serialize_to
(v
) do
132 if v
isa FullJsonSerializer then
133 v
.serialize_attribute
("is_root", is_root
)
134 v
.serialize_attribute
("mpackage", to_mentity_ref
(mpackage
))
135 v
.serialize_attribute
("default_mmodule", to_mentity_ref
(default_mmodule
))
136 v
.serialize_attribute
("parent", to_mentity_ref
(parent
))
137 v
.serialize_attribute
("mmodules", to_mentity_refs
(sort_entities
(mmodules
)))
138 v
.serialize_attribute
("mgroups", to_mentity_refs
(sort_entities
(in_nesting
.direct_smallers
)))
144 redef fun core_serialize_to
(v
) do
146 if v
isa FullJsonSerializer then
147 var view
= private_view
148 v
.serialize_attribute
("mpackage", to_mentity_ref
(mpackage
))
149 v
.serialize_attribute
("mgroup", to_mentity_ref
(mgroup
))
150 v
.serialize_attribute
("intro_mclasses", to_mentity_refs
(sort_entities
(intro_mclasses
)))
151 v
.serialize_attribute
("mclassdefs", to_mentity_refs
(sort_entities
(mclassdefs
)))
152 v
.serialize_attribute
("intro_mclassdefs", to_mentity_refs
(sort_entities
(collect_intro_mclassdefs
(view
))))
153 v
.serialize_attribute
("redef_mclassdefs", to_mentity_refs
(sort_entities
(collect_redef_mclassdefs
(view
))))
154 v
.serialize_attribute
("imports", to_mentity_refs
(in_importation
.direct_greaters
))
160 redef fun core_serialize_to
(v
) do
162 v
.serialize_attribute
("mparameters", mparameters
)
163 if v
isa FullJsonSerializer then
164 var view
= private_view
165 v
.serialize_attribute
("intro", to_mentity_ref
(intro
))
166 v
.serialize_attribute
("intro_mmodule", to_mentity_ref
(intro_mmodule
))
167 v
.serialize_attribute
("mpackage", to_mentity_ref
(intro_mmodule
.mpackage
))
168 v
.serialize_attribute
("mclassdefs", to_mentity_refs
(mclassdefs
))
169 v
.serialize_attribute
("all_mproperties", to_mentity_refs
(sort_entities
(collect_accessible_mproperties
(view
))))
170 v
.serialize_attribute
("intro_mproperties", to_mentity_refs
(sort_entities
(collect_intro_mproperties
(view
))))
171 v
.serialize_attribute
("redef_mproperties", to_mentity_refs
(sort_entities
(collect_redef_mproperties
(view
))))
172 v
.serialize_attribute
("parents", to_mentity_refs
(sort_entities
(collect_parents
(view
))))
177 redef class MClassDef
178 redef fun core_serialize_to
(v
) do
180 v
.serialize_attribute
("is_intro", is_intro
)
181 v
.serialize_attribute
("mparameters", mclass
.mparameters
)
182 if v
isa FullJsonSerializer then
183 var view
= private_view
184 v
.serialize_attribute
("mmodule", to_mentity_ref
(mmodule
))
185 v
.serialize_attribute
("mclass", to_mentity_ref
(mclass
))
186 v
.serialize_attribute
("mpropdefs", to_mentity_refs
(sort_entities
(mpropdefs
)))
187 v
.serialize_attribute
("intro_mproperties", to_mentity_refs
(sort_entities
(intro_mproperties
)))
188 v
.serialize_attribute
("intro", to_mentity_ref
(mclass
.intro
))
189 v
.serialize_attribute
("mpackage", to_mentity_ref
(mmodule
.mpackage
))
190 v
.serialize_attribute
("intro_mpropdefs", to_mentity_refs
(sort_entities
(collect_intro_mpropdefs
(view
))))
191 v
.serialize_attribute
("redef_mpropdefs", to_mentity_refs
(sort_entities
(collect_redef_mpropdefs
(view
))))
196 redef class MProperty
197 redef fun core_serialize_to
(v
) do
199 if v
isa FullJsonSerializer then
200 v
.serialize_attribute
("intro", to_mentity_ref
(intro
))
201 v
.serialize_attribute
("intro_mclassdef", to_mentity_ref
(intro_mclassdef
))
202 v
.serialize_attribute
("mpropdefs", to_mentity_refs
(sort_entities
(mpropdefs
)))
203 v
.serialize_attribute
("intro_mclass", to_mentity_ref
(intro_mclassdef
.mclass
))
204 v
.serialize_attribute
("mpackage", to_mentity_ref
(intro_mclassdef
.mmodule
.mpackage
))
210 redef fun core_serialize_to
(v
) do
212 v
.serialize_attribute
("is_init", is_init
)
213 v
.serialize_attribute
("msignature", intro
.msignature
)
217 redef class MAttribute
218 redef fun core_serialize_to
(v
) do
220 v
.serialize_attribute
("static_mtype", to_mentity_ref
(intro
.static_mtype
))
224 redef class MVirtualTypeProp
225 redef fun core_serialize_to
(v
) do
227 v
.serialize_attribute
("mvirtualtype", to_mentity_ref
(mvirtualtype
))
228 v
.serialize_attribute
("bound", to_mentity_ref
(intro
.bound
))
233 redef fun core_serialize_to
(v
) do
235 v
.serialize_attribute
("is_intro", is_intro
)
236 if v
isa FullJsonSerializer then
237 v
.serialize_attribute
("mclassdef", to_mentity_ref
(mclassdef
))
238 v
.serialize_attribute
("mproperty", to_mentity_ref
(mproperty
))
239 v
.serialize_attribute
("intro", to_mentity_ref
(mproperty
.intro
))
240 v
.serialize_attribute
("intro_mclassdef", to_mentity_ref
(mproperty
.intro
.mclassdef
))
241 v
.serialize_attribute
("mmodule", to_mentity_ref
(mclassdef
.mmodule
))
242 v
.serialize_attribute
("mgroup", to_mentity_ref
(mclassdef
.mmodule
.mgroup
))
243 v
.serialize_attribute
("mpackage", to_mentity_ref
(mclassdef
.mmodule
.mpackage
))
248 redef class MMethodDef
249 redef fun core_serialize_to
(v
) do
251 v
.serialize_attribute
("msignature", msignature
)
255 redef class MAttributeDef
256 redef fun core_serialize_to
(v
) do
258 v
.serialize_attribute
("static_mtype", to_mentity_ref
(static_mtype
))
262 redef class MVirtualTypeDef
263 redef fun core_serialize_to
(v
) do
265 v
.serialize_attribute
("bound", to_mentity_ref
(bound
))
266 v
.serialize_attribute
("is_fixed", is_fixed
)
270 redef class MSignature
271 redef fun core_serialize_to
(v
) do
272 v
.serialize_attribute
("arity", arity
)
273 v
.serialize_attribute
("mparams", mparameters
)
274 v
.serialize_attribute
("return_mtype", to_mentity_ref
(return_mtype
))
275 v
.serialize_attribute
("vararg_rank", vararg_rank
)
279 redef class MParameterType
280 redef fun core_serialize_to
(v
) do
281 v
.serialize_attribute
("name", name
)
282 v
.serialize_attribute
("rank", rank
)
283 v
.serialize_attribute
("mtype", to_mentity_ref
(mclass
.intro
.bound_mtype
.arguments
[rank
]))
287 redef class MParameter
288 redef fun core_serialize_to
(v
) do
289 v
.serialize_attribute
("is_vararg", is_vararg
)
290 v
.serialize_attribute
("name", name
)
291 v
.serialize_attribute
("mtype", to_mentity_ref
(mtype
))
295 # Create a ref to a `mentity`.
296 fun to_mentity_ref
(mentity
: nullable MEntity): nullable MEntityRef do
297 if mentity
== null then return null
298 return new MEntityRef(mentity
)
301 # Return a collection of `mentities` as a JsonArray of MEntityRefs.
302 fun to_mentity_refs
(mentities
: Collection[MEntity]): Array[MEntityRef] do
303 var array
= new Array[MEntityRef]
304 for mentity
in mentities
do
305 var ref
= to_mentity_ref
(mentity
)
306 if ref
== null then continue
312 # Use the FullJsonSerializer to generate the full json representation of a MEntity.
314 # See MEntity::to_full_json.
315 class FullJsonSerializer