DMD accepts imports placed inside of class scopes.
This is useful for template mixins because it means you can put the imports needed by the mixin into the template itself.
However rebuild/DSSS fail to find such imports.
Test case:
module miximport;
import std.stdio;
// Uncomment to make linker happy
//import miximport_imp;
class Foo {
import miximport_imp;
this() {
writefln("Hi there from Inner - magic value: %s", magic_value);
}
}
void main()
{
new Foo;
}
And miximport_imp.d is
module miximport_imp;
int magic_value = 42;
Running dmd -v miximport.d shows that dmd is aware the import is there:
F:\bax\Code\d\play>dmd -v miximport.d
parse miximport
semantic miximport
import object (f:\usr\pkg\d\dmd\bin\..\import\tango\object.di)
import std.stdio (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\stdio.d)
import std.compat (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\compat.d)
import tango.stdc.stdio (f:\usr\pkg\d\dmd\bin\..\import\tango\tango\stdc\stdio.d)
import tango.stdc.stdarg (f:\usr\pkg\d\dmd\bin\..\import\tango\tango\stdc\stdarg.d)
import tango.stdc.stddef (f:\usr\pkg\d\dmd\bin\..\import\tango\tango\stdc\stddef.d)
import tango.stdc.config (f:\usr\pkg\d\dmd\bin\..\import\tango\tango\stdc\config.d)
import std.c.stdio (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\c\stdio.d)
import std.format (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\format.d)
import std.stdarg (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\stdarg.d)
import tango.core.Vararg (f:\usr\pkg\d\dmd\bin\..\import\tango\tango\core\Vararg.d)
import std.c.stdarg (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\c\stdarg.d)
import std.utf (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\utf.d)
import std.c.stdlib (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\c\stdlib.d)
import std.stdint (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\stdint.d)
import std.c.stddef (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\c\stddef.d)
import tango.stdc.errno (f:\usr\pkg\d\dmd\bin\..\import\tango\tango\stdc\errno.d)
import std.c.string (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\c\string.d)
import std.string (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\string.d)
import std.uni (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\uni.d)
import std.array (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\array.d)
import tango.core.Exception (f:\usr\pkg\d\dmd\bin\..\import\tango\tango\core\Exception.di)
import std.ctype (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\ctype.d)
import std.gc (f:\usr\pkg\d\dmd\bin\..\import\tangobos\std\gc.d)
import tango.core.Memory (f:\usr\pkg\d\dmd\bin\..\import\tango\tango\core\Memory.di)
import miximport_imp (miximport_imp.d)
semantic2 miximport
semantic3 miximport
code miximport
function this
function main
Ok, so that said -- It looks like this is actually undocumented behavior. Looking at the (D1.x) spec for what can go inside a class, it does not appear to me that an ImportDeclaration? is allowed. But it does work currently, and it's a very nice way to make sure the imports needed for a mixin are always there with the mixin.
I discovered this issue working on Doost, which uses this trick of declaring imports inside mixins.