2 // valac TreeBuilder.vala --pkg libvala-0.24 --pkg posix -o /tmp/treebuilder
6 * This just deals with spawning the compiler and getting the results.
8 * each window should have one of these...
10 * x = new ValaSource();
11 * x.connect.compiled(... do something with results... );
19 public errordomain ValaSourceError {
23 //public delegate void ValaSourceResult(Json.Object res);
27 public class ValaSource : Object {
30 public signal void compiled(Json.Object res);
33 JsRender.JsRender file;
34 public int line_offset = 0;
41 public void dumpCode(string str)
43 var ls = str.split("\n");
44 for (var i=0;i < ls.length; i++) {
45 print("%d : %s\n", i+1, ls[i]);
49 //public Gee.HashMap<int,string> checkFile()
51 // return this.checkString(JsRender.NodeToVala.mungeFile(this.file));
54 public bool checkFileWithNodePropChange(
56 JsRender.JsRender file,
65 if (this.compiler != null) {
70 var hash = ptype == "listener" ? node.listeners : node.props;
72 // untill we get a smarter renderer..
73 // we have some scenarios where changing the value does not work
74 if (prop == "* xns" || prop == "xtype") {
79 var old = hash.get(prop);
80 var newval = "/*--VALACHECK-START--*/ " + val ;
82 hash.set(prop, newval);
83 var tmpstring = JsRender.NodeToVala.mungeFile(file);
85 //print("%s\n", tmpstring);
86 var bits = tmpstring.split("/*--VALACHECK-START--*/");
88 if (bits.length > 0) {
89 offset = bits[0].split("\n").length +1;
92 this.line_offset = offset;
94 //this.dumpCode(tmpstring);
95 //print("offset %d\n", offset);
96 return this.checkStringSpawn(tmpstring );
105 public bool checkStringSpawn(
110 if (this.compiler != null) {
114 FileIOStream iostream;
115 var tmpfile = File.new_tmp ("test-XXXXXX.vala", out iostream);
118 OutputStream ostream = iostream.output_stream;
119 DataOutputStream dostream = new DataOutputStream (ostream);
120 dostream.put_string (contents);
124 var regex = new Regex("\\.bjs$");
126 valafn = regex.replace(this.file.path,this.file.path.length , 0 , ".vala");
127 } catch (GLib.RegexError e) {
133 args += BuilderApplication._self;
135 args += this.file.project.fn;
137 args += this.file.build_module;
138 args += "--add-file";
139 args += tmpfile.get_path();
140 args += "--skip-file";
145 this.compiler = new Spawn("/tmp", args);
146 this.compiler.complete.connect(spawnResult);
150 } catch (GLib.SpawnError e) {
151 GLib.debug(e.message);
152 this.compiler = null;
160 public bool checkFileSpawn(JsRender.JsRender file )
163 if (this.compiler != null) {
168 this.line_offset = 0;
171 args += BuilderApplication._self;
173 args += this.file.project.fn;
175 args += this.file.build_module;
181 this.compiler = new Spawn("/tmp", args);
182 this.compiler.complete.connect(spawnResult);
187 } catch (GLib.Error e) {
188 GLib.debug(e.message);
189 this.compiler = null;
196 public void spawnExecute(JsRender.JsRender file)
199 if (this.compiler != null) {
202 var pr = (Project.Gtk)(file.project);
206 this.line_offset = 0;
209 args += BuilderApplication._self;
211 args += this.file.project.fn;
213 if (this.file.build_module.length > 0 ) {
214 args += this.file.build_module;
216 args += pr.firstBuildModule();
219 args += "/tmp/testrun";
223 this.compiler = new Spawn(pr.firstPath(), args);
224 this.compiler.complete.connect(spawnResult);
229 } catch (GLib.Error e) {
230 GLib.debug(e.message);
231 this.compiler = null;
240 * Used to compile a non builder file..
243 public bool checkPlainFileSpawn( JsRender.JsRender file, string contents )
246 if (this.compiler != null) {
249 var pr = (Project.Gtk)(file.project);
251 var m = pr.firstBuildModule();
252 var cg = pr.compilegroups.get(m);
254 for (var i = 0; i < cg.sources.size; i++) {
255 var path = pr.resolve_path(
256 pr.resolve_path_combine_path(pr.firstPath(),cg.sources.get(i)));
257 if (path == file.path) {
265 this.compiler = null;
267 return false; // do not run the compile..
269 // is the file in the module?
272 FileIOStream iostream;
273 var tmpfile = File.new_tmp ("test-XXXXXX.vala", out iostream);
276 OutputStream ostream = iostream.output_stream;
277 DataOutputStream dostream = new DataOutputStream (ostream);
278 dostream.put_string (contents);
282 this.line_offset = 0;
285 args += BuilderApplication._self;
287 args += file.project.fn;
289 args += pr.firstBuildModule();
290 args += "--add-file";
291 args += tmpfile.get_path();
292 args += "--skip-file";
299 this.compiler = new Spawn("/tmp", args);
300 this.compiler.complete.connect(spawnResult);
302 } catch (GLib.Error e) {
304 this.compiler = null;
312 public void spawnResult(int res, string output, string stderr)
317 //GLib.debug("GOT output %s", output);
319 var pa = new Json.Parser();
320 pa.load_from_data(output);
321 var node = pa.get_root();
323 if (node.get_node_type () != Json.NodeType.OBJECT) {
324 var ret = new Json.Object();
325 ret.set_boolean_member("success", false);
326 ret.set_string_member("message",
327 "Compiler returned Unexpected element type %s".printf(
332 this.compiler = null;
334 var ret = node.get_object ();
335 ret.set_int_member("line_offset", this.line_offset);
340 } catch (GLib.Error e) {
341 var ret = new Json.Object();
342 ret.set_boolean_member("success", false);
343 ret.set_string_member("message", e.message);
346 this.compiler = null;
357 int main (string[] args) {
359 var a = new ValaSource(file);
360 a.create_valac_tree();