Bug in -J
Mr. Pib via Digitalmars-d
digitalmars-d at puremagic.com
Sat Aug 12 08:02:34 PDT 2017
On Saturday, 12 August 2017 at 06:06:33 UTC, Vladimir Panteleev
wrote:
> On Saturday, 12 August 2017 at 06:02:57 UTC, Vladimir Panteleev
> wrote:
>> Sounds reasonable, the compiler could check if paths start
>> with a -J path.
>
> There is a potential ambiguity here:
>
> dmd -Jsomedir test.d
>
> test.d: import("somedir/file.txt");
>
> Does the user mean to import "somedir/file.txt" or
> "somedir/somedir/file.txt"? Currently the latter is understood.
> Simply checking for path prefix would break this case. I guess
> this could be done only with absolute paths, but that
> introduces an inconsistency with relative paths. I'm not sure
> it's worth it, considering it's easy to work around.
What is the inconsistency? Absolute paths are specific and well
defined and so are relatives. Relatives are always relative to J,
are they not?
so, import("somedir/file.txt"); obviously means
somedir/somedir/file.txt.
If you wanted somedir/file.txt you would do import(`file.txt`).
I see no problem here. With absolute paths, one simply checks if
the absolute base path matches the absolute base path specified
by J. If it matches, then it passes and can be used directly or
removed internally. If not then an error is given.
e.g.,
-JC:/basepath/somedir
C:/basepath/somedir/file.txt
import('C:/basepath/somedir/file.txt')
import('file.txt')
import('../somedir/file.txt')
import('C:/basepath/../basepath/somedir/file.txt')
import('C:/path/../basepath/file.txt')
should pass all pass.
import('../file.txt')
import('C:/basepath/../basepath/file.txt')
import('C:/path/file.txt')
should all fail.
(I'm only using .. for reference, not sure if they should
actually be supported)
It seems quite simple to me
Any relative paths specified by import are prepended with the
path specified by -J. Any absolute paths specified by an import
are first matched to the path -J simply by
example:
if (J_path.length < basepath.length) assert("Import path must be
located in the same path that is specified by -J");
if (basepath[0..J_path.length] != J_path) ditto; // makes sure
absolute path is in the -J path. This is the check that is
missing from dmd.
(this doesn't resolve ..'s, that could be done before and assumes
basepath is an absolute path)
More information about the Digitalmars-d
mailing list