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 Gee.HashMap<string,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.size > 0) {
179 r.set_object_member("params", this.toJSONObject(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));
243 public class Gir : GirObject {
245 static Gee.HashMap<string,Gir> cache = null;
246 //Gee.Hashmap<string,what> nodes;
247 public static Gir factory(string ns) {
249 cache = new Gee.HashMap<string,Gir>();
251 var ret = cache.get(ns);
255 var add = new Gir(ns);
258 var iter = add.classes.map_iterator();
261 iter.get_value().overlayParent();
264 return cache.get(ns);
267 public Gir (string ns)
270 var gi = GI.Repository.get_default();
271 gi.require(ns, null, 0);
273 var ver = gi.get_version(ns);
274 unowned GLib.SList<string> pth = GI.Repository.get_search_path ();
275 var gir_path = pth.nth_data(0).replace("/lib/girepository-1.0", "/share/gir-1.0");
277 var file = gir_path + "/" + ns + "-" + ver + ".gir";
278 // print("ns: " + ns + "\n");
279 // print("ver: " + ver + "\n");
285 //this.nodes = new Gee.Hashmap<string,what>();
287 var doc = Xml.Parser.parse_file (file);
288 var root = doc->get_root_element();
289 this.walk( root, (GirObject) this );
294 public void walk(Xml.Node* element, GirObject? parent)
296 var n = element->get_prop("name");
300 //print(element->name + " (" + parent.name + "==>" + n +")\n");
301 switch (element->name) {
306 parent.includes.set(n, element->get_prop("version"));
322 //break; // not handled..
325 var c = new GirObject("Class", parent.name + "." + n);
326 parent.classes.set(n, c);
328 c.parent = element->get_prop("parent");
329 if (c.parent == null) {
336 var c = new GirObject("Interface", parent.name + "." + n);
337 parent.classes.set(n, c);
340 c.parent = element->get_prop("parent");
341 if (c.parent == null) {
349 parent.doctxt = element->get_content();
353 parent.implements.append(n);
357 var c = new GirObject("Ctor",n);
359 parent.ctors.set(n,c);
364 var c = new GirObject("Return", "return-value");
366 parent.return_value = c;
370 case "virtual-method": // not sure...
373 var c = new GirObject("Signal",n);
374 parent.signals.set(n,c);
378 case "signal": // Glib:signal
379 var c = new GirObject("Signal",n.replace("-", "_"));
381 parent.signals.set(n.replace("-", "_"),c);
387 case "callback": // not sure...
394 return; // no children?
398 var c = new GirObject("Method",n);
400 c.propertyof = parent.name;
401 parent.methods.set(n,c);
406 var c = new GirObject("Paramset",n);
412 case "instance-parameter":
413 var c = new GirObject("Param",n);
415 c.is_instance = true;
416 parent.params.set(n,c);
421 var c = new GirObject("Param",n);
423 parent.params.set(n,c);
429 var c = new GirObject("Prop",n.replace("-", "_"));
431 c.propertyof = parent.name;
432 parent.props.set(n.replace("-", "_"),c);
437 var c = new GirObject("Function",n);
439 parent.methods.set(n,c);
444 parent.is_array = true;
445 break; // type is added soon..
448 parent.is_varargs= true;
452 var c = new GirObject("Const",n);
453 c.value = element->get_prop("value");
455 parent.consts.set(n,c);
461 var c = new GirObject("Enum",n);
463 parent.consts.set(n,c);
469 var c = new GirObject("EnumMember",n);
471 c.value = element->get_prop("value");
472 parent.consts.set(n,c);
477 case "doc-deprecated":
480 case "record": // struct?
482 case "bitfield": // ignore?
484 case "prerequisite": // ignore?
487 print("UNHANDLED Gir file element: " + element->name +"\n");
491 if (element->name == "signal") {
496 if (element->name == "return-value") {
497 path += ".return-value";
499 print(path + ":" + element->name + "\n");
501 //var d = getAttribute(element,'doc');
503 // Seed.print(path + ':' + d);
506 for (Xml.Node* iter = element->children; iter != null; iter = iter->next) {
507 if (iter->type == Xml.ElementType.TEXT_NODE) {
510 this.walk(iter, parent);
514 public string doc(string what)
516 var ar = what.split(".");
517 var cls = this.classes.get(ar[1]);
518 if (ar.length == 2) {
519 return cls.doctxt != null ? cls.doctxt : "";
521 // return the property.. by default..
522 var pr = cls.props.get(ar[2]);
523 return pr.doctxt != null ? pr.doctxt : "";