Переглянути джерело

fixed :
- functional type display
- private attribute
- added import module info

Nicolas Cannasse 19 роки тому
батько
коміт
ff62aa5a43
1 змінених файлів з 151 додано та 59 видалено
  1. 151 59
      std/tools/haxedoc/Main.hx

+ 151 - 59
std/tools/haxedoc/Main.hx

@@ -159,6 +159,24 @@ private class DocField {
 				return link("Dynamic",curp);
 			return link("Dynamic",curp) + "<" + typeToString(t,curp) + ">";
 		case tfunction(params,ret):
+			var buf = new StringBuf();
+			if( params.length == 0 )
+				buf.add("Void -> ");
+			else {
+				for( p in params ) {
+					if( p.name != "" ) {
+						buf.add(p.name);
+						buf.add(" : ");
+					}
+					buf.add(funToString(p.t,true,curp));
+					buf.add(" -> ");
+				}
+			}
+			buf.add(funToString(ret,false,curp));
+			return buf.toString();
+		case tparam(cl,name):
+			return if( cl != parent.path ) link(cl,curp) + "." + name else name;
+		case tconstr(params):
 			var s = new StringBuf();
 			s.add("(");
 			var first = true;
@@ -171,11 +189,28 @@ private class DocField {
 				s.add(" : ");
 				s.add(typeToString(p.t,curp));
 			}
-			s.add(") : ");
-			return s.toString() + typeToString(ret,curp);
-		case tparam(cl,name):
-			return if( cl != parent.path ) link(cl,curp) + "." + name else name;
-		case tconstr(params):
+			s.add(")");
+			return s.toString();
+		}
+		return null;
+	}
+
+	public function funToString( t, isarg, curp ) {
+		var parent =
+		switch( t ) {
+		case tfunction(_,_): true;
+		case tenum(name,_): isarg && name == "Void";
+		default: false;
+		}
+		if( parent )
+			return "(" + typeToString(t,curp) + ")";
+		else
+			return typeToString(t,curp);
+	}
+
+	public function methToString( t, curp ) {
+		switch( t ) {
+		case tfunction(params,ret):
 			var s = new StringBuf();
 			s.add("(");
 			var first = true;
@@ -184,14 +219,18 @@ private class DocField {
 					first = false;
 				else
 					s.add(", ");
+				if( p.name == "" )
+					return typeToString(t,curp);
 				s.add(p.name);
 				s.add(" : ");
 				s.add(typeToString(p.t,curp));
 			}
-			s.add(")");
+			s.add(") : ");
+			s.add(typeToString(ret,curp));
 			return s.toString();
+		default:
+			return typeToString(t,curp);
 		}
-		return null;
 	}
 
 }
@@ -199,73 +238,106 @@ private class DocField {
 private class DocClass {
 
 	public var path : String;
+	public var module : String;
 	public var name : String;
 	public var doc : String;
-	public var isEnum : Bool;
 	public var params : Array<String>;
 	public var fields : Array<DocField>;
+	public var isPrivate : Bool;
 
-	public function new( path, e ) {
+	public function new( path ) {
 		this.path = path;
-		isEnum = e;
 		fields = new Array();
 		params = new Array();
 	}
 
+	function genName( s : StringBuf ) {
+		s.add("class ");
+		s.add(path);
+	}
+
+	function genBody( s : StringBuf, curp ) {
+		for( f in fields ) {
+			s.add("<dt>");
+			if( f.isStatic )
+				s.add("static ");
+			if( f.isVar() )
+				s.add("var ");
+			else
+				s.add("function ");
+			s.add(f.name);
+			if( f.isVar() )
+				s.add(" : ");
+			s.add(f.methToString(f.type,curp));
+			s.add("</dt>");
+			s.add("<dd>");
+			if( f.doc != null ) s.add(f.doc);
+			s.add("</dd>");
+		}
+	}
+
 	public function toString() {
 		var s = new StringBuf();
 		var curp = path.split(".");
 		s.add("<div class=\"classname\">");
-		s.add(if( isEnum ) "enum " else "class ");
-		s.add(path);
+		if( isPrivate )
+			s.add("private ");
+		genName(s);
 		if( params.length > 0 ) {
 			s.add("&lt;");
 			s.add(params.join(", "));
 			s.add("&gt;");
 		}
 		s.add("</div>");
+		if( module != null ) {
+			s.add("<div class=\"importmod\">");
+			s.add("import "+module);
+			s.add("</div>");
+		}
 		if( doc != null ) {
 			s.add("<div class=\"classdoc\">");
 			s.add(doc);
 			s.add("</div>");
 		}
 		s.add("<dl>");
-		if( isEnum ) {
-			for( f in fields ) {
-				s.add("<dt>");
-				s.add(f.name);
-				if( f.type != null )
-					s.add(f.typeToString(f.type,curp));
-				s.add("</dt>");
-				s.add("<dd>");
-				if( f.doc != null ) s.add(f.doc);
-				s.add("</dd>");
-			}
-		} else {
-			for( f in fields ) {
-				s.add("<dt>");
-				if( f.isStatic )
-					s.add("static ");
-				if( f.isVar() )
-					s.add("var ");
-				else
-					s.add("function ");
-				s.add(f.name);
-				if( f.isVar() )
-					s.add(" : ");
-				s.add(f.typeToString(f.type,curp));
-				s.add("</dt>");
-				s.add("<dd>");
-				if( f.doc != null ) s.add(f.doc);
-				s.add("</dd>");
-			}
-		}
+		genBody(s,curp);
 		s.add("</dl>");
 		return s.toString();
 	}
 
 }
 
+
+private class DocEnum extends DocClass {
+
+	function genName( s : StringBuf ) {
+		s.add("enum ");
+		s.add(path);
+	}
+
+	function genBody( s : StringBuf, curp ) {
+		for( f in fields ) {
+			s.add("<dt>");
+			s.add(f.name);
+			if( f.type != null )
+				s.add(f.methToString(f.type,curp));
+			s.add("</dt>");
+			s.add("<dd>");
+			if( f.doc != null ) s.add(f.doc);
+			s.add("</dd>");
+		}
+	}
+
+}
+
+private class DocSign extends DocClass {
+
+	function genName( s : StringBuf ) {
+		s.add("signature ");
+		s.add(path);
+	}
+}
+
 private enum DocEntry {
 	eclass( c : DocClass );
 	epackage( name : String, childs : Array<DocEntry> );
@@ -317,6 +389,11 @@ class DocView {
 		}
 	}
 
+	static function docFormat( doc : String ) : String {
+		doc = ~/\[([^\]]+)\]/g.replace(doc,"<code>$1</code>");
+		return doc;
+	}
+
 	static function processField( c : DocClass, x : Xml ) {
 		var stat = x.get("static") == "1";
 		var nl = x.elements();
@@ -325,26 +402,40 @@ class DocView {
 		f.parent = c;
 		var doc = nl.next();
 		if( doc != null )
-			f.doc = doc.firstChild().nodeValue;
+			f.doc = docFormat(doc.firstChild().nodeValue);
 		return f;
 	}
 
 	static function processClass(x : Xml) {
 		var path = x.get("path");
-		if( x.get("private") == "1" )
-			return;
 		if( StringTools.endsWith(path,"__") )
 			return;
 		if( findEntry(entries,path.split(".")) != null ) {
 			// MERGE ?
 			return;
 		}
-		var c = new DocClass(path,x.nodeName != "class");
-		c.params = x.get("params").split(":");
-		if( c.isEnum ) {
+		var c : DocClass;
+		switch( x.nodeName ) {
+		case "class":
+			c = new DocClass(path);
+			for( m in x.elements() ) {
+				if( m.nodeName == "haxe:doc" ) {
+					c.doc = docFormat(m.firstChild().nodeValue);
+					continue;
+				}
+				if( m.get("public") == "1" )
+					c.fields.push(processField(c,m));
+			}
+		case "signature":
+			var s = new DocSign(path);
+			// TODO
+			c = s;
+		case "enum":
+			var e = new DocEnum(path);
+			c = e;
 			for( m in x.elements() ) {
 				if( m.nodeName == "haxe:doc" ) {
-					c.doc = m.firstChild().nodeValue;
+					c.doc = docFormat(m.firstChild().nodeValue);
 					continue;
 				}
 				var l = Lambda.array(m.elements());
@@ -362,17 +453,18 @@ class DocView {
 				f.parent = c;
 				c.fields.push(f);
 			}
-		} else {
-			for( m in x.elements() ) {
-				if( m.nodeName == "haxe:doc" ) {
-					c.doc = m.firstChild().nodeValue;
-					continue;
-				}
-				if( m.get("public") == "1" )
-					c.fields.push(processField(c,m));
-			}
+		default:
+			throw x.nodeName;
 		}
+		c.isPrivate = x.get("private") == "1";
+		// original path
+		if( c.isPrivate )
+			c.path = ~/_[A-Za-z0-9]+\./.replace(c.path,"");
+		c.module = x.get("module");
+		c.params = x.get("params").split(":");
 		c.fields.sort(function(f1 : DocField,f2 : DocField) {
+			if( f1.isStatic && !f2.isStatic )
+				return 1;
 			var v1 = f1.isVar();
 			var v2 = f2.isVar();
 			if( v1 && !v2 )
@@ -467,7 +559,7 @@ class DocView {
 				display(p);
 				print("</div></li>");
 			case eclass(c):
-				if( c.fields.length > 0 )
+				if( !c.isPrivate )
 					print("<li>"+Url.make(c.path.split(".").join("/"),"entry",c.name)+"</li>");
 			}
 		}