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;
49 public Gee.ArrayList<GirObject> params;
50 public Gee.ArrayList<string> implements;
51 public Gee.ArrayList<string> inherits; // full list of all classes and interfaces...
52 public Gee.HashMap<string,GirObject> ctors;
53 public Gee.HashMap<string,GirObject> methods;
54 public Gee.HashMap<string,string> includes;
55 public Gee.HashMap<string,GirObject> classes;
56 public Gee.HashMap<string,GirObject> props;
57 public Gee.HashMap<string,GirObject> consts;
58 public Gee.HashMap<string,GirObject> signals;
60 public GirObject(string nodetype, string n)
62 this.nodetype = nodetype;
68 this.is_array = false;
69 this.is_instance = false;
70 this.is_varargs = false;
75 this.implements = new Gee.ArrayList<string>();
76 this.inherits = new Gee.ArrayList<string>(); // list of all ancestors. (interfaces and parents)
77 this.includes = new Gee.HashMap<string,string>();
79 this.params = new Gee.ArrayList<GirObject>();
80 this.ctors = new Gee.HashMap<string,GirObject>();
81 this.methods =new Gee.HashMap<string,GirObject>();
83 this.classes = new Gee.HashMap<string,GirObject>();
84 this.props = new Gee.HashMap<string,GirObject>();
85 this.consts = new Gee.HashMap<string,GirObject>();
86 this.signals = new Gee.HashMap<string,GirObject>();
87 this.is_overlaid = false;
91 public string[] inheritsToStringArray()
94 for(var i =0;i< this.inherits.size; i++) {
95 ret += this.inherits.get(i);
102 public void overlayParent()
105 if (this.parent.length < 1 || this.is_overlaid) {
106 this.is_overlaid = true;
109 // print("Overlaying " +this.name + " with " + this.parent + "\n");
111 var pcls = this.clsToObject( this.parent);
113 throw new GirError.INVALID_VALUE("Could not find class : " +
114 this.parent + " of " + this.name + " in " + this.ns);
117 pcls.overlayParent( );
118 this.copyFrom(pcls,false);
119 for(var i=0; i < this.implements.size; i++) {
120 var clsname = this.implements.get(i);
121 var picls = this.clsToObject(clsname);
122 this.copyFrom(picls,true);
124 this.is_overlaid = true;
127 public GirObject clsToObject(string in_pn)
130 var gir = Gir.factory (this.ns);
131 if (in_pn.contains(".")) {
132 gir = Gir.factory(in_pn.split(".")[0]);
133 pn = in_pn.split(".")[1];
136 return gir.classes.get(pn);
140 public string fqn() {
141 return this.ns + this.name;
144 public void copyFrom(GirObject pcls, bool is_interface)
147 this.inherits.add(pcls.fqn());
148 var iter = pcls.methods.map_iterator();
150 if (null != this.methods.get(iter.get_key())) {
154 this.methods.set(iter.get_key(), iter.get_value());
157 iter = pcls.props.map_iterator();
159 if (null != this.props.get(iter.get_key())) {
163 this.props.set(iter.get_key(), iter.get_value());
166 iter = pcls.signals.map_iterator();
168 if (null != this.signals.get(iter.get_key())) {
172 this.signals.set(iter.get_key(), iter.get_value());
176 public Json.Object toJSON()
178 var r = new Json.Object();
179 r.set_string_member("nodetype", this.nodetype);
180 r.set_string_member("name", this.name);
181 if (this.propertyof.length > 0) {
182 r.set_string_member("of", this.propertyof);
184 if (this.type.length > 0) {
185 r.set_string_member("type", this.type);
187 if (this.parent != null && this.parent.length > 0) {
188 r.set_string_member("parent", this.parent);
190 if (this.sig.length > 0) {
191 r.set_string_member("sig", this.sig);
194 // is_arary / is_instance / is_varargs..
196 if (this.implements.size > 0) {
197 r.set_array_member("length", this.toJSONArrayString(this.implements));
200 if (this.params.size > 0) {
201 r.set_array_member("params", this.toJSONArrayObject(this.params));
203 if (this.ctors.size > 0) {
204 r.set_object_member("ctors", this.toJSONObject(this.ctors));
206 if (this.methods.size > 0) {
207 r.set_object_member("methods", this.toJSONObject(this.methods));
209 if (this.includes.size > 0) {
210 r.set_object_member("includes", this.toJSONObjectString(this.includes));
212 if (this.classes.size > 0) {
213 r.set_object_member("classes", this.toJSONObject(this.classes));
215 if (this.props.size > 0) {
216 r.set_object_member("props", this.toJSONObject(this.props));
218 if (this.consts.size > 0) {
219 r.set_object_member("consts", this.toJSONObject(this.consts));
221 if (this.signals.size > 0) {
222 r.set_object_member("signals", this.toJSONObject(this.signals));
224 if (this.paramset != null) {
225 r.set_object_member("params", this.paramset.toJSON());
227 if (this.return_value != null) {
228 r.set_object_member("return_value", this.return_value.toJSON());
232 public Json.Object toJSONObject(Gee.HashMap<string,GirObject> map)
234 var r = new Json.Object();
235 var iter = map.map_iterator();
237 r.set_object_member(iter.get_key(), iter.get_value().toJSON());
241 public Json.Object toJSONObjectString(Gee.HashMap<string,string> map)
243 var r = new Json.Object();
244 var iter = map.map_iterator();
246 r.set_string_member(iter.get_key(), iter.get_value());
250 public Json.Array toJSONArrayString(Gee.ArrayList<string> map)
252 var r = new Json.Array();
253 for(var i =0;i< map.size;i++) {
255 r.add_string_element(map.get(i));
259 public Json.Array toJSONArrayObject(Gee.ArrayList<GirObject> map)
261 var r = new Json.Array();
262 for(var i =0;i< map.size;i++) {
264 r.add_object_element(map.get(i).toJSON());
274 public class Gir : GirObject {
276 static Gee.HashMap<string,Gir> cache = null;
277 //Gee.Hashmap<string,what> nodes;
278 public static Gir factory(string ns) {
280 cache = new Gee.HashMap<string,Gir>();
282 var ret = cache.get(ns);
286 var add = new Gir(ns);
289 var iter = add.classes.map_iterator();
292 iter.get_value().overlayParent();
295 return cache.get(ns);
299 * guess the fqn of a type == eg. gboolean or Widget etc...
301 public static string fqtype(string type, string ns) {
303 if (g.classes.has_key(type)) {
304 return ns + "." + type;
306 // look at includes..
307 var iter = g.includes.map_iterator();
309 var ret = fqtype(type, iter.get_key());
317 public static string guessDefaultValueForType(string type) {
318 if (type.contains(".")) {
329 return "?"+ type + "?";
337 public Gir (string ns)
340 var gi = GI.Repository.get_default();
341 gi.require(ns, null, 0);
343 var ver = gi.get_version(ns);
344 unowned GLib.SList<string> pth = GI.Repository.get_search_path ();
345 var gir_path = pth.nth_data(0).replace("/lib/girepository-1.0", "/share/gir-1.0");
347 var file = gir_path + "/" + ns + "-" + ver + ".gir";
348 // print("ns: " + ns + "\n");
349 // print("ver: " + ver + "\n");
355 //this.nodes = new Gee.Hashmap<string,what>();
357 var doc = Xml.Parser.parse_file (file);
358 var root = doc->get_root_element();
359 this.walk( root, (GirObject) this );
364 public void walk(Xml.Node* element, GirObject? parent)
366 var n = element->get_prop("name");
370 //print(element->name + " (" + parent.name + "==>" + n +")\n");
371 switch (element->name) {
376 parent.includes.set(n, element->get_prop("version"));
392 //break; // not handled..
395 var c = new GirObject("Class", parent.name + "." + n);
396 parent.classes.set(n, c);
398 c.parent = element->get_prop("parent");
399 if (c.parent == null) {
406 var c = new GirObject("Interface", parent.name + "." + n);
407 parent.classes.set(n, c);
410 c.parent = element->get_prop("parent");
411 if (c.parent == null) {
419 parent.doctxt = element->get_content();
423 parent.implements.add(n);
427 var c = new GirObject("Ctor",n);
429 parent.ctors.set(n,c);
434 var c = new GirObject("Return", "return-value");
436 parent.return_value = c;
440 case "virtual-method": // not sure...
443 var c = new GirObject("Signal",n);
444 parent.signals.set(n,c);
448 case "signal": // Glib:signal
449 var c = new GirObject("Signal",n.replace("-", "_"));
451 parent.signals.set(n.replace("-", "_"),c);
457 case "callback": // not sure...
464 return; // no children?
468 var c = new GirObject("Method",n);
470 c.propertyof = parent.name;
471 parent.methods.set(n,c);
476 var c = new GirObject("Paramset",n);
482 case "instance-parameter":
483 var c = new GirObject("Param",n);
485 c.is_instance = true;
486 parent.params.add(c);
491 var c = new GirObject("Param",n);
493 parent.params.add(c);
499 var c = new GirObject("Prop",n.replace("-", "_"));
501 c.propertyof = parent.name;
502 parent.props.set(n.replace("-", "_"),c);
507 var c = new GirObject("Function",n);
509 parent.methods.set(n,c);
514 parent.is_array = true;
515 break; // type is added soon..
518 parent.is_varargs= true;
522 var c = new GirObject("Const",n);
523 c.value = element->get_prop("value");
525 parent.consts.set(n,c);
531 var c = new GirObject("Enum",n);
533 parent.consts.set(n,c);
539 var c = new GirObject("EnumMember",n);
541 c.value = element->get_prop("value");
542 parent.consts.set(n,c);
547 case "doc-deprecated":
550 case "record": // struct?
552 case "bitfield": // ignore?
554 case "prerequisite": // ignore?
556 case "union": // ignore?
559 print("UNHANDLED Gir file element: " + element->name +"\n");
563 if (element->name == "signal") {
568 if (element->name == "return-value") {
569 path += ".return-value";
571 print(path + ":" + element->name + "\n");
573 //var d = getAttribute(element,'doc');
575 // Seed.print(path + ':' + d);
578 for (Xml.Node* iter = element->children; iter != null; iter = iter->next) {
579 if (iter->type == Xml.ElementType.TEXT_NODE) {
582 this.walk(iter, parent);
586 public string doc(string what)
588 var ar = what.split(".");
589 var cls = this.classes.get(ar[1]);
590 if (ar.length == 2) {
591 return cls.doctxt != null ? cls.doctxt : "";
593 // return the property.. by default..
594 var pr = cls.props.get(ar[2]);
595 return pr.doctxt != null ? pr.doctxt : "";