Prepare import paths mechanism for metadata

This commit is contained in:
Richard (Rikki) Andrew Cattermole 2024-12-30 22:23:36 +13:00 committed by Nicholas Wilson
parent 605ca0f009
commit 12d4f3e4d6
11 changed files with 109 additions and 36 deletions

View file

@ -51,7 +51,7 @@ DArray!ubyte preprocess(FileName csrcfile, ref const Loc loc, ref OutBuffer defi
{ {
/* Look for "importc.h" by searching along import path. /* Look for "importc.h" by searching along import path.
*/ */
const(char)* importc_h = findImportcH(global.path[]); const(char)* importc_h = findImportcH(global.importPaths[]);
if (importc_h) if (importc_h)
{ {

View file

@ -310,8 +310,9 @@ extern (C++) class Package : ScopeDsymbol
packages ~= s.ident; packages ~= s.ident;
reverse(packages); reverse(packages);
if (Module.find(getFilename(packages, ident))) ImportPathInfo pathThatFoundThis;
Module.load(Loc.initial, packages, this.ident); if (Module.find(getFilename(packages, ident), pathThatFoundThis))
Module.load(Loc.initial, packages, this.ident, pathThatFoundThis);
else else
isPkgMod = PKG.package_; isPkgMod = PKG.package_;
} }
@ -499,12 +500,18 @@ extern (C++) final class Module : Package
static const(char)* find(const(char)* filename) static const(char)* find(const(char)* filename)
{ {
return find(filename.toDString).ptr; ImportPathInfo pathThatFoundThis; // is this needed? In fact is this function needed still???
return find(filename.toDString, pathThatFoundThis).ptr;
} }
extern (D) static const(char)[] find(const(char)[] filename) extern (D) static const(char)[] find(const(char)[] filename, out ImportPathInfo pathThatFoundThis)
{ {
return global.fileManager.lookForSourceFile(filename, global.path[]); ptrdiff_t whichPathFoundThis;
const(char)[] ret = global.fileManager.lookForSourceFile(filename, global.path[], whichPathFoundThis);
if (whichPathFoundThis >= 0)
pathThatFoundThis = global.path[whichPathFoundThis];
return ret;
} }
extern (C++) static Module load(const ref Loc loc, Identifiers* packages, Identifier ident) extern (C++) static Module load(const ref Loc loc, Identifiers* packages, Identifier ident)
@ -512,7 +519,7 @@ extern (C++) final class Module : Package
return load(loc, packages ? (*packages)[] : null, ident); return load(loc, packages ? (*packages)[] : null, ident);
} }
extern (D) static Module load(const ref Loc loc, Identifier[] packages, Identifier ident) extern (D) static Module load(const ref Loc loc, Identifier[] packages, Identifier ident, ImportPathInfo pathInfo = ImportPathInfo.init)
{ {
//printf("Module::load(ident = '%s')\n", ident.toChars()); //printf("Module::load(ident = '%s')\n", ident.toChars());
// Build module filename by turning: // Build module filename by turning:
@ -521,11 +528,17 @@ extern (C++) final class Module : Package
// foo\bar\baz // foo\bar\baz
const(char)[] filename = getFilename(packages, ident); const(char)[] filename = getFilename(packages, ident);
// Look for the source file // Look for the source file
if (const result = find(filename)) ImportPathInfo importPathThatFindUs;
if (const result = find(filename, importPathThatFindUs))
{
filename = result; // leaks filename = result; // leaks
pathInfo = importPathThatFindUs;
}
auto m = new Module(loc, filename, ident, 0, 0); auto m = new Module(loc, filename, ident, 0, 0);
// TODO: apply import path information (pathInfo) on to module
if (!m.read(loc)) if (!m.read(loc))
return null; return null;
if (global.params.v.verbose) if (global.params.v.verbose)
@ -662,7 +675,7 @@ extern (C++) final class Module : Package
if (global.path.length) if (global.path.length)
{ {
foreach (i, p; global.path[]) foreach (i, p; global.path[])
fprintf(stderr, "import path[%llu] = %s\n", cast(ulong)i, p); fprintf(stderr, "import path[%llu] = %s\n", cast(ulong)i, p.path);
} }
else else
{ {

View file

@ -159,16 +159,20 @@ nothrow:
* Does not open the file. * Does not open the file.
* Params: * Params:
* filename = as supplied by the user * filename = as supplied by the user
* paths = paths to look for filename * pathsInfo = pathsInfo to look for filename with metadata
* whichPathFoundThis = Which path from `path` was used in determining the output path, or -1 if unknown.
* Returns: * Returns:
* the found file name or * the found file name or
* `null` if it is not different from filename. * `null` if it is not different from filename.
*/ */
const(char)[] lookForSourceFile(const char[] filename, const char*[] paths) const(char)[] lookForSourceFile(const char[] filename, const ImportPathInfo[] pathsInfo, out ptrdiff_t whichPathFoundThis)
{ {
//printf("lookForSourceFile(`%.*s`)\n", cast(int)filename.length, filename.ptr); //printf("lookForSourceFile(`%.*s`)\n", cast(int)filename.length, filename.ptr);
/* Search along paths[] for .di file, then .d file. /* Search along pathsInfo[] for .di file, then .d file.
*/ */
whichPathFoundThis = -1;
// see if we should check for the module locally. // see if we should check for the module locally.
bool checkLocal = pathCache.pathExists(filename); bool checkLocal = pathCache.pathExists(filename);
const sdi = FileName.forceExt(filename, hdr_ext); const sdi = FileName.forceExt(filename, hdr_ext);
@ -206,11 +210,11 @@ nothrow:
if (FileName.absolute(filename)) if (FileName.absolute(filename))
return null; return null;
if (!paths.length) if (!pathsInfo.length)
return null; return null;
foreach (entry; paths) foreach (pathIndex, entry; pathsInfo)
{ {
const p = entry.toDString(); const p = entry.path.toDString();
const(char)[] n = FileName.combine(p, sdi); const(char)[] n = FileName.combine(p, sdi);
@ -225,6 +229,7 @@ nothrow:
n = FileName.combine(p, sd); n = FileName.combine(p, sd);
if (FileName.exists(n) == 1) { if (FileName.exists(n) == 1) {
whichPathFoundThis = pathIndex;
return n; return n;
} }
FileName.free(n.ptr); FileName.free(n.ptr);
@ -236,11 +241,15 @@ nothrow:
if (pathCache.isExistingPath(n)) if (pathCache.isExistingPath(n))
{ {
const n2i = FileName.combine(n, package_di); const n2i = FileName.combine(n, package_di);
if (FileName.exists(n2i) == 1) if (FileName.exists(n2i) == 1) {
whichPathFoundThis = pathIndex;
return n2i; return n2i;
}
FileName.free(n2i.ptr); FileName.free(n2i.ptr);
const n2 = FileName.combine(n, package_d); const n2 = FileName.combine(n, package_d);
if (FileName.exists(n2) == 1) { if (FileName.exists(n2) == 1) {
whichPathFoundThis = pathIndex;
return n2; return n2;
} }
FileName.free(n2.ptr); FileName.free(n2.ptr);
@ -258,18 +267,20 @@ nothrow:
if (FileName.exists(sc) == 1) if (FileName.exists(sc) == 1)
return sc; return sc;
scope(exit) FileName.free(sc.ptr); scope(exit) FileName.free(sc.ptr);
foreach (entry; paths) foreach (pathIndex, entry; pathsInfo)
{ {
const p = entry.toDString(); const p = entry.path.toDString();
const(char)[] n = FileName.combine(p, si); const(char)[] n = FileName.combine(p, si);
if (FileName.exists(n) == 1) { if (FileName.exists(n) == 1) {
whichPathFoundThis = pathIndex;
return n; return n;
} }
FileName.free(n.ptr); FileName.free(n.ptr);
n = FileName.combine(p, sc); n = FileName.combine(p, sc);
if (FileName.exists(n) == 1) { if (FileName.exists(n) == 1) {
whichPathFoundThis = pathIndex;
return n; return n;
} }
FileName.free(n.ptr); FileName.free(n.ptr);

View file

@ -208,11 +208,10 @@ Params:
*/ */
void addImport(const(char)[] path) void addImport(const(char)[] path)
{ {
import dmd.globals : global; import dmd.globals : global, ImportPathInfo;
import dmd.arraytypes : Strings;
import std.string : toStringz; import std.string : toStringz;
global.path.push(path.toStringz); global.path.push(ImportPathInfo(path.toStringz));
} }
/** /**

View file

@ -8330,6 +8330,18 @@ struct Verbose final
{} {}
}; };
struct ImportPathInfo final
{
const char* path;
ImportPathInfo() :
path()
{
}
ImportPathInfo(const char* path) :
path(path)
{}
};
struct Param final struct Param final
{ {
bool obj; bool obj;
@ -8386,7 +8398,7 @@ struct Param final
CLIIdentifierTable cIdentifierTable; CLIIdentifierTable cIdentifierTable;
_d_dynamicArray< const char > argv0; _d_dynamicArray< const char > argv0;
Array<const char* > modFileAliasStrings; Array<const char* > modFileAliasStrings;
Array<const char* > imppath; Array<ImportPathInfo > imppath;
Array<const char* > fileImppath; Array<const char* > fileImppath;
_d_dynamicArray< const char > objdir; _d_dynamicArray< const char > objdir;
_d_dynamicArray< const char > objname; _d_dynamicArray< const char > objname;
@ -8500,7 +8512,7 @@ struct Param final
timeTraceFile() timeTraceFile()
{ {
} }
Param(bool obj, bool multiobj = false, bool trace = false, bool tracegc = false, bool vcg_ast = false, DiagnosticReporting useDeprecated = (DiagnosticReporting)1u, bool useUnitTests = false, bool useInline = false, bool release = false, bool preservePaths = false, DiagnosticReporting useWarnings = (DiagnosticReporting)2u, bool cov = false, uint8_t covPercent = 0u, bool ctfe_cov = false, bool ignoreUnsupportedPragmas = true, bool useModuleInfo = true, bool useTypeInfo = true, bool useExceptions = true, bool useGC = true, bool betterC = false, bool addMain = false, bool allInst = false, bool bitfields = false, CppStdRevision cplusplus = (CppStdRevision)201103u, Help help = Help(), Verbose v = Verbose(), FeatureState useDIP25 = (FeatureState)2u, FeatureState useDIP1000 = (FeatureState)0u, bool ehnogc = false, bool useDIP1021 = false, FeatureState fieldwise = (FeatureState)0u, bool fixAliasThis = false, FeatureState rvalueRefParam = (FeatureState)0u, FeatureState safer = (FeatureState)0u, FeatureState noSharedAccess = (FeatureState)0u, bool previewIn = false, bool inclusiveInContracts = false, bool shortenedMethods = true, bool fixImmutableConv = false, bool fix16997 = true, FeatureState dtorFields = (FeatureState)0u, FeatureState systemVariables = (FeatureState)0u, CHECKENABLE useInvariants = (CHECKENABLE)0u, CHECKENABLE useIn = (CHECKENABLE)0u, CHECKENABLE useOut = (CHECKENABLE)0u, CHECKENABLE useArrayBounds = (CHECKENABLE)0u, CHECKENABLE useAssert = (CHECKENABLE)0u, CHECKENABLE useSwitchError = (CHECKENABLE)0u, CHECKENABLE boundscheck = (CHECKENABLE)0u, CHECKACTION checkAction = (CHECKACTION)0u, CLIIdentifierTable dIdentifierTable = (CLIIdentifierTable)0u, CLIIdentifierTable cIdentifierTable = (CLIIdentifierTable)0u, _d_dynamicArray< const char > argv0 = {}, Array<const char* > modFileAliasStrings = Array<const char* >(), Array<const char* > imppath = Array<const char* >(), Array<const char* > fileImppath = Array<const char* >(), _d_dynamicArray< const char > objdir = {}, _d_dynamicArray< const char > objname = {}, _d_dynamicArray< const char > libname = {}, Output ddoc = Output(), Output dihdr = Output(), Output cxxhdr = Output(), Output json = Output(), JsonFieldFlags jsonFieldFlags = (JsonFieldFlags)0u, Output makeDeps = Output(), Output mixinOut = Output(), Output moduleDeps = Output(), uint32_t debuglevel = 0u, uint32_t versionlevel = 0u, bool run = false, Array<const char* > runargs = Array<const char* >(), Array<const char* > cppswitches = Array<const char* >(), const char* cpp = nullptr, Array<const char* > objfiles = Array<const char* >(), Array<const char* > linkswitches = Array<const char* >(), Array<bool > linkswitchIsForCC = Array<bool >(), Array<const char* > libfiles = Array<const char* >(), Array<const char* > dllfiles = Array<const char* >(), _d_dynamicArray< const char > deffile = {}, _d_dynamicArray< const char > resfile = {}, _d_dynamicArray< const char > exefile = {}, _d_dynamicArray< const char > mapfile = {}, bool fullyQualifiedObjectFiles = false, bool timeTrace = false, uint32_t timeTraceGranularityUs = 500u, const char* timeTraceFile = nullptr) : Param(bool obj, bool multiobj = false, bool trace = false, bool tracegc = false, bool vcg_ast = false, DiagnosticReporting useDeprecated = (DiagnosticReporting)1u, bool useUnitTests = false, bool useInline = false, bool release = false, bool preservePaths = false, DiagnosticReporting useWarnings = (DiagnosticReporting)2u, bool cov = false, uint8_t covPercent = 0u, bool ctfe_cov = false, bool ignoreUnsupportedPragmas = true, bool useModuleInfo = true, bool useTypeInfo = true, bool useExceptions = true, bool useGC = true, bool betterC = false, bool addMain = false, bool allInst = false, bool bitfields = false, CppStdRevision cplusplus = (CppStdRevision)201103u, Help help = Help(), Verbose v = Verbose(), FeatureState useDIP25 = (FeatureState)2u, FeatureState useDIP1000 = (FeatureState)0u, bool ehnogc = false, bool useDIP1021 = false, FeatureState fieldwise = (FeatureState)0u, bool fixAliasThis = false, FeatureState rvalueRefParam = (FeatureState)0u, FeatureState safer = (FeatureState)0u, FeatureState noSharedAccess = (FeatureState)0u, bool previewIn = false, bool inclusiveInContracts = false, bool shortenedMethods = true, bool fixImmutableConv = false, bool fix16997 = true, FeatureState dtorFields = (FeatureState)0u, FeatureState systemVariables = (FeatureState)0u, CHECKENABLE useInvariants = (CHECKENABLE)0u, CHECKENABLE useIn = (CHECKENABLE)0u, CHECKENABLE useOut = (CHECKENABLE)0u, CHECKENABLE useArrayBounds = (CHECKENABLE)0u, CHECKENABLE useAssert = (CHECKENABLE)0u, CHECKENABLE useSwitchError = (CHECKENABLE)0u, CHECKENABLE boundscheck = (CHECKENABLE)0u, CHECKACTION checkAction = (CHECKACTION)0u, CLIIdentifierTable dIdentifierTable = (CLIIdentifierTable)0u, CLIIdentifierTable cIdentifierTable = (CLIIdentifierTable)0u, _d_dynamicArray< const char > argv0 = {}, Array<const char* > modFileAliasStrings = Array<const char* >(), Array<ImportPathInfo > imppath = Array<ImportPathInfo >(), Array<const char* > fileImppath = Array<const char* >(), _d_dynamicArray< const char > objdir = {}, _d_dynamicArray< const char > objname = {}, _d_dynamicArray< const char > libname = {}, Output ddoc = Output(), Output dihdr = Output(), Output cxxhdr = Output(), Output json = Output(), JsonFieldFlags jsonFieldFlags = (JsonFieldFlags)0u, Output makeDeps = Output(), Output mixinOut = Output(), Output moduleDeps = Output(), uint32_t debuglevel = 0u, uint32_t versionlevel = 0u, bool run = false, Array<const char* > runargs = Array<const char* >(), Array<const char* > cppswitches = Array<const char* >(), const char* cpp = nullptr, Array<const char* > objfiles = Array<const char* >(), Array<const char* > linkswitches = Array<const char* >(), Array<bool > linkswitchIsForCC = Array<bool >(), Array<const char* > libfiles = Array<const char* >(), Array<const char* > dllfiles = Array<const char* >(), _d_dynamicArray< const char > deffile = {}, _d_dynamicArray< const char > resfile = {}, _d_dynamicArray< const char > exefile = {}, _d_dynamicArray< const char > mapfile = {}, bool fullyQualifiedObjectFiles = false, bool timeTrace = false, uint32_t timeTraceGranularityUs = 500u, const char* timeTraceFile = nullptr) :
obj(obj), obj(obj),
multiobj(multiobj), multiobj(multiobj),
trace(trace), trace(trace),
@ -8595,7 +8607,8 @@ struct Global final
_d_dynamicArray< const char > inifilename; _d_dynamicArray< const char > inifilename;
_d_dynamicArray< const char > copyright; _d_dynamicArray< const char > copyright;
_d_dynamicArray< const char > written; _d_dynamicArray< const char > written;
Array<const char* > path; Array<ImportPathInfo > path;
Array<const char* > importPaths;
Array<const char* > filePath; Array<const char* > filePath;
char datetime[26LLU]; char datetime[26LLU];
CompileEnv compileEnv; CompileEnv compileEnv;
@ -8629,6 +8642,7 @@ struct Global final
copyright(73, "Copyright (C) 1999-2024 by The D Language Foundation, All Rights Reserved"), copyright(73, "Copyright (C) 1999-2024 by The D Language Foundation, All Rights Reserved"),
written(24, "written by Walter Bright"), written(24, "written by Walter Bright"),
path(), path(),
importPaths(),
filePath(), filePath(),
compileEnv(), compileEnv(),
params(), params(),
@ -8649,11 +8663,12 @@ struct Global final
preprocess() preprocess()
{ {
} }
Global(_d_dynamicArray< const char > inifilename, _d_dynamicArray< const char > copyright = { 73, "Copyright (C) 1999-2024 by The D Language Foundation, All Rights Reserved" }, _d_dynamicArray< const char > written = { 24, "written by Walter Bright" }, Array<const char* > path = Array<const char* >(), Array<const char* > filePath = Array<const char* >(), CompileEnv compileEnv = CompileEnv(), Param params = Param(), uint32_t errors = 0u, uint32_t deprecations = 0u, uint32_t warnings = 0u, uint32_t gag = 0u, uint32_t gaggedErrors = 0u, uint32_t gaggedWarnings = 0u, void* console = nullptr, Array<Identifier* > versionids = Array<Identifier* >(), Array<Identifier* > debugids = Array<Identifier* >(), bool hasMainFunction = false, uint32_t varSequenceNumber = 1u, FileManager* fileManager = nullptr, ErrorSink* errorSink = nullptr, ErrorSink* errorSinkNull = nullptr, DArray<uint8_t >(*preprocess)(FileName , const Loc& , OutBuffer& ) = nullptr) : Global(_d_dynamicArray< const char > inifilename, _d_dynamicArray< const char > copyright = { 73, "Copyright (C) 1999-2024 by The D Language Foundation, All Rights Reserved" }, _d_dynamicArray< const char > written = { 24, "written by Walter Bright" }, Array<ImportPathInfo > path = Array<ImportPathInfo >(), Array<const char* > importPaths = Array<const char* >(), Array<const char* > filePath = Array<const char* >(), CompileEnv compileEnv = CompileEnv(), Param params = Param(), uint32_t errors = 0u, uint32_t deprecations = 0u, uint32_t warnings = 0u, uint32_t gag = 0u, uint32_t gaggedErrors = 0u, uint32_t gaggedWarnings = 0u, void* console = nullptr, Array<Identifier* > versionids = Array<Identifier* >(), Array<Identifier* > debugids = Array<Identifier* >(), bool hasMainFunction = false, uint32_t varSequenceNumber = 1u, FileManager* fileManager = nullptr, ErrorSink* errorSink = nullptr, ErrorSink* errorSinkNull = nullptr, DArray<uint8_t >(*preprocess)(FileName , const Loc& , OutBuffer& ) = nullptr) :
inifilename(inifilename), inifilename(inifilename),
copyright(copyright), copyright(copyright),
written(written), written(written),
path(path), path(path),
importPaths(importPaths),
filePath(filePath), filePath(filePath),
compileEnv(compileEnv), compileEnv(compileEnv),
params(params), params(params),

View file

@ -1103,7 +1103,7 @@ Ldone:
{ {
printedMain = true; printedMain = true;
auto name = mod.srcfile.toChars(); auto name = mod.srcfile.toChars();
auto path = FileName.searchPath(global.path, name, true); auto path = FileName.searchPath(global.importPaths, name, true);
message("entry %-10s\t%s", type, path ? path : name); message("entry %-10s\t%s", type, path ? path : name);
} }
} }

View file

@ -151,6 +151,10 @@ extern(C++) struct Verbose
} }
} }
extern (C++) struct ImportPathInfo {
const(char)* path; // char*'s of where to look for import modules
}
/// Put command line switches in here /// Put command line switches in here
extern (C++) struct Param extern (C++) struct Param
{ {
@ -223,7 +227,7 @@ extern (C++) struct Param
const(char)[] argv0; // program name const(char)[] argv0; // program name
Array!(const(char)*) modFileAliasStrings; // array of char*'s of -I module filename alias strings Array!(const(char)*) modFileAliasStrings; // array of char*'s of -I module filename alias strings
Array!(const(char)*) imppath; // array of char*'s of where to look for import modules Array!(ImportPathInfo) imppath; // array of import path information of where to look for import modules
Array!(const(char)*) fileImppath; // array of char*'s of where to look for file import modules Array!(const(char)*) fileImppath; // array of char*'s of where to look for file import modules
const(char)[] objdir; // .obj/.lib file output directory const(char)[] objdir; // .obj/.lib file output directory
const(char)[] objname; // .obj file output name const(char)[] objname; // .obj file output name
@ -291,7 +295,8 @@ extern (C++) struct Global
string copyright = "Copyright (C) 1999-2024 by The D Language Foundation, All Rights Reserved"; string copyright = "Copyright (C) 1999-2024 by The D Language Foundation, All Rights Reserved";
string written = "written by Walter Bright"; string written = "written by Walter Bright";
Array!(const(char)*) path; /// Array of char*'s which form the import lookup path Array!(ImportPathInfo) path; /// Array of path informations which form the import lookup path
Array!(const(char)*) importPaths; /// Array of char*'s which form the import lookup path without metadata
Array!(const(char)*) filePath; /// Array of char*'s which form the file import lookup path Array!(const(char)*) filePath; /// Array of char*'s which form the file import lookup path
private enum string _version = import("VERSION"); private enum string _version = import("VERSION");

View file

@ -155,6 +155,11 @@ struct Verbose
unsigned errorSupplementCount(); unsigned errorSupplementCount();
}; };
struct ImportPathInfo
{
const char* path;
};
// Put command line switches in here // Put command line switches in here
struct Param struct Param
{ {
@ -227,7 +232,7 @@ struct Param
DString argv0; // program name DString argv0; // program name
Array<const char *> modFileAliasStrings; // array of char*'s of -I module filename alias strings Array<const char *> modFileAliasStrings; // array of char*'s of -I module filename alias strings
Array<const char *> imppath; // array of char*'s of where to look for import modules Array<ImportPathInfo> imppath; // array of import path information of where to look for import modules
Array<const char *> fileImppath; // array of char*'s of where to look for file import modules Array<const char *> fileImppath; // array of char*'s of where to look for file import modules
DString objdir; // .obj/.lib file output directory DString objdir; // .obj/.lib file output directory
DString objname; // .obj file output name DString objname; // .obj file output name
@ -315,8 +320,9 @@ struct Global
const DString copyright; const DString copyright;
const DString written; const DString written;
Array<const char *> path; // Array of char*'s which form the import lookup path Array<ImportPathInfo> path; // Array of path informations which form the import lookup path
Array<const char *> filePath; // Array of char*'s which form the file import lookup path Array<const char *> importPaths; // Array of char*'s which form the import lookup path without metadata
Array<const char *> filePath; // Array of char*'s which form the file import lookup path
char datetime[26]; /// string returned by ctime() char datetime[26]; /// string returned by ctime()
CompileEnv compileEnv; CompileEnv compileEnv;

View file

@ -906,7 +906,7 @@ public:
arrayStart(); arrayStart();
foreach (importPath; global.params.imppath[]) foreach (importPath; global.params.imppath[])
{ {
item(importPath.toDString); item(importPath.path.toDString);
} }
arrayEnd(); arrayEnd();

View file

@ -64,6 +64,7 @@ import dmd.root.response;
import dmd.root.rmem; import dmd.root.rmem;
import dmd.root.string; import dmd.root.string;
import dmd.root.stringtable; import dmd.root.stringtable;
import dmd.root.array;
import dmd.semantic2; import dmd.semantic2;
import dmd.semantic3; import dmd.semantic3;
import dmd.target; import dmd.target;
@ -397,7 +398,30 @@ private int tryMain(size_t argc, const(char)** argv, ref Param params)
// Build import search path // Build import search path
static void buildPath(ref Strings imppath, ref Strings result) static void buildImportPath(ref Array!ImportPathInfo imppath, ref Array!ImportPathInfo result, ref Strings pathsOnlyResult)
{
Array!ImportPathInfo array;
Strings pathsOnlyArray;
foreach (entry; imppath)
{
int sink(const(char)* p) nothrow
{
ImportPathInfo temp = entry;
temp.path = p;
array.push(temp);
return 0;
}
FileName.splitPath(&sink, entry.path);
FileName.appendSplitPath(entry.path, pathsOnlyArray);
}
result.append(&array);
pathsOnlyResult.append(&pathsOnlyArray);
}
static void buildFileImportPath(ref Strings imppath, ref Strings result)
{ {
Strings array; Strings array;
foreach (const path; imppath) foreach (const path; imppath)
@ -413,8 +437,8 @@ private int tryMain(size_t argc, const(char)** argv, ref Param params)
atexit(&flushMixins); // see comment for flushMixins atexit(&flushMixins); // see comment for flushMixins
} }
scope(exit) flushMixins(); scope(exit) flushMixins();
buildPath(params.imppath, global.path); buildImportPath(params.imppath, global.path, global.importPaths);
buildPath(params.fileImppath, global.filePath); buildFileImportPath(params.fileImppath, global.filePath);
if (params.timeTrace) if (params.timeTrace)
{ {

View file

@ -1572,7 +1572,7 @@ bool parseCommandLine(const ref Strings arguments, const size_t argc, ref Param
params.useUnitTests = true; params.useUnitTests = true;
else if (p[1] == 'I') // https://dlang.org/dmd.html#switch-I else if (p[1] == 'I') // https://dlang.org/dmd.html#switch-I
{ {
params.imppath.push(p + 2 + (p[2] == '=')); params.imppath.push(ImportPathInfo(p + 2 + (p[2] == '=')));
} }
else if (p[1] == 'm' && p[2] == 'v' && p[3] == '=') // https://dlang.org/dmd.html#switch-mv else if (p[1] == 'm' && p[2] == 'v' && p[3] == '=') // https://dlang.org/dmd.html#switch-mv
{ {