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
31 # A reference to another mentity.
38 # Return `self` as a Json Object.
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.
43 var obj
= new JsonObject
44 obj
["full_name"] = mentity
.full_name
52 # Return `self` as a JsonObject.
54 # By default, every reference to another MEntity is replaced by a pointer
55 # to the MEntity::json_id.
56 fun json
: JsonObject do
57 var obj
= new JsonObject
59 obj
["class_name"] = class_name
60 obj
["full_name"] = full_name
61 obj
["mdoc"] = mdoc_or_fallback
62 obj
["visibility"] = visibility
63 obj
["location"] = location
64 var modifiers
= new JsonArray
65 for modifier
in collect_modifiers
do
66 modifiers
.add modifier
68 obj
["modifiers"] = modifiers
72 redef fun to_json
do return json
.to_json
78 # Return `self` as a JsonObject.
79 fun json
: JsonObject do
80 var obj
= new JsonObject
81 obj
["content"] = content
.join
("\n")
82 obj
["location"] = location
86 redef fun to_json
do return json
.to_json
92 # Return `self` as a JsonObject.
93 fun json
: JsonObject do
94 var obj
= new JsonObject
95 obj
["column_end"] = column_end
96 obj
["column_start"] = column_start
97 obj
["line_end"] = line_end
98 obj
["line_start"] = line_start
101 obj
["file"] = file
.filename
106 redef fun to_json
do return json
.to_json
109 redef class MVisibility
112 redef fun to_json
do return to_s
.to_json
120 obj
["ini"] = new JsonObject.from
(ini
.as(not null).to_map
)
122 obj
["root"] = to_mentity_ref
(root
)
123 obj
["mgroups"] = to_mentity_refs
(mgroups
)
131 obj
["is_root"] = is_root
132 obj
["mpackage"] = to_mentity_ref
(mpackage
)
133 obj
["default_mmodule"] = to_mentity_ref
(default_mmodule
)
134 obj
["parent"] = to_mentity_ref
(parent
)
135 obj
["mmodules"] = to_mentity_refs
(mmodules
)
136 obj
["mgroups"] = to_mentity_refs
(in_nesting
.direct_smallers
)
144 obj
["mpackage"] = to_mentity_ref
(mpackage
)
145 obj
["mgroup"] = to_mentity_ref
(mgroup
)
146 obj
["intro_mclasses"] = to_mentity_refs
(intro_mclasses
)
147 obj
["mclassdefs"] = to_mentity_refs
(mclassdefs
)
155 var arr
= new JsonArray
156 for mparameter
in mparameters
do arr
.add mparameter
157 obj
["mparameters"] = arr
158 obj
["intro"] = to_mentity_ref
(intro
)
159 obj
["intro_mmodule"] = to_mentity_ref
(intro_mmodule
)
160 obj
["mpackage"] = to_mentity_ref
(intro_mmodule
.mpackage
)
161 obj
["mclassdefs"] = to_mentity_refs
(mclassdefs
)
166 redef class MClassDef
169 obj
["is_intro"] = is_intro
170 var arr
= new JsonArray
171 for mparameter
in mclass
.mparameters
do arr
.add mparameter
172 obj
["mparameters"] = arr
173 obj
["mmodule"] = to_mentity_ref
(mmodule
)
174 obj
["mclass"] = to_mentity_ref
(mclass
)
175 obj
["mpropdefs"] = to_mentity_refs
(mpropdefs
)
176 obj
["intro_mproperties"] = to_mentity_refs
(intro_mproperties
)
181 redef class MProperty
184 obj
["intro"] = to_mentity_ref
(intro
)
185 obj
["intro_mclassdef"] = to_mentity_ref
(intro_mclassdef
)
186 obj
["mpropdefs"] = to_mentity_refs
(mpropdefs
)
194 obj
["is_init"] = is_init
195 obj
["msignature"] = intro
.msignature
200 redef class MAttribute
203 obj
["static_mtype"] = to_mentity_ref
(intro
.static_mtype
)
208 redef class MVirtualTypeProp
211 obj
["mvirtualtype"] = to_mentity_ref
(mvirtualtype
)
212 obj
["bound"] = to_mentity_ref
(intro
.bound
)
220 obj
["is_intro"] = is_intro
221 obj
["mclassdef"] = to_mentity_ref
(mclassdef
)
222 obj
["mproperty"] = to_mentity_ref
(mproperty
)
227 redef class MMethodDef
230 obj
["msignature"] = msignature
235 redef class MAttributeDef
238 obj
["static_mtype"] = to_mentity_ref
(static_mtype
)
243 redef class MVirtualTypeDef
246 obj
["bound"] = to_mentity_ref
(bound
)
247 obj
["is_fixed"] = is_fixed
252 redef class MSignature
254 var obj
= new JsonObject
256 var arr
= new JsonArray
257 for mparam
in mparameters
do arr
.add mparam
259 obj
["return_mtype"] = to_mentity_ref
(return_mtype
)
260 obj
["vararg_rank"] = vararg_rank
265 redef class MParameterType
267 var obj
= new JsonObject
270 obj
["mtype"] = to_mentity_ref
(mclass
.intro
.bound_mtype
.arguments
[rank
])
275 redef class MParameter
277 var obj
= new JsonObject
278 obj
["is_vararg"] = is_vararg
280 obj
["mtype"] = to_mentity_ref
(mtype
)
285 # Create a ref to a `mentity`.
286 fun to_mentity_ref
(mentity
: nullable MEntity): nullable MEntityRef do
287 if mentity
== null then return null
288 return new MEntityRef(mentity
)
291 # Return a collection of `mentities` as a JsonArray of MEntityRefs.
292 fun to_mentity_refs
(mentities
: Collection[MEntity]): JsonArray do
293 var array
= new JsonArray
294 for mentity
in mentities
do array
.add to_mentity_ref
(mentity
)