nitc: add new module annotation `is generated`
[nit.git] / src / model / model_json.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
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
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 # Make model entities Jsonable.
16 #
17 # To avoid cycles, every reference from a MEntity to another is replaced by a
18 # MEntityRef.
19 #
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.
23 #
24 # TODO consider serialization module?
25 module model_json
26
27 import model::model_collect
28 import json::static
29 import json::serialization_write
30 import loader
31
32 # A reference to another mentity.
33 class MEntityRef
34 super MEntity
35
36 # MEntity to link to.
37 var mentity: MEntity
38
39 redef fun core_serialize_to(v) do
40 v.serialize_attribute("full_name", mentity.full_name)
41 end
42 end
43
44 redef class MEntity
45 super Jsonable
46 serialize
47
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)
56 end
57
58 # Serialize the full version of `self` to JSON
59 #
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
67 stream.close
68 return stream.to_s
69 end
70
71 # Return the full json representation of `self` with references.
72 #
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)
77
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)
80
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
85 sorter.sort(sorted)
86 return sorted
87 end
88 end
89
90 redef class MDoc
91 super Jsonable
92 serialize
93
94 redef fun core_serialize_to(v) do
95 super
96 v.serialize_attribute("content", content.join("\n"))
97 v.serialize_attribute("location", location)
98 end
99 end
100
101 redef class Location
102 super Jsonable
103 serialize
104
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)
110 var file = self.file
111 if file != null then
112 v.serialize_attribute("file", file.filename)
113 end
114 end
115 end
116
117 redef class MPackage
118 redef fun core_serialize_to(v) do
119 super
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)))
123 var ini = self.ini
124 if ini != null then v.serialize_attribute("ini", ini.to_map)
125 end
126 end
127 end
128
129 redef class MGroup
130 redef fun core_serialize_to(v) do
131 super
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)))
139 end
140 end
141 end
142
143 redef class MModule
144 redef fun core_serialize_to(v) do
145 super
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))
155 end
156 end
157 end
158
159 redef class MClass
160 redef fun core_serialize_to(v) do
161 super
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))))
173 end
174 end
175 end
176
177 redef class MClassDef
178 redef fun core_serialize_to(v) do
179 super
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))))
192 end
193 end
194 end
195
196 redef class MProperty
197 redef fun core_serialize_to(v) do
198 super
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))
205 end
206 end
207 end
208
209 redef class MMethod
210 redef fun core_serialize_to(v) do
211 super
212 v.serialize_attribute("is_init", is_init)
213 v.serialize_attribute("msignature", intro.msignature)
214 end
215 end
216
217 redef class MAttribute
218 redef fun core_serialize_to(v) do
219 super
220 v.serialize_attribute("static_mtype", to_mentity_ref(intro.static_mtype))
221 end
222 end
223
224 redef class MVirtualTypeProp
225 redef fun core_serialize_to(v) do
226 super
227 v.serialize_attribute("mvirtualtype", to_mentity_ref(mvirtualtype))
228 v.serialize_attribute("bound", to_mentity_ref(intro.bound))
229 end
230 end
231
232 redef class MPropDef
233 redef fun core_serialize_to(v) do
234 super
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))
244 end
245 end
246 end
247
248 redef class MMethodDef
249 redef fun core_serialize_to(v) do
250 super
251 v.serialize_attribute("msignature", msignature)
252 end
253 end
254
255 redef class MAttributeDef
256 redef fun core_serialize_to(v) do
257 super
258 v.serialize_attribute("static_mtype", to_mentity_ref(static_mtype))
259 end
260 end
261
262 redef class MVirtualTypeDef
263 redef fun core_serialize_to(v) do
264 super
265 v.serialize_attribute("bound", to_mentity_ref(bound))
266 v.serialize_attribute("is_fixed", is_fixed)
267 end
268 end
269
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)
276 end
277 end
278
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]))
284 end
285 end
286
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))
292 end
293 end
294
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)
299 end
300
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
307 array.add ref
308 end
309 return array
310 end
311
312 # Use the FullJsonSerializer to generate the full json representation of a MEntity.
313 #
314 # See MEntity::to_full_json.
315 class FullJsonSerializer
316 super JsonSerializer
317 end