2 // valac TreeBuilder.vala --pkg libvala-0.24 --pkg posix -o /tmp/treebuilder
5 * this only deals with the compiling (when builder is run with different args..)
13 public class ValaSourceReport : Vala.Report {
15 public string filepath;
17 public string tmpname;
19 //public Gee.ArrayList<ValaSourceNotice> notices;
20 public Json.Object result;
22 //public Gee.HashMap<int,string> line_errors;
24 public void compile_notice(string type, string filename, int line, string message) {
26 if (!this.result.has_member(type+"-TOTAL")) {
27 this.result.set_int_member(type+"-TOTAL", 1);
29 this.result.set_int_member(type+"-TOTAL",
30 this.result.get_int_member(type+"-TOTAL") +1
35 if (!this.result.has_member(type)) {
36 this.result.set_object_member(type, new Json.Object());
38 var t = this.result.get_object_member(type);
39 if (!t.has_member(filename)) {
40 t.set_object_member(filename, new Json.Object());
42 var tt = t.get_object_member(filename);
43 if (!tt.has_member(line.to_string())) {
44 tt.set_array_member(line.to_string(), new Json.Array());
46 var tl = tt.get_array_member(line.to_string());
47 tl.add_string_element(message);
53 public ValaSourceReport(string filepath, string tmpname)
56 this.filepath = filepath;
57 this.tmpname = tmpname;
58 this.result = new Json.Object();
59 this.result.set_boolean_member("success", true);
60 this.result.set_string_member("message", "");
64 //this.line_errors = new Gee.HashMap<int,string> ();
65 //this.notices = new Gee.ArrayList<ValaSourceNotice>();
68 public override void warn (Vala.SourceReference? source, string message) {
72 //stderr.printf ("My error: %s\n", message);
75 if (source.file.filename != this.tmpname) {
76 this.compile_notice("WARN", source.file.filename , source.begin.line, message);
79 this.compile_notice("WARN", this.filepath, source.begin.line, message);
82 public override void depr (Vala.SourceReference? source, string message) {
86 //stderr.printf ("My error: %s\n", message);
89 if (source.file.filename != this.tmpname) {
90 this.compile_notice("DEPR", source.file.filename, source.begin.line, message);
93 this.compile_notice("DEPR", this.filepath, source.begin.line, message);
97 public override void err (Vala.SourceReference? source, string message) {
101 //stderr.printf ("My error: %s\n", message);
103 if (source.file.filename != this.tmpname) {
104 this.compile_notice("ERR", source.file.filename, source.begin.line, message);
105 GLib.debug ("Other file: Got error error: %d: %s\n", source.begin.line, message);
110 this.compile_notice("ERR", this.filepath, source.begin.line, message);
111 GLib.debug ("Test file: Got error error: %d: %s\n", source.begin.line, message);
116 var iter = this.line_errors.map_iterator();
117 while (iter.next()) {
118 print ("%d : %s\n\n", iter.get_key(), iter.get_value());
125 public class ValaSourceCompiler : Object {
127 public static void jerr(string str)
129 var ret = new Json.Object();
130 ret.set_boolean_member("success", false);
131 ret.set_string_member("message", str);
133 var generator = new Json.Generator ();
134 var root = new Json.Node(Json.NodeType.OBJECT);
135 root.init_object(ret);
136 generator.set_root (root);
138 generator.pretty = true;
139 generator.indent = 4;
142 print("%s\n", generator.to_data (null));
143 GLib.Process.exit(Posix.EXIT_FAILURE);
147 public static void buildApplication()
149 //print("build based on Application settings\n");
151 if (BuilderApplication.opt_compile_target == null) {
152 jerr("missing compile target --target");
155 Project.Project.loadAll();
156 var proj = Project.Project.getProjectByHash(BuilderApplication.opt_compile_project);
159 jerr("could not load test project %s".printf( BuilderApplication.opt_compile_project));
162 if (proj.xtype != "Gtk") {
163 jerr("%s is not a Gtk Project".printf( BuilderApplication.opt_compile_project));
165 var gproj = (Project.Gtk)proj;
168 if (!gproj.compilegroups.has_key(BuilderApplication.opt_compile_target)) {
169 jerr("missing compile target %s".printf(BuilderApplication.opt_compile_target));
172 if (BuilderApplication.opt_compile_skip != null) {
173 skip_file = BuilderApplication.opt_compile_skip;
176 if (BuilderApplication.opt_compile_add != null) {
177 add_file = BuilderApplication.opt_compile_add;
181 var vs = new ValaSourceCompiler(gproj, add_file, BuilderApplication.opt_compile_target, skip_file);
182 if (BuilderApplication.opt_compile_output != null) {
183 vs.output = BuilderApplication.opt_compile_output;
190 Vala.CodeContext context;
191 ValaSourceReport report;
193 public string build_module;
194 public string filepath;
195 public string original_filepath;
196 public int line_offset = 0;
197 public string output;
199 // file.project , file.path, file.build_module, ""
200 public ValaSourceCompiler(Project.Gtk project, string filepath, string build_module, string original_filepath) {
203 this.filepath = filepath;
204 this.build_module = build_module;
205 this.original_filepath = original_filepath;
206 this.project = project;
210 public void dumpCode(string str)
212 var ls = str.split("\n");
213 for (var i=0;i < ls.length; i++) {
214 print("%d : %s\n", i+1, ls[i]);
220 public void compile( )
223 var valac = "valac " ;
225 context = new Vala.CodeContext ();
226 Vala.CodeContext.push (context);
228 context.experimental = false;
229 context.experimental_non_null = false;
241 for (int i = 2; i <= ver; i += 2) {
242 context.add_define ("VALA_0_%d".printf (i));
248 var vapidirs = this.project.vapidirs();
249 // order is important ...
250 vapidirs += Path.get_dirname (context.get_vapi_path("gee-1.0")) ; //usr/share/vala/vapi
251 vapidirs += Path.get_dirname (context.get_vapi_path("glib-2.0")) ; // usr/share/vala-XXX/vapi
253 for(var i =0 ; i < vapidirs.length; i++) {
254 valac += " --vapidir=" + vapidirs[i];
258 context.vapi_directories = vapidirs;
259 context.report.enable_warnings = true;
260 context.metadata_directories = { };
261 context.gir_directories = {};
262 context.thread = true;
263 valac += " --thread ";
266 this.report = new ValaSourceReport(this.original_filepath, this.filepath);
267 context.report = this.report;
270 context.basedir = "/tmp"; //Posix.realpath (".");
272 context.directory = context.basedir;
275 // add default packages:
276 //if (settings.profile == "gobject-2.0" || settings.profile == "gobject" || settings.profile == null) {
277 context.profile = Vala.Profile.GOBJECT;
279 var ns_ref = new Vala.UsingDirective (new Vala.UnresolvedSymbol (null, "GLib", null));
280 context.root.add_using_directive (ns_ref);
282 var source_file = new Vala.SourceFile (
284 Vala.SourceFileType.SOURCE,
287 source_file.add_using_directive (ns_ref);
288 context.add_source_file (source_file);
290 // add all the files (except the current one) - this.file.path
291 var pr = this.project;
292 if (this.build_module.length > 0) {
293 var cg = pr.compilegroups.get(this.build_module);
294 for (var i = 0; i < cg.sources.size; i++) {
295 var path = pr.resolve_path(
296 pr.resolve_path_combine_path(pr.firstPath(),cg.sources.get(i)));
298 if (!FileUtils.test(path, FileTest.EXISTS)) {
301 // skip thie original
302 if (path == this.original_filepath) {
306 if (FileUtils.test(path, FileTest.IS_DIR)) {
309 //print("Add source file %s\n", path);
313 if (Regex.match_simple("\\.c$", path)) {
314 context.add_c_source_file(path);
319 var xsf = new Vala.SourceFile (
321 Vala.SourceFileType.SOURCE,
324 xsf.add_using_directive (ns_ref);
325 context.add_source_file(xsf);
329 // default.. packages..
330 context.add_external_package ("glib-2.0");
331 context.add_external_package ("gobject-2.0");
332 // user defined ones..
334 var dcg = pr.compilegroups.get("_default_");
335 for (var i = 0; i < dcg.packages.size; i++) {
336 valac += " --pkg " + dcg.packages.get(i);
337 if (!this.has_vapi(context.vapi_directories, dcg.packages.get(i))) {
338 GLib.debug("Skip vapi '%s' - does not exist", dcg.packages.get(i));
342 context.add_external_package (dcg.packages.get(i));
345 //Vala.Config.PACKAGE_SUFFIX.substring (1)
347 // add the modules...
349 context.output = this.output == "" ? "/tmp/testbuild" : this.output;
350 valac += " -o " +context.output;
351 GLib.debug("%s", valac);
353 context.target_glib_major = 2;
354 context.target_glib_minor = 32;
355 valac += " --target-glib=2.32 ";
357 //add_documented_files (context, settings.source_files);
359 Vala.Parser parser = new Vala.Parser ();
360 parser.parse (context);
361 //gir_parser.parse (context);
362 if (context.report.get_errors () > 0) {
363 Vala.CodeContext.pop ();
364 GLib.debug("parse got errors");
365 //((ValaSourceReport)context.report).dump();
366 this.report.result.set_boolean_member("success", false);
367 this.report.result.set_string_member("message", "Parse failed");
377 if (context.report.get_errors () > 0) {
378 Vala.CodeContext.pop ();
379 GLib.debug("check got errors");
380 //((ValaSourceReport)context.report).dump();
381 this.report.result.set_boolean_member("success", false);
382 this.report.result.set_string_member("message", "Check failed");
388 if (this.output == "") {
389 Vala.CodeContext.pop ();
394 context.codegen = new Vala.GDBusServerModule ();
398 context.codegen.emit (context);
400 var ccompiler = new Vala.CCodeCompiler ();
401 var cc_command = Environment.get_variable ("CC");
402 var pkg_config_command = Environment.get_variable ("PKG_CONFIG");
404 ccompiler.compile (context, cc_command, new string[] { }, pkg_config_command);
406 ccompiler.compile (context, cc_command, new string[] { });
410 Vala.CodeContext.pop ();
414 public bool has_vapi(string[] dirs, string vapi)
416 for(var i =0 ; i < dirs.length; i++) {
417 GLib.debug("check VAPI - %s", dirs[i] + "/" + vapi + ".vapi");
418 if (!FileUtils.test( dirs[i] + "/" + vapi + ".vapi", FileTest.EXISTS)) {
427 public void outputResult()
429 var generator = new Json.Generator ();
430 generator.indent = 1;
431 generator.pretty = true;
432 var node = new Json.Node(Json.NodeType.OBJECT);
433 node.set_object(this.report.result);
435 generator.set_root(node);
437 generator.pretty = true;
438 generator.indent = 4;
441 print("%s\n", generator.to_data (null));
442 GLib.Process.exit(Posix.EXIT_SUCCESS);
449 public Gee.HashMap<int,string> checkString(string contents)
452 var valac = "valac " ;
454 context = new Vala.CodeContext ();
455 Vala.CodeContext.push (context);
457 context.experimental = false;
458 context.experimental_non_null = false;
470 for (int i = 2; i <= ver; i += 2) {
471 context.add_define ("VALA_0_%d".printf (i));
480 var vapidirs = ((Project.Gtk)this.file.project).vapidirs();
481 // what's the current version of vala???
484 vapidirs += Path.get_dirname (context.get_vapi_path("glib-2.0")) ;
486 for(var i =0 ; i < vapidirs.length; i++) {
487 valac += " --vapidir=" + vapidirs[i];
491 // or context.get_vapi_path("glib-2.0"); // should return path..
492 context.vapi_directories = vapidirs;
493 context.report.enable_warnings = true;
494 context.metadata_directories = { };
495 context.gir_directories = {};
496 context.thread = true;
499 this.report = new ValaSourceReport(this.file.path);
500 context.report = this.report;
503 context.basedir = "/tmp"; //Posix.realpath (".");
505 context.directory = context.basedir;
508 // add default packages:
509 //if (settings.profile == "gobject-2.0" || settings.profile == "gobject" || settings.profile == null) {
510 context.profile = Vala.Profile.GOBJECT;
512 var ns_ref = new Vala.UsingDirective (new Vala.UnresolvedSymbol (null, "GLib", null));
513 context.root.add_using_directive (ns_ref);
515 var source_file = new Vala.SourceFile (
517 Vala.SourceFileType.SOURCE,
518 "~~~~~testfile.vala",
521 source_file.add_using_directive (ns_ref);
522 context.add_source_file (source_file);
524 // add all the files (except the current one) - this.file.path
525 var pr = ((Project.Gtk)this.file.project);
526 if (this.file.build_module.length > 0) {
527 var cg = pr.compilegroups.get(this.file.build_module);
528 for (var i = 0; i < cg.sources.size; i++) {
529 var path = pr.resolve_path(
530 pr.resolve_path_combine_path(pr.firstPath(),cg.sources.get(i)));
532 if (!FileUtils.test(path, FileTest.EXISTS)) {
536 if (path == this.file.path.replace(".bjs", ".vala")) {
540 if (FileUtils.test(path, FileTest.IS_DIR)) {
543 //print("Add source file %s\n", path);
547 if (Regex.match_simple("\\.c$", path)) {
548 context.add_c_source_file(path);
553 var xsf = new Vala.SourceFile (
555 Vala.SourceFileType.SOURCE,
558 xsf.add_using_directive (ns_ref);
559 context.add_source_file(xsf);
563 // default.. packages..
564 context.add_external_package ("glib-2.0");
565 context.add_external_package ("gobject-2.0");
566 // user defined ones..
568 var dcg = pr.compilegroups.get("_default_");
569 for (var i = 0; i < dcg.packages.size; i++) {
570 valac += " --pkg " + dcg.packages.get(i);
571 context.add_external_package (dcg.packages.get(i));
574 //Vala.Config.PACKAGE_SUFFIX.substring (1)
576 // add the modules...
580 //context.add_external_package ("libvala-0.24");
582 this.report.compile_notice("START", "", 0, "");
585 //add_documented_files (context, settings.source_files);
587 Vala.Parser parser = new Vala.Parser ();
588 parser.parse (context);
589 //gir_parser.parse (context);
590 if (context.report.get_errors () > 0) {
591 print("parse got errors");
592 ((ValaSourceReport)context.report).dump();
594 Vala.CodeContext.pop ();
595 this.report.compile_notice("END", "", 0, "");
596 return this.report.line_errors;
603 if (context.report.get_errors () > 0) {
604 print("check got errors");
605 ((ValaSourceReport)context.report).dump();
606 Vala.CodeContext.pop ();
607 this.report.compile_notice("END", "", 0, "");
608 return this.report.line_errors;
612 //context.codegen = new Vala.GDBusServerModule ();
615 context.output = "/tmp/testbuild";
616 valac += " -o " +context.output;
617 //context.codegen.emit (context);
619 //(new Vala.CodeNode()).get_error_types().clear();
620 //(new Vala.NullType()).get_type_arguments().clear();
621 (new Vala.NullType(null)).get_type_arguments().clear();
623 this.report.compile_notice("END", "", 0, "");
624 print("%s\n", valac);
626 return this.report.line_errors;
635 int main (string[] args) {
637 var a = new ValaSource(file);
638 a.create_valac_tree();