Why is the error message coming by the end of the compilation?

bauss jj_1337 at live.dk
Sun Apr 15 15:33:58 UTC 2018


On Sunday, 15 April 2018 at 10:14:56 UTC, Simen Kjærås wrote:
> 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/epqmzhjoyqcdqrqksuvf@forum.dlang.org
>
> --
>   Simen

Tried in brackets already, also tried to wraper 
__traits(compiles) into a function and given __traits(compiles) a 
function that has the code mixin.

It does not print gibberish and the code is valid, but 
__traits(compiles) still returns false for it.

On Sunday, 15 April 2018 at 10:27:26 UTC, ag0aep6g wrote:
> On 04/14/2018 08:56 PM, bauss wrote:
>> 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 would completely solve this issue and I wouldn't have to 
>> have pragma(msg) all over the place.
>
> The `#line` thing might help:
>
> ----
> void main()
> {
>     mixin("#line 1 \"mymixin\"\n" ~ "somecode;");
>         /* mymixin(1): Error: undefined identifier somecode */
>     somecode;
>         /* test.d(5): Error: undefined identifier somecode */
> }
> ----
>
> https://dlang.org/spec/lex.html#special-token-sequence

I don't see how the #line will help because you don't know which 
mixin the line would be associated with as they can come in any 
order.


More information about the Digitalmars-d-learn mailing list