Fix #6904 - JSON output for docs / editor
[roojspacker] / roojspacker / DocBuilder.vala
index 76b71ce..c993fe5 100644 (file)
@@ -4,7 +4,7 @@
 namespace JSDOC 
 {
 
-       class DocBuilder : Object 
+       public class DocBuilder : Object 
        {
                
  
@@ -13,6 +13,14 @@ namespace JSDOC
                
                private SymbolSet symbolSet;
                
+               public Symbol getSymbol(string name) // wrapper for read only...
+               {
+                       return this.symbolSet.getSymbol(name);
+               }
+               
+               
+               
+               
                private Packer packer;
        
                public DocBuilder (Packer p) 
@@ -30,38 +38,36 @@ namespace JSDOC
        
                    this.parseSrcFiles();
                    
+                   DocParser.validateAugments();                   
+                   DocParser.fillChildClasses();
+                   DocParser.fillTreeChildren();
+                   
+                   
                    this.symbolSet = DocParser.symbols();
+                   
+                   
+                   var classes =  DocParser.classes();
                     
-                   // this currently uses the concept of publish.js...
                    
+                   // this currently uses the concept of publish.js...
+                  
                    if (PackerRun.singleton().opt_doc_dump_tree) {
                    
                    
-                       var symbols = this.symbolSet.values();
-                   
-                                
+                       
                                
                         
                                //print(JSON.stringify(symbols,null,4));
-                               var classes = new Gee.ArrayList<Symbol>();
-                               
-                               foreach(var symbol in symbols) {
-                                       if (symbol.isaClass()) { 
-                                               classes.add(symbol);
-                                       }
-                               }    
-                               classes.sort( (a,b) => {
-                                       return a.alias.collate(b.alias); 
-                               });
-                   
+                                
                        var jsonAll = new Json.Object(); 
+                       var ar = new Json.Array(); 
                                for (var i = 0, l = classes.size; i < l; i++) {
-                                   var symbol = classes.get(i);
-                                        
-                                   jsonAll.set_object_member(symbol.alias,  this.publishJSON(symbol));
+                                   var symbol = classes.get(i);    
+                                   //
+                                   ar.add_object_element(  symbol.toJson());
 
                                }
-                               
+                               jsonAll.set_array_member("data", ar);
                                var generator = new Json.Generator ();
                            var root = new Json.Node(Json.NodeType.OBJECT);
                   
@@ -175,92 +181,26 @@ namespace JSDOC
                    
                                 
                        DocParser.parse(ts, srcFile);
-                       /*
-                       if (useCache) {
-                               
-                               var ar = DocParser.symbolsToObject(srcFile);
-                               
-                               var builder = new Json.Builder ();
-                               builder.begin_array ();
-                               for (var i=0;i<ar.size;i++) {
-                               
-                                               builder.add_object_value (ar.get(i));
-                                       }
-                                       builder.end_array ();
-                                       Json.Generator generator = new Json.Generator ();
-                                       Json.Node root = builder.get_root ();
-                                       generator.set_root (root);
-                                       generator.pretty=  true;
-                                       generator.ident = 2;
-                                       generator.to_file(cacheFile);
-                       
-                        
-                           
-                                }
-                                */
+                      
                    }
                    
                     
                    
                    DocParser.finish();
-               }
-               /*
-
-            //var txs =
-            
-            var tr = new  TokenReader(this.packer);
-                       tr.keepDocs = true;
-                       tr.keepWhite = true;
-                       tr.keepComments = true;
-                       tr.sepIdents = false;
-                       tr.collapseWhite = false;
-                       tr.filename = src;
-            
+                   
+                   
+                   // this is probably not the best place for this..
+                  
+                   
 
-            var toks = tr.tokenize( new TextStream(src));
-            if (PackerRun.opt_dump_tokens) {
-                               toks.dump();
-                               return "";
-                               //GLib.Process.exit(0);
-                       }
-            
-            
-            var ts = new TokenStream(toks);
-        
-        
-        
-                     
-            DocParser.parse(ts, srcFile);
-            
-            if (useCache) {
-                       
-                       var ar = DocParser.symbolsToObject(srcFile);
-                       
-                       var builder = new Json.Builder ();
-               builder.begin_array ();
-               for (var i=0;i<ar.size;i++) {
-               
-                                       builder.add_object_value (ar.get(i));
-                               }
-                               builder.end_array ();
-                               Json.Generator generator = new Json.Generator ();
-                               Json.Node root = builder.get_root ();
-                               generator.set_root (root);
-                               generator.pretty=  true;
-                               generator.ident = 2;
-                               generator.to_file(cacheFile);
-            
-             
-                
-    //         }
-        }
-        
-        
-        
-        Parser.finish();
-    }
-    
-     */
+                   
+                   
+                   
+               }
+               
+                
+                
+                
        string tempdir;
         
                void publish() 
@@ -329,16 +269,7 @@ namespace JSDOC
                        this.makeSrcFile(file);
                    }
                    //print(JSON.stringify(symbols,null,4));
-                   var classes = new Gee.ArrayList<Symbol>();
-                   
-                   foreach(var symbol in symbols) {
-                               if (symbol.isaClass()) { 
-                                       classes.add(symbol);
-                               }
-                   }    
-                   classes.sort( (a,b) => {
-                               return a.alias.collate(b.alias); 
-                       });
+                   var classes = DocParser.classes();
                     
                     //GLib.debug("classTemplate Process : all classes");
                        
@@ -357,18 +288,18 @@ namespace JSDOC
                        
                        var   class_gen = new Json.Generator ();
                            var  class_root = new Json.Node(Json.NodeType.OBJECT);
-                               class_root.init_object(this.class_to_json(symbol));
+                               class_root.init_object(symbol.toClassDocJSON());
                                class_gen.set_root (class_root);
                                class_gen.pretty=  true;
                                class_gen.indent = 2;
-                               GLib.warning("writing JSON:  %s", PackerRun.singleton().opt_doc_target+"/symbols/" +symbol.alias+".json");
+                               GLib.debug("writing JSON:  %s", PackerRun.singleton().opt_doc_target+"/symbols/" +symbol.alias+".json");
                                this.writeJson(class_gen, PackerRun.singleton().opt_doc_target+"/symbols/" +symbol.alias+".json");
                        
-                       jsonAll.set_object_member(symbol.alias,  this.publishJSON(symbol));
+                       jsonAll.set_object_member(symbol.alias,  symbol.toClassJSON());
 
                    }
                    
-                   // outptu class truee
+                   // outptu class tree
                    
                    var   class_tree_gen = new Json.Generator ();
            var  class_tree_root = new Json.Node(Json.NodeType.ARRAY);
@@ -376,7 +307,7 @@ namespace JSDOC
                        class_tree_gen.set_root (class_tree_root);
                        class_tree_gen.pretty=  true;
                        class_tree_gen.indent = 2;
-                       GLib.warning("writing JSON:  %s", PackerRun.singleton().opt_doc_target+"/tree.json");
+                       GLib.debug("writing JSON:  %s", PackerRun.singleton().opt_doc_target+"/tree.json");
                        this.writeJson(class_tree_gen,PackerRun.singleton().opt_doc_target+"/tree.json");
                        size_t class_tree_l;
                        //GLib.debug("JSON: %s", class_tree_gen.to_data(out class_tree_l));
@@ -392,7 +323,7 @@ namespace JSDOC
                        generator.set_root (root);
                        generator.pretty=  true;
                        generator.indent = 2;
-                       GLib.warning("writing JSON:  %s", PackerRun.singleton().opt_doc_target+"/json/roodata.json");
+                       GLib.debug("writing JSON:  %s", PackerRun.singleton().opt_doc_target+"/json/roodata.json");
                        
                        
                        this.writeJson(generator,PackerRun.singleton().opt_doc_target+"/json/roodata.json");
@@ -408,136 +339,7 @@ namespace JSDOC
                    
                }
                
-               Json.Object class_to_json (Symbol cls)
-               {
-                       var ret = new Json.Object();
-                       ret.set_string_member("name", cls.alias);
-                       var ag = new Json.Array();
-                       ret.set_array_member("augments", ag);                   
-                       for(var ii = 0, il = cls.augments.size; ii < il; ii++) {
-                  var contributer = this.symbolSet.getSymbol(cls.augments[ii]);
-                  if (contributer == null) {
-                       continue;
-                       }
-                  ag.add_string_element(contributer.alias);
-            }
-            ret.set_string_member("name", cls.alias);  
-            ret.set_string_member("desc", cls.desc);
-               ret.set_boolean_member("isSingleton", cls.comment.getTag(DocTagTitle.SINGLETON).size > 0);
-               ret.set_boolean_member("isStatic", cls.isa != "CONSTRUCTOR");
-               ret.set_boolean_member("isBuiltin", cls.isBuiltin());
-               
-               // needded so that the class can fake a ctor..
-            ret.set_string_member("memberOf", cls.name);
-                       ret.set_string_member("example", cls.comment.getTagAsString(DocTagTitle.EXAMPLE));
-                   ret.set_string_member("deprecated", // as depricated is used as a flag...
-                                       cls.comment.getTag(DocTagTitle.DEPRECATED).size > 0 ? 
-                                       "This has been deprecated: "+  cls.comment.getTagAsString(DocTagTitle.DEPRECATED) : 
-                               "");
-               ret.set_string_member("since", cls.comment.getTagAsString(DocTagTitle.SINCE));
-               ret.set_string_member("see", cls.comment.getTagAsString(DocTagTitle.SINCE));
-                       // not supported or used yet?
-                       //add.set_string_member("exceptions", m.comment.getTagAsString(DocTagTitle.EXCEPTIONS));
-                       //add.set_string_member("requires", m.comment.getTagAsString(DocTagTitle.REQUIRES));
-               ret.set_array_member("params", cls.paramsToJson());
-               ret.set_array_member("returns", new Json.Array()); 
-                               
-                       //ret.set_string_member("desc", cls.comment.getTagAsString(DocTagTitle.DESC));
-               /// fixme - @see ... any others..
-                       
-                       var props = new Json.Array(); 
-                       ret.set_array_member("config", props);
-                       var cfgProperties = cls.configToArray();
-                       for(var i =0; i < cfgProperties.size;i++) {
-                       var p = cfgProperties.get(i);
-                       var add = new Json.Object();
-                       add.set_string_member("name",p.name);
-                       add.set_string_member("type",p.type);
-                       add.set_string_member("desc",p.desc);
-                       add.set_string_member("memberOf",  p.memberOf);
-                       add.set_array_member("optvals",p.optvalues.size > 0 ? p.optvalue_as_json_array() : new Json.Array());
-                       props.add_object_element(add );
-                   }
-                    
-                   // methods
-
-                        
-                       var methods = new Json.Array();
-                       ret.set_array_member("methods", methods);                    
-                   foreach(var m in cls.methods) {
-                       if (m.isEvent || m.isIgnored) {
-                               continue;
-                       }
-                       
-                       var add = new Json.Object();
-                       add.set_string_member("name",m.name);
-                       //add.set_string_member("type","function");
-                       add.set_string_member("desc",m.desc);
-                       //add.set_string_member("sig", m.makeMethodSkel());
-                       add.set_boolean_member("isStatic", m.isStatic);
-                       add.set_boolean_member("isConstructor", m.isa == "CONSTRUCTOR");
-                       add.set_boolean_member("isPrivate", m.isPrivate);
-                       //add.set_string_member("instanceOf", m.comment.getTagAsString(DocTagTitle.INSTANCEOF));
-                       add.set_string_member("memberOf", m.memberOf);
-                       add.set_string_member("example", m.comment.getTagAsString(DocTagTitle.EXAMPLE));
-                       add.set_string_member("deprecated", // as depricated is used as a flag...
-                                       m.comment.getTag(DocTagTitle.DEPRECATED).size > 0 ? 
-                                       "This has been deprecated: "+  m.comment.getTagAsString(DocTagTitle.DEPRECATED) : 
-                                       "");
-                       add.set_string_member("since", m.comment.getTagAsString(DocTagTitle.SINCE));
-                       add.set_string_member("see", m.comment.getTagAsString(DocTagTitle.SINCE));
-                       // not supported or used yet?
-                       //add.set_string_member("exceptions", m.comment.getTagAsString(DocTagTitle.EXCEPTIONS));
-                       //add.set_string_member("requires", m.comment.getTagAsString(DocTagTitle.REQUIRES));
-                       add.set_array_member("params", m.paramsToJson());
-                       add.set_array_member("returns", m.returnsToJson());
-                       
-                       /// fixme - @see ... any others..
-                         
-                       
-                       methods.add_object_element(add);
-                   }
-                   
-                   
-                       var events = new Json.Array();
-                       ret.set_array_member("events", events);              
-                   foreach(var m in cls.methods) {
-                       if (!m.isEvent || m.isIgnored) {
-                               continue;
-                       }
-                       
-                       var add = new Json.Object();
-                       add.set_string_member("name",m.name.substring(1)); // all prefixed with '*'...
-                       //add.set_string_member("type","function");
-                       add.set_string_member("desc",m.desc);
-                       //add.set_string_member("sig", m.makeMethodSkel());
-
-                       add.set_string_member("memberOf", m.memberOf);
-                       add.set_string_member("example", m.comment.getTagAsString(DocTagTitle.EXAMPLE));
-                       add.set_string_member("deprecated", // as depricated is used as a flag...
-                                       m.comment.getTag(DocTagTitle.DEPRECATED).size > 0 ? 
-                                       "This has been deprecated: "+  m.comment.getTagAsString(DocTagTitle.DEPRECATED) : 
-                                       "");
-                       add.set_string_member("since", m.comment.getTagAsString(DocTagTitle.SINCE));
-                       add.set_string_member("see", m.comment.getTagAsString(DocTagTitle.SINCE));
-                       // not supported or used yet?
-                       //add.set_string_member("exceptions", m.comment.getTagAsString(DocTagTitle.EXCEPTIONS));
-                       //add.set_string_member("requires", m.comment.getTagAsString(DocTagTitle.REQUIRES));
-                       
-                       add.set_array_member("params", m.paramsToJson());
-                       add.set_array_member("returns", m.returnsToJson());
-                       
-                       /// fixme - @see ... any others..
-                         
-                       
-                       events.add_object_element(add);
-                   }
-                   
-                       
-                       
-               
-                       return ret;
-               }
                /**
                * needed as Json dumps .xXXX into same directory as it writes...
                */
@@ -559,115 +361,7 @@ namespace JSDOC
                        GLib.File.new_for_path(tmp).move( File.new_for_path(fname), GLib.FileCopyFlags.OVERWRITE);
                      
                }
-               
-               /**
-                * JSON files are lookup files for the documentation
-                * - can be used by IDE's or AJAX based doc tools
-                * 
-                * 
-                */
-               Json.Object publishJSON (Symbol data)
-               {
-                   // what we need to output to be usefull...
-                   // a) props..
-                   var cfgProperties = new Gee.ArrayList<DocTag>();
-                   if (data.comment.getTag(DocTagTitle.SINGLETON).size < 1) {
-                        cfgProperties = data.configToArray();
-                        cfgProperties.sort((a,b) =>{
-                               return a.name.collate(b.name);
-                       }); 
-                       
-                   } 
-                   
-                   var props = new Json.Array(); 
-                   //println(cfgProperties.toSource());
-                   
-                   for(var i =0; i < cfgProperties.size;i++) {
-                       var p = cfgProperties.get(i);
-                       var add = new Json.Object();
-                       add.set_string_member("name",p.name);
-                       add.set_string_member("type",p.type);
-                       add.set_string_member("desc",p.desc);
-                       add.set_string_member("memberOf", p.memberOf == data.alias ? "" : p.memberOf);
-                           
-                       if (p.optvalues.size > 0) {
-                            add.set_array_member("optvals",p.optvalue_as_json_array());
-                       }
-                       
-                       props.add_object_element(add );
-                   }
-                   
-                   ///// --- events
-                   var ownEvents = new Gee.ArrayList<Symbol>();
-                   for(var i =0; i < data.methods.size;i++) {
-                               var e = data.methods.get(i);
-                               if (e.isEvent && !e.isIgnored) {
-                                       ownEvents.add(e);
-                               }
-                       }; 
-                       ownEvents.sort((a,b) => {
-                               return a.name.collate(b.name);
-                       });
-                   
-                   var events = new Json.Array();
-                    
-                   for(var i =0; i < ownEvents.size;i++) {
-                       var m = ownEvents.get(i);
-                       var add = new Json.Object();
-                       add.set_string_member("name",m.name.substring(1,-1)); // remove'*' on events..
-                       add.set_string_member("type","function");
-                       add.set_string_member("desc",m.desc);
-                       add.set_string_member("sig", m.makeFuncSkel());
-                       add.set_string_member("memberOf", m.memberOf == data.alias ? "" : m.memberOf);                  
-                       events.add_object_element(add);
-                   } 
-                    
-                   // methods
-                   var ownMethods = new Gee.ArrayList<Symbol>();
-                   for(var i =0; i < data.methods.size;i++) {
-                               var e = data.methods.get(i);
-                               if (!e.isEvent && !e.isIgnored) {
-                                       ownMethods.add(e);
-                               }
-                       };
-                       ownMethods.sort((a,b) => {
-                               return a.name.collate(b.name);
-                       });
-                   
-                       var methods = new Json.Array();
-                    
-                   for(var i =0; i < ownMethods.size;i++) {
-                       var m = ownMethods.get(i);
-                       var add = new Json.Object();
-                       add.set_string_member("name",m.name);
-                       add.set_string_member("type","function");
-                       add.set_string_member("desc",m.desc);
-                       add.set_string_member("sig", m.makeMethodSkel());
-                       add.set_boolean_member("static", m.isStatic);
-                       add.set_string_member("memberOf", m.memberOf == data.alias ? "" : m.memberOf);  
-                       methods.add_object_element(add);
-                   }
-                    
-                   //println(props.toSource());
-                   // we need to output:
-                   //classname => {
-                   //    propname => 
-                   //        type=>
-                   //        desc=>
-                   //    }
-                       var ret =  new Json.Object();
-                       ret.set_array_member("props", props);
-                       ret.set_array_member("events", events);
-                       ret.set_array_member("methods", methods);
-               
-                   return ret;
-                   
-                   
-                   // b) methods
-                   // c) events
-                   
-                   
-               }
+                
                Gee.HashMap<string,Json.Object> class_tree_map;
                Json.Array class_tree_top;
                
@@ -688,6 +382,7 @@ namespace JSDOC
                add.set_string_member("name", name);
                add.set_array_member("cn", new Json.Array());
                add.set_boolean_member("is_class", is_class);
+               
                this.class_tree_map.set(name, add);
                var bits = name.split(".");
                if (bits.length == 1) {