src/jsdoc/Packer.vala
[roojspacker] / src / jsdoc / Packer.vala
index 65ebb6d..de38574 100644 (file)
@@ -18,7 +18,7 @@ x.srcfiles = array of files (that list other files...) << not supported?
 x.target = "output.pathname.js"
 x.debugTarget = "output.pathname.debug.js"
 
+  
     
 x.pack();  // writes files  etc..
     
@@ -81,74 +81,60 @@ 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???
                */
                 
                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 = config;
+#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 +148,7 @@ namespace JSDOC
                *
                */
                
+#if HAVE_JSON_GLIB
                
                public Json.Object result;   // output - what's the complication result
 
@@ -225,8 +212,80 @@ namespace JSDOC
                        
                        });
                }
+#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
                
                
                
@@ -286,7 +345,7 @@ namespace JSDOC
                    
                    var srcfile = in_srcfile;
                    if (srcfile[0] != '/') {
-                               srcfile = this.baseDir + in_srcfile;
+                               srcfile = config.opt_real_basedir + in_srcfile;
                        }
                    string str;
                    FileUtils.get_contents(srcfile,out str);
@@ -314,7 +373,7 @@ namespace JSDOC
                        var add = f.replace(".", "/") + ".js";
                        
                        if (add[0] != '/') {
-                                       add = this.baseDir + add;
+                                       add = config.opt_real_basedir + add;
                                }
                        
                        if (this.files.contains(add)) {
@@ -343,6 +402,8 @@ namespace JSDOC
                    }
                    
                    
+                   var tmpDir = GLib.DirUtils.make_tmp("roojspacker_XXXXXX");
+                   
                    foreach(var file in this.files) {
                        
                        print("reading %s\n",file );
@@ -369,7 +430,7 @@ namespace JSDOC
                        
                   
                        
-                       var minfile = this.tmpDir + "/" + file.replace("/", ".");
+                       var minfile = tmpDir + "/" + file.replace("/", ".");
                        
                        
                        // let's see if we have a min file already?
@@ -392,7 +453,7 @@ namespace JSDOC
                         
                        print("COMPRESSING to %s\n", minfile);
                        //var codeComp = pack(str, 10, 0, 0);
-                       if (this.cleanup && FileUtils.test (minfile, FileTest.EXISTS)) {
+                       if (config.opt_clean_cache && FileUtils.test (minfile, FileTest.EXISTS)) {
                            FileUtils.remove(minfile);
                        }
                        if (!loaded_string) {
@@ -406,10 +467,14 @@ 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 (config.opt_dump_tokens || this.hasErrors("")) {
                                 
                                GLib.Process.exit(0);
                        }
@@ -417,7 +482,7 @@ namespace JSDOC
                    
                    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)) {
@@ -430,24 +495,28 @@ namespace JSDOC
                        if (str.length > 0) {
                            if (this.targetStream != null) {
                                        this.targetStream.write(("// " + 
-                                               ( (file.length > this.baseDir.length) ? file.substring(this.baseDir.length)  : file ) + 
+                                               ( (file.length > config.opt_real_basedir.length) ? file.substring(config.opt_real_basedir.length)  : file ) + 
                                                "\n").data); 
-                                       this.targetStream.write((str + "\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 > config.opt_real_basedir.length) ? file.substring(config.opt_real_basedir.length)  : file ) +  "\n";
+                               this.outstr += "//" +  file  +"\n";
+
+                                    this.outstr += str + "\n";
                            }
                            
                        }
-                       if (this.cleanup) {
+                       if (config.opt_clean_cache) {
                            FileUtils.remove(minfile);
                        }
                        
                    }
-                   
-                   
+                   if (config.opt_clean_cache) {
+                               FileUtils.remove(tmpDir);
+                       }
                    
                    if (this.target.length > 0 ) {
                            print("Output file: " + this.target);
@@ -491,7 +560,7 @@ namespace JSDOC
                
                        TokenArray toks = tr.tokenize(new TextStream(str)); // dont merge xxx + . + yyyy etc.
                
-                       if (this.dumpTokens) {
+                       if (config.opt_dump_tokens) {
                                toks.dump();
                                return "";
                                //GLib.Process.exit(0);
@@ -504,13 +573,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 (!config.opt_skip_scope) {
                                var sp = new ScopeParser(ts, this, fn);
  
                                //sp.packer = this;
@@ -525,10 +594,10 @@ 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, config.opt_keep_whitespace); // do not kill whitespace..
                
                        
-                       debug("RESULT: \n %s\n", outf);
+       //              debug("RESULT: \n %s\n", outf);