On Saturday, 2 September 2017 at 20:03:48 UTC, Jean-Louis Leroy wrote:
So I have:

jll@ORAC:~/dev/d/tests/modules$ tree
.
├── foo
│   └── bar.d
└── foo.d

foo.d contains:
import foo.bar;

bar.d is empty.

This means bar.d's module name will be inferred by the compiler [1], which will ignore the path you put it under, yielding the module name "bar", not "foo.bar" (one of the issues of doing otherwise would be how the compiler should know at which path depth the inference should start - and any solution to that other than simply ignoring the path would be full of special cases):

Modules have a one-to-one correspondence with source files. The module name is, by default, the file name with the path and extension stripped off, and can be set explicitly with the module declaration.


Now I try compiling:
jll@ORAC:~/dev/d/tests/modules$ dmd -c foo.d

This looks like a compiler bug to me (accepts invalid), though I'm not certain.

jll@ORAC:~/dev/d/tests/modules$ dmd -c foo/bar.d

(No issue here, just an empty module being compiled separately)


So far so good. Now I try it the way dub does it:
jll@ORAC:~/dev/d/tests/modules$ dmd -c foo.d foo/bar.d
foo.d(1): Error: module bar from file foo/bar.d must be imported with 'import bar;'

What's up?

This doesn't work, because of the inferred module name for foo/bar.d being "bar". So the compiler wants you to import it by the name it has inferred for you (The fix being either specifying the module name in foo/bar.d as `module foo.bar`, or importing it as via `import bar;` in foo.d).
[1] https://dlang.org/spec/module.html

Reply via email to