src/jsdoc/Packer.vala
[roojspacker] / src / jsdoc / Packer.vala
index e1ae289..2d87e8a 100644 (file)
@@ -81,41 +81,12 @@ namespace JSDOC
                 *  we could do this in memory now, as I suspect vala will not be as bad as javascript for leakage...
                 *
                 */
-               public string tmpDir = "/tmp";  // FIXME??? in ctor?
+               //public string tmpDir = "/tmp";  // FIXME??? in ctor?
        
-       
-                 
-               /**
-                * @cfg {Boolean} cleanup  (optional) clean up temp files after done - 
-                *    Defaults to false if you set tmpDir, otherwise true.
-                */
-               public bool cleanup =  false;
-               
-               
-               /**
-                * @cfg {Boolean} keepWhite (optional) do not remove white space in output.
-                *    usefull for debugging compressed files.
-                */
-               
-               public bool keepWhite =  false;
-                       
-               /**
-                * @cfg {Boolean} skipScope (optional) skip Scope parsing and replacement.
-                *    usefull for debugging...
-                */
-               
-               public bool skipScope = false;
-               
-               
-               /**
-                * @cfg {Boolean} dumpTokens (optional) read the first file and dump the tokens.
-                *    usefull for debugging...
-                */
-               
-               public bool dumpTokens = false;
-               
+        
+                
                // list of files to compile...
-               Gee.ArrayList<string> files;
+               public Gee.ArrayList<string> files;
                
                /**
                * @cfg activeFile ??? used???
@@ -124,31 +95,49 @@ namespace JSDOC
                public string activeFile = "";
                
                        
-               /**
-               * @cfg baseDir -- prefix the files listed in indexfiles with this.
-               */
-                
-               public string baseDir = "";
-               
-               
+                       
                public  string outstr = ""; // if no target is specified - then this will contain the result
                
                
+               public PackerRun config;
                
-               
-               public Packer()
+               public Packer(PackerRun config)
                {
+                       this.config = PackerRun;
+#if HAVE_JSON_GLIB
                        this.result = new Json.Object();
+#else
+                       this.result_count = new  Gee.HashMap <string,int>();
+               
+                       this.result =  new Gee.HashMap<
+                               string /* errtype*/ , Gee.HashMap<string /*fn*/,     Gee.HashMap<int /*line*/, Gee.ArrayList<string>>>
+                       >();
+       
+#endif                 
                        this.files = new Gee.ArrayList<string>();
                        
                        new Lang_Class(); ///initilizaze lang..
+                       
+                       //this.tmp = Glib.get_tmp_dir(); // do we have to delete this?
+                       
                         
                }
                
                
                // this could be another class really..
                
-               public enum ResultType { err , warn  }
+               public enum ResultType { 
+                       err , 
+                       warn;
+                       public string to_string() { 
+                               switch(this) {
+                                       case err: return "ERR";
+                                       case warn: return "WARN";
+                                       default: assert_not_reached();
+                               }
+                       
+                         }
+                 }
                /**
                *  result of complication - a JSON object containing warnings / errors etc..
                *  FORMAT:
@@ -162,6 +151,7 @@ namespace JSDOC
                *
                */
                
+#if HAVE_JSON_GLIB
                
                public Json.Object result;   // output - what's the complication result
 
@@ -192,9 +182,18 @@ namespace JSDOC
                         
                }
                
-               public bool hasErrors()
+               public bool hasErrors(string fn)
                {
-                        if (this.result.has_member(ResultType.err.to_string())) {
+                        if (!this.result.has_member(ResultType.err.to_string())) {
+                                return false;
+                        }
+                        
+                        if (fn.length < 1) {
+                               return true;
+                        }
+                        var t = this.result.get_object_member(ResultType.err.to_string());
+                        
+                        if (t.has_member(fn)) {
                                 return true;
                         }
                         return false;
@@ -210,14 +209,86 @@ namespace JSDOC
                                        linelist.foreach_member((linelistobj, linestr, nodear) => {
                                                var errors=  nodear.dup_array();
                                                errors.foreach_element((errorar, ignore, nodestr) => {
-                                                       print("%s: %s:%s %s", type.to_string(), filename, linestr, nodestr.get_string());
+                                                       print("%s: %s:%s %s\n", type.to_string(), filename, linestr, nodestr.get_string());
                                                });
                                        });
                        
                        });
                }
+#else
+               public Gee.HashMap <string,int> result_count;   // output - what's the complication result
                
+               public Gee.HashMap<
+                               string /* errtype*/ , Gee.HashMap<string /*fn*/,     Gee.HashMap<int /*line*/, Gee.ArrayList<string>>>
+               > result;
+
+               public void  logError(ResultType type, string filename, int line, string message) {
+                        
+                        
+                        if (!this.result_count.has_key(type.to_string()+"-TOTAL")) {
+                                this.result_count.set(type.to_string()+"-TOTAL", 1);
+                        } else {
+                               this.result_count.set(type.to_string()+"-TOTAL",                                 
+                                       this.result_count.get(type.to_string()+"-TOTAL") +1
+                               );
+                        }
+                        
+                        
+                        
+                        if (!this.result.has_key(type.to_string())) {
+                                this.result.set(type.to_string(),
+                                        new Gee.HashMap<string /*fn*/,     Gee.HashMap<int /*line*/, Gee.ArrayList<string>>>()
+                                );
+                        }
+                        var t = this.result.get(type.to_string());
+                        if (!t.has_key(filename)) {
+                                t.set(filename, new  Gee.HashMap<int /*line*/, Gee.ArrayList<string>>());
+                        }
+                        var tt = t.get(filename);
+                        if (!tt.has_key(line)) {
+                                tt.set(line, new Gee.ArrayList<string>());
+                        }
+                        var tl = tt.get(line);
+                        tl.add(message);
+                        
+               }
                
+               public bool hasErrors(string fn)
+               {
+                        if (!this.result.has_key(ResultType.err.to_string())) {
+                                return false;
+                        }
+                        
+                        if (fn.length < 1) {
+                               return true;
+                        }
+                        var t = this.result.get(ResultType.err.to_string());
+                        
+                        if (t.has_key(fn)) {
+                                return true;
+                        }
+                        return false;
+               }
+               public void dumpErrors(ResultType type)
+               {
+                        if (!this.result.has_key(type.to_string())) {
+                                return;
+                        }
+                       var t = this.result.get(type.to_string());
+                       foreach(string filename in t.keys) {
+                               var node = t.get(filename);
+                               foreach(int line in node.keys) {
+                                       var errors = node.get(line);
+                                       foreach(string errstr in errors) {
+                                                       print("%s: %s:%d %s\n", type.to_string(), filename, line, errstr);
+                                       }
+                               }
+                       
+                       }
+               }
+
+
+#endif
                
                
                
@@ -277,7 +348,7 @@ namespace JSDOC
                    
                    var srcfile = in_srcfile;
                    if (srcfile[0] != '/') {
-                               srcfile = this.baseDir + in_srcfile;
+                       //      srcfile = PackerRun.opt_real_basedir + in_srcfile;
                        }
                    string str;
                    FileUtils.get_contents(srcfile,out str);
@@ -305,7 +376,7 @@ namespace JSDOC
                        var add = f.replace(".", "/") + ".js";
                        
                        if (add[0] != '/') {
-                                       add = this.baseDir + add;
+                       //              add = PackerRun.opt_real_basedir + add;
                                }
                        
                        if (this.files.contains(add)) {
@@ -334,6 +405,8 @@ namespace JSDOC
                    }
                    
                    
+                   var tmpDir = GLib.DirUtils.make_tmp("roojspacker_XXXXXX");
+                   
                    foreach(var file in this.files) {
                        
                        print("reading %s\n",file );
@@ -360,7 +433,7 @@ namespace JSDOC
                        
                   
                        
-                       var minfile = this.tmpDir + "/" + file.replace("/", ".");
+                       var minfile = tmpDir + "/" + file.replace("/", ".");
                        
                        
                        // let's see if we have a min file already?
@@ -383,9 +456,9 @@ namespace JSDOC
                         
                        print("COMPRESSING to %s\n", minfile);
                        //var codeComp = pack(str, 10, 0, 0);
-                       if (this.cleanup && FileUtils.test (minfile, FileTest.EXISTS)) {
-                           FileUtils.remove(minfile);
-                       }
+                      // if (PackerRun.opt_clean_cache && FileUtils.test (minfile, FileTest.EXISTS)) {
+                      //     FileUtils.remove(minfile);
+                      // }
                        if (!loaded_string) {
                                FileUtils.get_contents(file,out file_contents);
                        }
@@ -397,18 +470,22 @@ namespace JSDOC
                    
                    // at this point if we have errors, we should stop..
 
-                       this.dumpErrors(ResultType.err);                    
+                                           
                        this.dumpErrors(ResultType.warn);
+                       this.dumpErrors(ResultType.err); // since they are fatal - display them last...
+                       
+                       
+                       
                        
-                       if (this.dumpTokens || this.hasErrors()) {
+               //      if (packerrun.opt_dump_tokens || this.hasErrors("")) {
                                 
-                               GLib.Process.exit(0);
-                       }
+               //              GLib.Process.exit(0);
+               //      }
                    print("MERGING SOURCE\n");
                    
                    for(var i=0; i < this.files.size; i++)  {
                        var file = this.files[i];
-                       var minfile = this.tmpDir + "/" + file.replace("/", ".");
+                       var minfile = tmpDir + "/" + file.replace("/", ".");
                        
                        
                        if ( !FileUtils.test(minfile, FileTest.EXISTS)) {
@@ -420,25 +497,29 @@ namespace JSDOC
                        print("using MIN FILE  %s\n", minfile);
                        if (str.length > 0) {
                            if (this.targetStream != null) {
-                                       this.targetStream.write(("// " + 
-                                               ( (file.length > this.baseDir.length) ? file.substring(this.baseDir.length)  : file ) + 
-                                               "\n").data); 
-                                       this.targetStream.write((str + "\n").data); 
+//                                     this.targetStream.write(("// " + 
+//                                             ( (file.length > PackerRun.opt_real_basedir.length) ? file.substring(PackerRun.opt_real_basedir.length)  : file ) + 
+//                                             "\n").data); 
+                                       this.targetStream.write(("// " + file  + "\n").data);                                   
+                                       this.targetStream.write((str + "\n").data); 
 
                            } else {
                                this.outstr += "//" + 
-                                       ( (file.length > this.baseDir.length) ? file.substring(this.baseDir.length)  : file ) +  "\n";
-                               this.outstr += str + "\n";
+                                       ( (file.length > PackerRun.opt_real_basedir.length) ? file.substring(PackerRun.opt_real_basedir.length)  : file ) +  "\n";
+                               this.outstr += "//" +  file  +"\n";
+
+                                    this.outstr += str + "\n";
                            }
                            
                        }
-                       if (this.cleanup) {
-                           FileUtils.remove(minfile);
-                       }
+//                     if (PackerRun.opt_clean_cache) {
+//                         FileUtils.remove(minfile);
+//                     }
                        
                    }
-                   
-                   
+//                 if (PackerRun.opt_clean_cache) {
+//                             FileUtils.remove(tmpDir);
+//                     }
                    
                    if (this.target.length > 0 ) {
                            print("Output file: " + this.target);
@@ -482,11 +563,11 @@ namespace JSDOC
                
                        TokenArray toks = tr.tokenize(new TextStream(str)); // dont merge xxx + . + yyyy etc.
                
-                       if (this.dumpTokens) {
-                               toks.dump();
-                               return "";
-                               //GLib.Process.exit(0);
-                       }
+//                     if (PackerRun.opt_dump_tokens) {
+//                             toks.dump();
+//                             return "";
+//                             //GLib.Process.exit(0);
+//                     }
                
                        this.activeFile = fn;
                
@@ -495,13 +576,13 @@ namespace JSDOC
 
                        //var ts = new TokenStream(toks);
                        //print(JSON.stringify(toks, null,4 )); Seed.quit();
-                       var ts = new Collapse(toks.tokens);
+                       var ts = new Collapse(toks.tokens, this, fn);
                        
                        //ts.dumpAll("");                       print("Done collaps"); Process.exit(1);
                        
                   // print(JSON.stringify(ts.tokens, null,4 )); Seed.quit();
                        //return;//
-                       if (!this.skipScope) {
+//                     if (!PackerRun.opt_skip_scope) {
                                var sp = new ScopeParser(ts, this, fn);
  
                                //sp.packer = this;
@@ -516,12 +597,14 @@ namespace JSDOC
                        //print(sp.warnings.join("\n"));
                        //(new TokenStream(toks.tokens)).dumpAll(""); GLib.Process.exit(1);
                        // compress works on the original array - in theory the replacements have already been done by now 
-                       var outf = CompressWhite(new TokenStream(toks.tokens), this, this.keepWhite); // do not kill whitespace..
+//                     var outf = CompressWhite(new TokenStream(toks.tokens), this, PackerRun.opt_keep_whitespace); // do not kill whitespace..
                
                        
-                       debug("RESULT: \n %s\n", outf);
-               
-                       if (outf.length > 0 && minfile.length > 0 ) {
+       //              debug("RESULT: \n %s\n", outf);
+                       
+                       
+                       
+                       if (outf.length > 0 && minfile.length > 0 && !this.hasErrors(fn)) {
                                FileUtils.set_contents(minfile, outf);
                                 
                        }