haxe
haxe copied to clipboard
Consider `toString` static extension in string coercion
AFAF: https://try.haxe.org/#52ff1319
@:using(Test.MyEnumUtils)
enum A {
VA;
VB(isX:Bool);
}
abstract B(A) from A {
@:to function toString() return this.toString();
}
class MyEnumUtils {
public static function toString(v:A) return switch v {
case VA: "this is va";
case VB(false): "this is vb false";
case VB(true): "this is vb true";
};
}
class Test {
static function main() {
var m = VB(true);
trace(m);// toString is not called
trace('$m');// toString is not called
trace(m.toString());// toString is called ... obviously
var m:B = m;
trace(m);// toString is called
trace('$m');// toString is called
}
}
In the trace('$m') case the compiler explicitly inserts a Std.string and to expect the toString to be used there if available seems quite reasonable. In the trace(m) case I'm not so sure what the behavior should be, but FWIW I think the best option would be to make it work the same as it works for abstracts.