Skip to content

Instantly share code, notes, and snippets.

@andyli
Last active December 13, 2015 17:28
Show Gist options
  • Select an option

  • Save andyli/4947479 to your computer and use it in GitHub Desktop.

Select an option

Save andyli/4947479 to your computer and use it in GitHub Desktop.
Index: std/haxe/macro/Printer.hx
===================================================================
--- std/haxe/macro/Printer.hx (revision 6202)
+++ std/haxe/macro/Printer.hx (working copy)
@@ -113,10 +113,11 @@
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,54 @@
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 + 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(" ") + " " : "")
+ + (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) tabs + printField(f) + ";"].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))
}
\ No newline at end of file
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment