mirror of
https://github.com/dlang/dmd.git
synced 2025-04-28 22:20:37 +03:00
Prepare import paths mechanism for metadata
This commit is contained in:
parent
605ca0f009
commit
12d4f3e4d6
11 changed files with 109 additions and 36 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue