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