haxe icon indicating copy to clipboard operation
haxe copied to clipboard

Consider `toString` static extension in string coercion

Open back2dos opened this issue 1 year ago • 1 comments

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.

back2dos avatar Sep 11 '24 13:09 back2dos