18eb199fc7dda34d3ba46dddd315efd9ce1853a1
[app.Builder.js] / Palete / Gir.vala
1
2 // valac --pkg libxml-2.0 --pkg gee-1.0  Gir.vala -o /tmp/Gir
3 public static int main (string[] args) {
4     
5     var g = new Palete.Gir("/usr/share/gir-1.0/Gtk-3.0.gir");
6     
7     return 0;
8 }
9
10 namespace Palete {
11
12     public class GirObject: Object {
13         public string name;
14         public string type;
15         public string nodetype;
16         public GirObject paramset;
17         public string  package;
18         public GirObject return_value = null;
19         public bool is_instance;
20         public bool is_array;
21         public  string parent;
22          public Gee.HashMap<string,GirObject> params;
23         public GLib.List<string> implements;
24         public GLib.List<GirObject> ctors;
25         public Gee.HashMap<string,GirObject> methods;
26          public Gee.HashMap<string,string> includes;
27         public Gee.HashMap<string,GirObject> classes;
28        
29         public GirObject(string nodetype, string n) {
30             this.nodetype = nodetype;
31             this.name = n;
32              this.params = new Gee.HashMap<string,GirObject>();
33             this.type = "";
34             this.is_instance = false;
35              this.implements = new GLib.List<string>();
36             this.ctors = new GLib.List<GirObject>();
37             this.methods =new Gee.HashMap<string,GirObject>();
38              this.includes = new Gee.HashMap<string,string>();
39             this.classes= new Gee.HashMap<string,GirObject>();
40             
41         }
42     
43     }
44     
45      
46     
47     
48     
49     public class Gir : GirObject {
50     
51          public string  package;
52         
53         
54         //Gee.Hashmap<string,what> nodes;
55     
56         public Gir (string file)
57         {
58             base("Package",file);
59             //this.nodes = new Gee.Hashmap<string,what>();
60              
61             var doc = Xml.Parser.parse_file (file);
62             var root = doc->get_root_element();
63             this.walk( root, (GirObject) this );
64             delete doc;
65         
66         }
67         public void walk(Xml.Node* element, GirObject? parent)
68         {
69             var n = element->get_prop("name");
70             if (n == null) {
71                 n = "";
72             }
73             print(element->name + " ("  + parent.name + "==>" + n +")\n");
74             switch (element->name) {
75                 case "repository":
76                     break;
77                 
78                 case "include":
79                     parent.includes.set(n, element->get_prop("version"));
80                     break;
81                 
82                 case "package":
83                     parent.package = n;
84                     break;
85                 
86                 case "c:include":
87                     break;
88                 
89                 case "namespace":
90                     parent.name = n;
91                     break;
92                 
93                 case "alias":
94                     return;
95                     //break; // not handled..
96                 
97                 case "class":
98                     var c = new GirObject("Class", parent.name + "." + n);
99                     parent.classes.set(parent.name + "." + n, c);
100                     c.parent = element->get_prop("parent");
101                     parent =  c;
102                     break;
103                 
104                 case "doc":
105                     return;
106                 
107                 case "implements":
108                     parent.implements.append(n);
109                     break;
110                 
111                 case "constructor":
112                     var c = new GirObject("Ctor",n);
113                     parent.ctors.append(c);
114                     parent  = (GirObject)c;
115                     break;
116                 
117                 case "return-value":
118                     var c = new GirObject("Return", "return-value");
119                     parent.return_value = c;
120                     parent = (GirObject)c;
121                     break;
122                 
123                 case "virtual-method":
124                     return;
125                 
126                 case "type":
127                     parent.type = n;
128                     return; // no children?
129                     //break;
130                 
131                 case "method":
132                     var c = new GirObject("Method",n);
133                     parent.methods.set(n,c);
134                     parent = c;
135                     break;
136                 
137                 case "parameters":
138                     var c = new GirObject("Paramset",n);
139                     parent.paramset = c;
140                     parent =  c;
141                     break;
142                 
143                 case "instance-parameter":
144                     var c = new GirObject("Param",n);
145                     c.is_instance = true;
146                     parent.params.set(n,c);
147                     parent = c;
148                     break;
149                 
150                 case "parameter":
151                     var c = new GirObject("Param",n);
152                     parent.params.set(n,c);
153                     parent = c;
154                     break;
155                 
156                 case "function":
157                     var c = new GirObject("Function",n);
158                     parent.methods.set(n,c);
159                     parent = c;
160                     break;
161                 
162                 case "array":
163                     parent.is_array = true;
164                      
165                     break;
166                 
167                 default:
168                     print("UNHANDLED" + element->name +"\n");
169                     return;
170             }
171             /*
172             if (element->name == "signal") {
173                 path += ".signal";
174             }
175             
176             
177             if (element->name == "return-value") {
178                 path += ".return-value";
179             }
180             print(path + ":"  + element->name + "\n");
181             */
182             //var d =   getAttribute(element,'doc');
183             //if (d) {
184              //   Seed.print(path + ':' + d);
185             //    ret[path] = d;
186             //}
187             for (Xml.Node* iter = element->children; iter != null; iter = iter->next) {
188                 if (iter->type == Xml.ElementType.TEXT_NODE) {
189                     continue;
190                 }
191                 this.walk(iter, parent);
192             }
193             
194         }
195         
196     
197     
198     } 
199         
200 }