Note: This website is archived. For up-to-date information about D projects and development, please visit wiki.dlang.org.

Ticket #193 (closed defect: duplicate)

Opened 16 years ago

Last modified 16 years ago

failure to detect imports inside classes

Reported by: baxissimo Assigned to: Gregor
Priority: major Milestone:
Component: DSSS Version:
Keywords: Cc:

Description

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.

Change History

06/26/08 18:41:43 changed by baxissimo

More relevant discussion on the doost forum: http://www.dsource.org/forums/viewtopic.php?p=20054#20054

06/26/08 18:54:40 changed by baxissimo

Filed a request for clarification on the spec here: http://d.puremagic.com/issues/show_bug.cgi?id=2179

08/24/08 09:06:04 changed by Deewiant

  • status changed from new to closed.
  • resolution set to duplicate.

Duplicate of #175.