2 // valac -g --pkg gee-1.0 --pkg libxml-2.0 --pkg gobject-introspection-1.0 --pkg json-glib-1.0 Palete/Gir.vala -o /tmp/Gir
4 public static int main (string[] args) {
6 var g = Palete.Gir.factory("Gtk");
7 var test = g.classes.get("ToolButton");
10 var generator = new Json.Generator ();
11 var n = new Json.Node(Json.NodeType.OBJECT);
12 n.set_object(test.toJSON());
13 generator.set_root(n);
15 generator.pretty = true;
17 print(generator.to_data(null));
22 public errordomain GirError {
28 public class GirObject: Object {
31 public string propertyof;
33 public string nodetype;
34 public string package;
36 public GirObject paramset = null;
37 public GirObject return_value = null;
39 public bool is_instance;
41 public bool is_varargs;
46 public GLib.List<GirObject> params;
47 public GLib.List<string> implements;
48 public GLib.List<string> inherits; // full list of all classes and interfaces...
49 public Gee.HashMap<string,GirObject> ctors;
50 public Gee.HashMap<string,GirObject> methods;
51 public Gee.HashMap<string,string> includes;
52 public Gee.HashMap<string,GirObject> classes;
53 public Gee.HashMap<string,GirObject> props;
54 public Gee.HashMap<string,GirObject> consts;
55 public Gee.HashMap<string,GirObject> signals;
57 public GirObject(string nodetype, string n)
59 this.nodetype = nodetype;
65 this.is_array = false;
66 this.is_instance = false;
67 this.is_varargs = false;
68 this.implements = new GLib.List<string>();
69 this.inherits = new GLib.List<string>();
70 this.includes = new Gee.HashMap<string,string>();
72 this.params = new GLib.List<GirObject>();
73 this.ctors = new Gee.HashMap<string,GirObject>();
74 this.methods =new Gee.HashMap<string,GirObject>();
76 this.classes = new Gee.HashMap<string,GirObject>();
77 this.props = new Gee.HashMap<string,GirObject>();
78 this.consts = new Gee.HashMap<string,GirObject>();
79 this.signals = new Gee.HashMap<string,GirObject>();
80 this.is_overlaid = false;
84 public void overlayParent()
87 if (this.parent.length < 1 || this.is_overlaid) {
88 this.is_overlaid = true;
91 // print("Overlaying " +this.name + " with " + this.parent + "\n");
93 var pcls = this.clsToObject( this.parent);
95 throw new GirError.INVALID_VALUE("Could not find class : " +
96 this.parent + " of " + this.name + " in " + this.ns);
99 pcls.overlayParent( );
100 this.copyFrom(pcls,false);
101 for(var i=0; i < this.implements.length(); i++) {
102 var clsname = this.implements.nth_data(i);
103 var picls = this.clsToObject(clsname);
104 this.copyFrom(picls,true);
106 this.is_overlaid = true;
109 public GirObject clsToObject(string in_pn)
112 var gir = Gir.factory (this.ns);
113 if (in_pn.contains(".")) {
114 gir = Gir.factory(in_pn.split(".")[0]);
115 pn = in_pn.split(".")[1];
118 return gir.classes.get(pn);
122 public string fqn() {
123 return this.ns + this.name;
126 public void copyFrom(GirObject pcls, bool is_interface)
129 this.inherits.append(pcls.fqn());
130 var iter = pcls.methods.map_iterator();
132 if (null != this.methods.get(iter.get_key())) {
136 this.methods.set(iter.get_key(), iter.get_value());
139 iter = pcls.props.map_iterator();
141 if (null != this.props.get(iter.get_key())) {
145 this.props.set(iter.get_key(), iter.get_value());
148 iter = pcls.signals.map_iterator();
150 if (null != this.signals.get(iter.get_key())) {
154 this.signals.set(iter.get_key(), iter.get_value());
158 public Json.Object toJSON()
160 var r = new Json.Object();
161 r.set_string_member("nodetype", this.nodetype);
162 r.set_string_member("name", this.name);
163 if (this.propertyof.length > 0) {
164 r.set_string_member("of", this.propertyof);
166 if (this.type.length > 0) {
167 r.set_string_member("type", this.type);
169 if (this.parent != null && this.parent.length > 0) {
170 r.set_string_member("parent", this.parent);
172 // is_arary / is_instance / is_varargs..
174 if (this.implements.length() > 0) {
175 r.set_array_member("length", this.toJSONArrayString(this.implements));
178 if (this.params.length() > 0) {
179 r.set_array_member("params", this.toJSONArrayObject(this.params));
181 if (this.ctors.size > 0) {
182 r.set_object_member("ctors", this.toJSONObject(this.ctors));
184 if (this.methods.size > 0) {
185 r.set_object_member("methods", this.toJSONObject(this.methods));
187 if (this.includes.size > 0) {
188 r.set_object_member("includes", this.toJSONObjectString(this.includes));
190 if (this.classes.size > 0) {
191 r.set_object_member("classes", this.toJSONObject(this.classes));
193 if (this.props.size > 0) {
194 r.set_object_member("props", this.toJSONObject(this.props));
196 if (this.consts.size > 0) {
197 r.set_object_member("consts", this.toJSONObject(this.consts));
199 if (this.signals.size > 0) {
200 r.set_object_member("signals", this.toJSONObject(this.signals));
202 if (this.paramset != null) {
203 r.set_object_member("params", this.paramset.toJSON());
205 if (this.return_value != null) {
206 r.set_object_member("return_value", this.return_value.toJSON());
210 public Json.Object toJSONObject(Gee.HashMap<string,GirObject> map)
212 var r = new Json.Object();
213 var iter = map.map_iterator();
215 r.set_object_member(iter.get_key(), iter.get_value().toJSON());
219 public Json.Object toJSONObjectString(Gee.HashMap<string,string> map)
221 var r = new Json.Object();
222 var iter = map.map_iterator();
224 r.set_string_member(iter.get_key(), iter.get_value());
228 public Json.Array toJSONArrayString(GLib.List<string> map)
230 var r = new Json.Array();
231 for(var i =0;i< map.length();i++) {
233 r.add_string_element(map.nth_data(i));
237 public Json.Array toJSONArrayObject(GLib.List<GirObject> map)
239 var r = new Json.Array();
240 for(var i =0;i< map.length();i++) {
242 r.add_object_element(map.nth_data().toJSON());
252 public class Gir : GirObject {
254 static Gee.HashMap<string,Gir> cache = null;
255 //Gee.Hashmap<string,what> nodes;
256 public static Gir factory(string ns) {
258 cache = new Gee.HashMap<string,Gir>();
260 var ret = cache.get(ns);
264 var add = new Gir(ns);
267 var iter = add.classes.map_iterator();
270 iter.get_value().overlayParent();
273 return cache.get(ns);
276 public Gir (string ns)
279 var gi = GI.Repository.get_default();
280 gi.require(ns, null, 0);
282 var ver = gi.get_version(ns);
283 unowned GLib.SList<string> pth = GI.Repository.get_search_path ();
284 var gir_path = pth.nth_data(0).replace("/lib/girepository-1.0", "/share/gir-1.0");
286 var file = gir_path + "/" + ns + "-" + ver + ".gir";
287 // print("ns: " + ns + "\n");
288 // print("ver: " + ver + "\n");
294 //this.nodes = new Gee.Hashmap<string,what>();
296 var doc = Xml.Parser.parse_file (file);
297 var root = doc->get_root_element();
298 this.walk( root, (GirObject) this );
303 public void walk(Xml.Node* element, GirObject? parent)
305 var n = element->get_prop("name");
309 //print(element->name + " (" + parent.name + "==>" + n +")\n");
310 switch (element->name) {
315 parent.includes.set(n, element->get_prop("version"));
331 //break; // not handled..
334 var c = new GirObject("Class", parent.name + "." + n);
335 parent.classes.set(n, c);
337 c.parent = element->get_prop("parent");
338 if (c.parent == null) {
345 var c = new GirObject("Interface", parent.name + "." + n);
346 parent.classes.set(n, c);
349 c.parent = element->get_prop("parent");
350 if (c.parent == null) {
358 parent.doctxt = element->get_content();
362 parent.implements.append(n);
366 var c = new GirObject("Ctor",n);
368 parent.ctors.set(n,c);
373 var c = new GirObject("Return", "return-value");
375 parent.return_value = c;
379 case "virtual-method": // not sure...
382 var c = new GirObject("Signal",n);
383 parent.signals.set(n,c);
387 case "signal": // Glib:signal
388 var c = new GirObject("Signal",n.replace("-", "_"));
390 parent.signals.set(n.replace("-", "_"),c);
396 case "callback": // not sure...
403 return; // no children?
407 var c = new GirObject("Method",n);
409 c.propertyof = parent.name;
410 parent.methods.set(n,c);
415 var c = new GirObject("Paramset",n);
421 case "instance-parameter":
422 var c = new GirObject("Param",n);
424 c.is_instance = true;
425 parent.params.append(c);
430 var c = new GirObject("Param",n);
432 parent.params.append(c);
438 var c = new GirObject("Prop",n.replace("-", "_"));
440 c.propertyof = parent.name;
441 parent.props.set(n.replace("-", "_"),c);
446 var c = new GirObject("Function",n);
448 parent.methods.set(n,c);
453 parent.is_array = true;
454 break; // type is added soon..
457 parent.is_varargs= true;
461 var c = new GirObject("Const",n);
462 c.value = element->get_prop("value");
464 parent.consts.set(n,c);
470 var c = new GirObject("Enum",n);
472 parent.consts.set(n,c);
478 var c = new GirObject("EnumMember",n);
480 c.value = element->get_prop("value");
481 parent.consts.set(n,c);
486 case "doc-deprecated":
489 case "record": // struct?
491 case "bitfield": // ignore?
493 case "prerequisite": // ignore?
496 print("UNHANDLED Gir file element: " + element->name +"\n");
500 if (element->name == "signal") {
505 if (element->name == "return-value") {
506 path += ".return-value";
508 print(path + ":" + element->name + "\n");
510 //var d = getAttribute(element,'doc');
512 // Seed.print(path + ':' + d);
515 for (Xml.Node* iter = element->children; iter != null; iter = iter->next) {
516 if (iter->type == Xml.ElementType.TEXT_NODE) {
519 this.walk(iter, parent);
523 public string doc(string what)
525 var ar = what.split(".");
526 var cls = this.classes.get(ar[1]);
527 if (ar.length == 2) {
528 return cls.doctxt != null ? cls.doctxt : "";
530 // return the property.. by default..
531 var pr = cls.props.get(ar[2]);
532 return pr.doctxt != null ? pr.doctxt : "";