2 * This is the old Gir File based API parser..
9 public class GirFile : Gir {
11 public GirFile (string ns)
13 var xns = ns == "Glade" ? "Gladeui" : ns;
14 var gi = GI.Repository.get_default();
15 gi.require(xns, null, 0);
17 var ver = gi.get_version(xns);
18 unowned GLib.SList<string> pth = GI.Repository.get_search_path ();
19 var gir_path = pth.nth_data(0).replace("/lib/girepository-1.0", "/share/gir-1.0");
21 gir_path = gir_path.replace("/lib/x86_64-linux-gnu/girepository-1.0", "/share/gir-1.0");
27 var file = gir_path + "/" + xns + "-" + ver + ".gir";
28 // print("ns: " + ns + "\n");
29 // print("ver: " + ver + "\n");
35 //this.nodes = new Gee.Hashmap<string,what>();
37 var doc = Xml.Parser.parse_file (file);
38 var root = doc->get_root_element();
39 this.walk( root, (GirObject) this );
45 public void walk(Xml.Node* element, GirObject? parent)
47 var n = element->get_prop("name");
48 // ignore null or c:include...
49 if (n == null || (element->ns->prefix != null && element->ns->prefix == "c")) {
52 //print("%s:%s (%s ==> %s\n", element->ns->prefix , element->name , parent.name , n);
53 switch (element->name) {
58 parent.includes.set(n, element->get_prop("version"));
74 //break; // not handled..
77 var c = new GirObject("Class", parent.name + "." + n);
78 parent.classes.set(n, c);
80 c.parent = element->get_prop("parent");
82 if (c.parent == null) {
89 var c = new GirObject("Interface", parent.name + "." + n);
91 parent.classes.set(n, c);
94 c.parent = element->get_prop("parent");
95 if (c.parent == null) {
103 parent.doctxt = element->get_content();
107 parent.implements.add(n);
112 var c = new GirObject("Ctor",n);
115 parent.ctors.set(n,c);
120 var c = new GirObject("Return", "return-value");
123 parent.return_value = c;
127 case "virtual-method": // not sure...
130 var c = new GirObject("Signal",n);
131 parent.signals.set(n,c);
135 case "signal": // Glib:signal
136 var c = new GirObject("Signal",n.replace("-", "_"));
139 parent.signals.set(n.replace("-", "_"),c);
145 case "callback": // not sure...
152 return; // no children?
156 var c = new GirObject("Method",n);
159 c.propertyof = parent.name;
160 parent.methods.set(n,c);
165 var c = new GirObject("Paramset",n);
172 case "instance-parameter":
174 // looks like this is the C first arg, that is ignored (as it is
175 // treated as 'this' )
176 var c = new GirObject("Param",n);
179 c.is_instance = true;
180 parent.params.add(c);
185 var c = new GirObject("Param",n);
188 parent.params.add(c);
190 this.checkParamOverride(c);
195 var c = new GirObject("Prop",n.replace("-", "_"));
198 c.propertyof = parent.name;
199 parent.props.set(n.replace("-", "_"),c);
204 var c = new GirObject("Function",n);
207 parent.methods.set(n,c);
212 parent.is_array = true;
213 break; // type is added soon..
216 parent.is_varargs= true;
220 var c = new GirObject("Const",n);
222 c.value = element->get_prop("value");
224 parent.consts.set(n,c);
230 var c = new GirObject("Enum",n);
233 parent.consts.set(n,c);
239 var c = new GirObject("EnumMember",n);
242 c.value = element->get_prop("value");
243 parent.consts.set(n,c);
248 case "doc-deprecated":
251 case "record": // struct?
256 case "prerequisite": // ignore?
258 case "union": // ignore?
261 print("UNHANDLED Gir file element: " + element->name +"\n");
265 if (element->name == "signal") {
270 if (element->name == "return-value") {
271 path += ".return-value";
273 print(path + ":" + element->name + "\n");
275 //var d = getAttribute(element,'doc');
277 // Seed.print(path + ':' + d);
280 for (Xml.Node* iter = element->children; iter != null; iter = iter->next) {
281 if (iter->type == Xml.ElementType.TEXT_NODE) {
284 this.walk(iter, parent);
288 public void loadOverrides(bool force = false)
290 if (overrides_loaded && ! force) {
294 var pa = new Json.Parser();
295 pa.load_from_file(BuilderApplication.configDirectory() + "/resources/Gir.overides");
296 var node = pa.get_root();
298 if (node.get_node_type () != Json.NodeType.OBJECT) {
299 throw new GirError.INVALID_FORMAT ("Error loading gir.overides : Unexpected element type %s", node.type_name ());
301 overrides = new Gee.HashMap<string,string>();
304 var obj = node.get_object ();
307 obj.foreach_member((o , key, value) => {
310 var v = obj.get_string_member(key);
313 overrides.set(key, v);
317 overrides_loaded = true;