Skip to content

Instantly share code, notes, and snippets.

@Simn
Created February 22, 2013 07:48
Show Gist options
  • Save Simn/5011604 to your computer and use it in GitHub Desktop.
Save Simn/5011604 to your computer and use it in GitHub Desktop.
Haxe abstract builder example
import haxe.macro.Context;
import haxe.macro.Expr;
import haxe.macro.Type;
class AbstractBuilder {
macro static public function build():Array<Field> {
var fields = Context.getBuildFields();
var cCur = Context.getLocalClass().get();
var fieldMap = [for (f in fields) f.name => true];
function loop(c:ClassType) {
for (f in c.fields.get()) {
if (f.meta.has(":abstract")) {
if (!fieldMap.exists(f.name)) {
Context.error("Missing implementation for abstract field " +f.name, cCur.pos);
}
} else {
fieldMap.set(f.name,true);
}
}
if (c.superClass != null)
loop(c.superClass.t.get());
}
if (cCur.superClass != null)
loop(cCur.superClass.t.get());
return null;
}
}
@:autoBuild(AbstractBuilder.build())
class MyAbstractBaseClass {
private function new() { }
@:abstract public function intToString(i:Int):String {
return throw "not implemented";
}
public function common() {
return "bar";
}
}
class ChildClass extends MyAbstractBaseClass {
public function new() {
super();
}
//override public function intToString(i:Int):String {
//return "foo";
//}
}
class Main {
static function main() {
var x = new ChildClass();
trace(x.intToString(12));
trace(x.common());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment