lib & contrib: update imports
[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
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 # Return `self` as a Json Object.
40 #
41 # By default, MEntity references contain only the `full_name` of the Mentity.
42 # You should redefine this method in your client to implement a different behavior.
43 redef fun json do
44 var obj = new JsonObject
45 obj["full_name"] = mentity.full_name
46 return obj
47 end
48 end
49
50 redef class MEntity
51 super Jsonable
52
53 # Return `self` as a JsonObject.
54 #
55 # By default, every reference to another MEntity is skipped.
56 # Use full_json for a full representation.
57 fun json: JsonObject do
58 var obj = new JsonObject
59 obj["name"] = name
60 obj["class_name"] = class_name
61 obj["full_name"] = full_name
62 obj["mdoc"] = mdoc_or_fallback
63 obj["visibility"] = visibility
64 var modifiers = new JsonArray
65 for modifier in collect_modifiers do
66 modifiers.add modifier
67 end
68 obj["modifiers"] = modifiers
69 return obj
70 end
71
72 redef fun serialize_to(v) do json.serialize_to(v)
73
74 # Return `self` as a JsonObject with references.
75 #
76 # By default, every reference to another MEntity is replaced by a pointer
77 # to the MEntity::json_id.
78 fun full_json: JsonObject do
79 var obj = json
80 obj["location"] = location
81 return obj
82 end
83
84 # Return `full_json` as a json string.
85 fun to_full_json: String do return full_json.to_json
86 end
87
88 redef class MDoc
89 super Jsonable
90
91 # Return `self` as a JsonObject.
92 fun json: JsonObject do
93 var obj = new JsonObject
94 obj["content"] = content.join("\n")
95 obj["location"] = location
96 return obj
97 end
98
99 redef fun serialize_to(v) do json.serialize_to(v)
100 end
101
102 redef class Location
103 super Jsonable
104
105 # Return `self` as a JsonObject.
106 fun json: JsonObject do
107 var obj = new JsonObject
108 obj["column_end"] = column_end
109 obj["column_start"] = column_start
110 obj["line_end"] = line_end
111 obj["line_start"] = line_start
112 var file = self.file
113 if file != null then
114 obj["file"] = file.filename
115 end
116 return obj
117 end
118
119 redef fun serialize_to(v) do json.serialize_to(v)
120 end
121
122 redef class MVisibility
123 super Jsonable
124
125 redef fun serialize_to(v) do to_s.serialize_to(v)
126 end
127
128 redef class MPackage
129
130 redef fun full_json do
131 var obj = super
132 if ini != null then
133 obj["ini"] = new JsonObject.from(ini.as(not null).to_map)
134 end
135 obj["root"] = to_mentity_ref(root)
136 obj["mgroups"] = to_mentity_refs(mgroups)
137 return obj
138 end
139 end
140
141 redef class MGroup
142 redef fun json do
143 var obj = super
144 obj["is_root"] = is_root
145 return obj
146 end
147
148 redef fun full_json do
149 var obj = super
150 obj["mpackage"] = to_mentity_ref(mpackage)
151 obj["default_mmodule"] = to_mentity_ref(default_mmodule)
152 obj["parent"] = to_mentity_ref(parent)
153 obj["mmodules"] = to_mentity_refs(mmodules)
154 obj["mgroups"] = to_mentity_refs(in_nesting.direct_smallers)
155 return obj
156 end
157 end
158
159 redef class MModule
160 redef fun full_json do
161 var obj = super
162 obj["mpackage"] = to_mentity_ref(mpackage)
163 obj["mgroup"] = to_mentity_ref(mgroup)
164 obj["intro_mclasses"] = to_mentity_refs(intro_mclasses)
165 obj["mclassdefs"] = to_mentity_refs(mclassdefs)
166 obj["intro_mclassdefs"] = to_mentity_refs(collect_intro_mclassdefs(private_view))
167 obj["redef_mclassdefs"] = to_mentity_refs(collect_redef_mclassdefs(private_view))
168 obj["imports"] = to_mentity_refs(in_importation.direct_greaters)
169 return obj
170 end
171 end
172
173 redef class MClass
174 redef fun json do
175 var obj = super
176 obj["mparameters"] = new JsonArray.from(mparameters)
177 return obj
178 end
179
180 redef fun full_json do
181 var obj = super
182 obj["intro"] = to_mentity_ref(intro)
183 obj["intro_mmodule"] = to_mentity_ref(intro_mmodule)
184 obj["mpackage"] = to_mentity_ref(intro_mmodule.mpackage)
185 obj["mclassdefs"] = to_mentity_refs(mclassdefs)
186 obj["all_mproperties"] = to_mentity_refs(collect_accessible_mproperties(private_view))
187 obj["intro_mproperties"] = to_mentity_refs(collect_intro_mproperties(private_view))
188 obj["redef_mproperties"] = to_mentity_refs(collect_redef_mproperties(private_view))
189 obj["parents"] = to_mentity_refs(collect_parents(private_view))
190 return obj
191 end
192 end
193
194 redef class MClassDef
195 redef fun json do
196 var obj = super
197 obj["is_intro"] = is_intro
198 obj["mparameters"] = new JsonArray.from(mclass.mparameters)
199 return obj
200 end
201
202 redef fun full_json do
203 var obj = super
204 obj["mmodule"] = to_mentity_ref(mmodule)
205 obj["mclass"] = to_mentity_ref(mclass)
206 obj["mpropdefs"] = to_mentity_refs(mpropdefs)
207 obj["intro_mproperties"] = to_mentity_refs(intro_mproperties)
208 obj["intro"] = to_mentity_ref(mclass.intro)
209 obj["mpackage"] = to_mentity_ref(mmodule.mpackage)
210 obj["intro_mpropdefs"] = to_mentity_refs(collect_intro_mpropdefs(private_view))
211 obj["redef_mpropdefs"] = to_mentity_refs(collect_redef_mpropdefs(private_view))
212 return obj
213 end
214 end
215
216 redef class MProperty
217 redef fun full_json do
218 var obj = super
219 obj["intro"] = to_mentity_ref(intro)
220 obj["intro_mclassdef"] = to_mentity_ref(intro_mclassdef)
221 obj["mpropdefs"] = to_mentity_refs(mpropdefs)
222 obj["intro_mclass"] = to_mentity_ref(intro_mclassdef.mclass)
223 obj["mpackage"] = to_mentity_ref(intro_mclassdef.mmodule.mpackage)
224 return obj
225 end
226 end
227
228 redef class MMethod
229 redef fun json do
230 var obj = super
231 obj["is_init"] = is_init
232 obj["msignature"] = intro.msignature
233 return obj
234 end
235 end
236
237 redef class MAttribute
238 redef fun json do
239 var obj = super
240 obj["static_mtype"] = to_mentity_ref(intro.static_mtype)
241 return obj
242 end
243 end
244
245 redef class MVirtualTypeProp
246 redef fun json do
247 var obj = super
248 obj["mvirtualtype"] = to_mentity_ref(mvirtualtype)
249 obj["bound"] = to_mentity_ref(intro.bound)
250 return obj
251 end
252 end
253
254 redef class MPropDef
255 redef fun json do
256 var obj = super
257 obj["is_intro"] = is_intro
258 return obj
259 end
260
261 redef fun full_json do
262 var obj = super
263 obj["mclassdef"] = to_mentity_ref(mclassdef)
264 obj["mproperty"] = to_mentity_ref(mproperty)
265 obj["intro"] = to_mentity_ref(mproperty.intro)
266 obj["intro_mclassdef"] = to_mentity_ref(mproperty.intro.mclassdef)
267 obj["mmodule"] = to_mentity_ref(mclassdef.mmodule)
268 obj["mgroup"] = to_mentity_ref(mclassdef.mmodule.mgroup)
269 obj["mpackage"] = to_mentity_ref(mclassdef.mmodule.mpackage)
270 return obj
271 end
272 end
273
274 redef class MMethodDef
275 redef fun json do
276 var obj = super
277 obj["msignature"] = msignature
278 return obj
279 end
280 end
281
282 redef class MAttributeDef
283 redef fun json do
284 var obj = super
285 obj["static_mtype"] = to_mentity_ref(static_mtype)
286 return obj
287 end
288 end
289
290 redef class MVirtualTypeDef
291 redef fun json do
292 var obj = super
293 obj["bound"] = to_mentity_ref(bound)
294 obj["is_fixed"] = is_fixed
295 return obj
296 end
297 end
298
299 redef class MSignature
300 redef fun json do
301 var obj = new JsonObject
302 obj["arity"] = arity
303 var arr = new JsonArray
304 for mparam in mparameters do arr.add mparam
305 obj["mparams"] = arr
306 obj["return_mtype"] = to_mentity_ref(return_mtype)
307 obj["vararg_rank"] = vararg_rank
308 return obj
309 end
310 end
311
312 redef class MParameterType
313 redef fun json do
314 var obj = new JsonObject
315 obj["name"] = name
316 obj["rank"] = rank
317 obj["mtype"] = to_mentity_ref(mclass.intro.bound_mtype.arguments[rank])
318 return obj
319 end
320 end
321
322 redef class MParameter
323 redef fun json do
324 var obj = new JsonObject
325 obj["is_vararg"] = is_vararg
326 obj["name"] = name
327 obj["mtype"] = to_mentity_ref(mtype)
328 return obj
329 end
330 end
331
332 # Create a ref to a `mentity`.
333 fun to_mentity_ref(mentity: nullable MEntity): nullable MEntityRef do
334 if mentity == null then return null
335 return new MEntityRef(mentity)
336 end
337
338 # Return a collection of `mentities` as a JsonArray of MEntityRefs.
339 fun to_mentity_refs(mentities: Collection[MEntity]): JsonArray do
340 var array = new JsonArray
341 for mentity in mentities do array.add to_mentity_ref(mentity)
342 return array
343 end