+
+// valac TreeBuilder.vala --pkg libvala-0.24 --pkg posix -o /tmp/treebuilder
+
+/**
+ *
+ * This just deals with spawning the compiler and getting the results.
+ *
+ * each window should have one of these...
+ *
+ * x = new ValaSource();
+ * x.connect.compiled(... do something with results... );
+ *
+ * x.
+ *
+ */
+
+namespace Palete {
+
+ public errordomain ValaSourceError {
+ INVALID_FORMAT
+ }
+
+ //public delegate void ValaSourceResult(Json.Object res);
+
+
+
+ public class ValaSource : Object {
+
+
+ public signal void compiled(Json.Object res);
+ public signal void compile_output(string str);
+
+
+ JsRender.JsRender file;
+ public int line_offset = 0;
+
+ public Gee.ArrayList<Spawn> children;
+ public ValaSource( )
+ {
+ base();
+ this.compiler = null;
+ this.children = new Gee.ArrayList<Spawn>();
+
+ }
+ public void dumpCode(string str)
+ {
+ var ls = str.split("\n");
+ for (var i=0;i < ls.length; i++) {
+ print("%d : %s\n", i+1, ls[i]);
+ }
+ }
+
+ //public Gee.HashMap<int,string> checkFile()
+ //{
+ // return this.checkString(JsRender.NodeToVala.mungeFile(this.file));
+ //}
+
+ public bool checkFileWithNodePropChange(
+
+ JsRender.JsRender file,
+ JsRender.Node node,
+ string prop,
+ string ptype,
+ string val
+ )
+ {
+ this.file = file;
+
+ if (this.compiler != null) {
+ return false;
+ }
+
+
+ var hash = ptype == "listener" ? node.listeners : node.props;
+
+ // untill we get a smarter renderer..
+ // we have some scenarios where changing the value does not work
+ if (prop == "* xns" || prop == "xtype") {
+ return false;
+ }
+
+
+ var old = hash.get(prop);
+ var newval = "/*--VALACHECK-START--*/ " + val ;
+
+ hash.set(prop, newval);
+ var tmpstring = JsRender.NodeToVala.mungeFile(file);
+ hash.set(prop, old);
+ //print("%s\n", tmpstring);
+ var bits = tmpstring.split("/*--VALACHECK-START--*/");
+ var offset =0;
+ if (bits.length > 0) {
+ offset = bits[0].split("\n").length +1;
+ }
+
+ this.line_offset = offset;
+
+ //this.dumpCode(tmpstring);
+ //print("offset %d\n", offset);
+ return this.checkStringSpawn(tmpstring );
+
+ // modify report
+
+
+
+ }
+ Spawn compiler;
+
+ public bool checkStringSpawn(
+ string contents
+ )
+ {
+
+ if (this.compiler != null) {
+ return false;
+ }
+
+ FileIOStream iostream;
+ var tmpfile = File.new_tmp ("test-XXXXXX.vala", out iostream);
+ tmpfile.ref();
+
+ OutputStream ostream = iostream.output_stream;
+ DataOutputStream dostream = new DataOutputStream (ostream);
+ dostream.put_string (contents);
+
+ var valafn = "";
+ try {
+ var regex = new Regex("\\.bjs$");
+
+ valafn = regex.replace(this.file.path,this.file.path.length , 0 , ".vala");
+ } catch (GLib.RegexError e) {
+
+ return false;
+ }
+
+ string[] args = {};
+ args += BuilderApplication._self;
+ args += "--project";
+ args += this.file.project.fn;
+ args += "--target";
+ args += this.file.build_module;
+ args += "--add-file";
+ args += tmpfile.get_path();
+ args += "--skip-file";
+ args += valafn;
+
+
+
+ this.compiler = new Spawn("/tmp", args);
+ this.compiler.complete.connect(spawnResult);
+
+ try {
+ this.compiler.run();
+ } catch (GLib.SpawnError e) {
+ GLib.debug(e.message);
+ this.compiler = null;
+ return false;
+
+ }
+ return true;
+
+ }
+
+ public bool checkFileSpawn(JsRender.JsRender file )
+ {
+ // race condition..
+ if (this.compiler != null) {
+ return false;
+ }
+
+ this.file = file;
+ this.line_offset = 0;
+
+ string[] args = {};
+ args += BuilderApplication._self;
+ args += "--project";
+ args += this.file.project.fn;
+ args += "--target";
+ args += this.file.build_module;
+
+
+
+
+ try {
+ this.compiler = new Spawn("/tmp", args);
+ this.compiler.complete.connect(spawnResult);
+
+ this.compiler.run();
+
+
+ } catch (GLib.Error e) {
+ GLib.debug(e.message);
+ this.compiler = null;
+ return false;
+ }
+ return true;
+
+ }
+
+
+
+
+ public void spawnExecute(JsRender.JsRender file)
+ {
+ // race condition..
+ if (this.compiler != null) {
+ return;
+ }
+ if (!(file.project is Project.Gtk)) {
+ return;
+ }
+ var pr = (Project.Gtk)(file.project);
+
+
+ this.file = file;
+ this.line_offset = 0;
+
+ string[] args = {};
+ args += BuilderApplication._self;
+ args += "--project";
+ args += this.file.project.fn;
+ args += "--target";
+ if (this.file.build_module.length > 0 ) {
+ args += this.file.build_module;
+ } else {
+ args += pr.firstBuildModule();
+ }
+ args += "--output";
+ args += "/tmp/testrun";
+
+ // assume code is in home...
+ try {
+ this.compiler = new Spawn( GLib.Environment.get_home_dir(), args);
+ this.compiler.output_line.connect(compile_output_line);
+ this.compiler.complete.connect(runResult);
+ this.compiler.run();
+ this.children.add(this.compiler); //keep a reference...
+
+ } catch (GLib.Error e) {
+ GLib.debug(e.message);
+ this.compiler = null;
+
+ }
+ return;
+
+ }
+ public void compile_output_line( string str )
+ {
+ this.compile_output(str);
+ }
+ /**
+ * Used to compile a non builder file..
+ */
+
+ public bool checkPlainFileSpawn( JsRender.JsRender file, string contents )
+ {
+ // race condition..
+ if (this.compiler != null) {
+ return false;
+ }
+ var pr = (Project.Gtk)(file.project);
+
+ var m = pr.firstBuildModule();
+ var cg = pr.compilegroups.get(m);
+ var foundit = false;
+ for (var i = 0; i < cg.sources.size; i++) {
+ var path = pr.resolve_path(
+ pr.resolve_path_combine_path(pr.firstPath(),cg.sources.get(i)));
+ if (path == file.path) {
+ foundit = true;
+ break;
+ }
+
+ }
+ if (!foundit) {
+
+ this.compiler = null;
+
+ return false; // do not run the compile..
+ }
+ // is the file in the module?
+
+
+ FileIOStream iostream;
+ var tmpfile = File.new_tmp ("test-XXXXXX.vala", out iostream);
+ tmpfile.ref();
+
+ OutputStream ostream = iostream.output_stream;
+ DataOutputStream dostream = new DataOutputStream (ostream);
+ dostream.put_string (contents);
+
+
+ this.file = null;
+ this.line_offset = 0;
+
+ string[] args = {};
+ args += BuilderApplication._self;
+ args += "--project";
+ args += file.project.fn;
+ args += "--target";
+ args += pr.firstBuildModule();
+ args += "--add-file";
+ args += tmpfile.get_path();
+ args += "--skip-file";
+ args += file.path;
+
+
+
+
+ try {
+ this.compiler = new Spawn("/tmp", args);
+ this.compiler.complete.connect(spawnResult);
+ this.compiler.run();
+ } catch (GLib.Error e) {
+
+ this.compiler = null;
+ return false;
+ }
+ return true;
+
+ }
+
+
+ public void spawnResult(int res, string output, string stderr)
+ {
+
+
+ try {
+ //GLib.debug("GOT output %s", output);
+
+ var pa = new Json.Parser();
+ pa.load_from_data(output);
+ var node = pa.get_root();
+
+ if (node.get_node_type () != Json.NodeType.OBJECT) {
+ var ret = new Json.Object();
+ ret.set_boolean_member("success", false);
+ ret.set_string_member("message",
+ "Compiler returned Unexpected element type %s".printf(
+ node.type_name ()
+ )
+ );
+ this.compiled(ret);
+ this.compiler = null;
+ }
+ var ret = node.get_object ();
+ ret.set_int_member("line_offset", this.line_offset);
+
+ this.compiled(ret);
+
+
+ } catch (GLib.Error e) {
+ var ret = new Json.Object();
+ ret.set_boolean_member("success", false);
+ ret.set_string_member("message", e.message);
+ this.compiled(ret);
+ }
+ this.compiler = null;
+ //compiler.unref();
+ //tmpfile.unref();
+
+
+
+ }
+
+ public void runResult(int res, string output, string stderr)
+ {
+ this.compiler = null;
+ print("OUT: %s\n\n----\nERR:%s", output, stderr);
+ var exec = new Spawn("/tmp", { "/tmp/testrun" });
+ exec.detach = true;
+ exec.run();
+
+ }
+ }
+
+}
+/*
+int main (string[] args) {
+
+ var a = new ValaSource(file);
+ a.create_valac_tree();
+ return 0;
+}
+*/
+
+