On Saturday, 14 April 2018 at 08:20:51 UTC, bauss wrote:
The problem is I can't pragma(msg) the code I want to mixin manually since all mixins are dynamically generated. That's why my only way is to do it within that static foreach.

Wat.

So the compiler is able to generate the string you want to mixin, but not print it?

If you try this:

    static foreach (viewResult; generateViewsResult)
    {
        pragma(msg, "Compiling: " ~ viewResult.name);
        pragma(msg, viewResult.source);
        pragma(msg, "Compiled: " ~ viewResult.name);
    }

Does it blow up? Does it print gibberish? Does it complain in any way?


I initially tried to just use __traits(compiles) but it fails even on the valid generated D code.

This also sounds weird. Are you missing brackets around the generated code? If the generated code consists of more than one expression, you generally have to check __traits(compiles, { mixin(foo()); }).

From reading your messages here it seems the mixin simply contains a class. This test shows the difference:

enum s = "class A {}";

// Global scope:
static assert(!__traits(compiles, mixin(s)));
static assert(__traits(compiles, { mixin(s); }));

unittest {
    // Function scope:
    static assert(!__traits(compiles, mixin(s)));
    static assert(__traits(compiles, { mixin(s); }));
}

As we can see, the version with extra brackets compiles, the other does not.


I wish there was a way to give a mixin some kind of identity like:

mixin("mymixin", "somecode");

Where an error message would print something like:

Error in mixin("mymixin"): ...

That seems like a very good idea. Posted it in D.general:
https://forum.dlang.org/post/epqmzhjoyqcdqrqks...@forum.dlang.org

--
  Simen

Reply via email to