Browse Source

added haxe.macro.Printer.printTypeDefinition (fixed issue #1483)

Simon Krajewski 12 years ago
parent
commit
4ed9561f45
1 changed files with 55 additions and 3 deletions
  1. 55 3
      std/haxe/macro/Printer.hx

+ 55 - 3
std/haxe/macro/Printer.hx

@@ -113,10 +113,11 @@ class Printer {
 		case ADynamic: "dynamic";
 		case AMacro: "macro";
 	}
-
+	
 	public function printField(field:Field) return
-		(field.meta != null && field.meta.length > 0 ? field.meta.map(printMetadata).join(" ") + " " : "")
-		+ (field.access.length > 0 ? field.access.map(printAccess).join(" ") + " " : "")
+		(field.doc != null && field.doc != "" ? "/**\n" + tabs + tabString + StringTools.replace(field.doc, "\n", "\n" + tabs + tabString) + "\n" + tabs + "**/\n" + tabs : "")
+		+ (field.meta != null && field.meta.length > 0 ? field.meta.map(printMetadata).join(" ") + " " : "")
+		+ (field.access != null && field.access.length > 0 ? field.access.map(printAccess).join(" ") + " " : "")
 		+ switch(field.kind) {
 		  case FVar(t, eo): 'var ${field.name}' + opt(t, printComplexType, ":") + opt(eo, printExpr, "=");
 		  case FProp(get, set, t, eo): 'var ${field.name}($get,$set)' + opt(t, printComplexType, ":") + opt(eo, printExpr, "=");
@@ -207,6 +208,57 @@ class Printer {
 	public function printExprs(el:Array<Expr>, sep:String) {
 		return el.map(printExpr).join(sep);
 	}
+	
+	public function printTypeDefinition(t:TypeDefinition, printPackage = true):String {
+		var old = tabs;
+		tabs = tabString;
+		
+		var str = t == null ? "#NULL" :
+			(printPackage && t.pack.length > 0 && t.pack[0] != "" ? "package " + t.pack.join(".") + ";\n" : "") +
+			(t.meta != null && t.meta.length > 0 ? t.meta.map(printMetadata).join(" ") + " " : "") + (t.isExtern ? "extern " : "") + switch (t.kind) {
+				case TDEnum:				
+					"enum " + t.name + (t.params.length > 0 ? "<" + t.params.map(printTypeParamDecl).join(",") + ">" : "") + " {\n"
+					+ [for (field in t.fields) 
+						tabs + (field.doc != null && field.doc != "" ? "/**\n" + tabs + tabs + StringTools.replace(field.doc, "\n", "\n" + tabs + tabs) + "\n" + tabs + "**/\n" + tabs : "")
+						+ (field.meta != null && field.meta.length > 0 ? field.meta.map(printMetadata).join(" ") + " " : "")
+						+ (switch(field.kind) {
+						  case FVar(_, _): field.name;
+						  case FProp(_, _, _, _): throw "FProp is invalid for TDEnum.";
+						  case FFun(func): field.name + printFunction(func);
+						}) + ";"
+					].join("\n")
+					+ "\n}";
+				case TDStructure:
+					"typedef " + t.name + (t.params.length > 0 ? "<" + t.params.map(printTypeParamDecl).join(",") + ">" : "") + " = {\n"
+					+ [for (f in t.fields) {
+						var fstr = printField(f);
+						tabs + fstr + ";";
+					}].join("\n")
+					+ "\n}";
+				case TDClass(extend, implement, isInterface):
+					(isInterface ? "interface " : "class ") + t.name + (t.params.length > 0 ? "<" + t.params.map(printTypeParamDecl).join(",") + ">" : "")
+					+ (extend != null ? "extends " + printTypePath(extend) + " " : "")
+					+ (implement != null ? [for (tp in implement) "implements " + printTypePath(tp)].join(" ") : "")
+					+ " {\n"
+					+ [for (f in t.fields) {
+						var fstr = printField(f);
+						switch (f.kind) {
+							case FVar(_, _), FProp(_, _, _, _):
+								tabs + fstr + (StringTools.endsWith(fstr, "}") ? "" : ";");
+							case FFun(f):
+								tabs + fstr + (f.expr == null ? ";" : "");
+						}
+					}].join("\n")
+					+ "\n}";
+				case TDAlias(ct):
+					"typedef " + t.name + (t.params.length > 0 ? "<" + t.params.map(printTypeParamDecl).join(",") + ">" : "") + " = "
+					+ printComplexType(ct)
+					+ ";";
+			}
+		
+		tabs = old;
+		return str;
+	}
 
 	function opt<T>(v:T, f:T->String, prefix = "") return v == null ? "" : (prefix + f(v))
 }