2 /* Compiler implementation of the D programming language
3 * Copyright (C) 1999-2023 by The D Language Foundation, All Rights Reserved
4 * written by Walter Bright
5 * https://www.digitalmars.com
6 * Distributed under the Boost Software License, Version 1.0.
7 * https://www.boost.org/LICENSE_1_0.txt
8 * https://github.com/dlang/dmd/blob/master/src/dmd/module.h
15 struct ModuleDeclaration
;
21 void* internal
; // PIMPL
26 PKGunknown
, // not yet determined whether it's a package.d or not
27 PKGmodule
, // already determined that's an actual package.d
28 PKGpackage
// already determined that's an actual package
31 class Package
: public ScopeDsymbol
35 unsigned tag
; // auto incremented tag, used to mask package tree in scopes
36 Module
*mod
; // != NULL if isPkgMod == PKGmodule
38 const char *kind() const override
;
40 bool equals(const RootObject
* const o
) const override
;
42 Package
*isPackage() override final
{ return this; }
44 bool isAncestorPackageOf(const Package
* const pkg
) const;
46 Dsymbol
*search(const Loc
&loc
, Identifier
*ident
, int flags
= SearchLocalsOnly
) override
;
47 void accept(Visitor
*v
) override
{ v
->visit(this); }
49 Module
*isPackageMod();
52 class Module final
: public Package
55 static Module
*rootModule
;
56 static DsymbolTable
*modules
; // symbol table of all modules
57 static Modules amodules
; // array of all modules
58 static Dsymbols deferred
; // deferred Dsymbol's needing semantic() run on them
59 static Dsymbols deferred2
; // deferred Dsymbol's needing semantic2() run on them
60 static Dsymbols deferred3
; // deferred Dsymbol's needing semantic3() run on them
64 static AggregateDeclaration
*moduleinfo
;
67 DString arg
; // original argument name
68 ModuleDeclaration
*md
; // if !NULL, the contents of the ModuleDeclaration declaration
69 FileName srcfile
; // input source file
70 FileName objfile
; // output .obj file
71 FileName hdrfile
; // 'header' file
72 FileName docfile
; // output documentation file
73 DArray
<unsigned char> src
; // Raw content of the file
74 unsigned errors
; // if any errors in file
75 unsigned numlines
; // number of lines in source file
76 FileType filetype
; // source file type
77 bool hasAlwaysInlines
; // contains references to functions that must be inlined
78 bool isPackageFile
; // if it is a package.d
79 Package
*pkg
; // if isPackageFile is true, the Package that contains this package.d
80 Strings contentImportedFiles
; // array of files whose content was imported
82 ThreeState selfimports
;
83 ThreeState rootimports
;
84 void* tagSymTab
; // ImportC: tag symbols that conflict with other symbols used as the index
85 OutBuffer defines
; // collect all the #define lines here
86 bool selfImports(); // returns true if module imports itself
88 bool rootImports(); // returns true if module imports root module
90 Identifier
*searchCacheIdent
;
91 Dsymbol
*searchCacheSymbol
; // cached value of search
92 int searchCacheFlags
; // cached flags
95 // module from command line we're imported from,
96 // i.e. a module that will be taken all the
97 // way to an object file
100 Dsymbols
*decldefs
; // top level declarations for this Module
102 Modules aimports
; // all imported modules
104 unsigned debuglevel
; // debug level
105 Identifiers
*debugids
; // debug identifiers
106 Identifiers
*debugidsNot
; // forward referenced debug identifiers
108 unsigned versionlevel
; // version level
109 Identifiers
*versionids
; // version identifiers
110 Identifiers
*versionidsNot
; // forward referenced version identifiers
112 MacroTable macrotable
; // document comment macros
113 Escape
*escapetable
; // document comment escapes
115 size_t nameoffset
; // offset of module name from start of ModuleInfo
116 size_t namelen
; // length of module name in characters
118 static Module
* create(const char *arg
, Identifier
*ident
, int doDocComment
, int doHdrGen
);
119 static const char *find(const char *filename
);
120 static Module
*load(const Loc
&loc
, Identifiers
*packages
, Identifier
*ident
);
122 const char *kind() const override
;
123 bool read(const Loc
&loc
); // read file, returns 'true' if succeed, 'false' otherwise.
124 Module
*parse(); // syntactic parse
125 void importAll(Scope
*sc
) override
;
126 int needModuleInfo();
127 Dsymbol
*search(const Loc
&loc
, Identifier
*ident
, int flags
= SearchLocalsOnly
) override
;
128 bool isPackageAccessible(Package
*p
, Visibility visibility
, int flags
= 0) override
;
129 Dsymbol
*symtabInsert(Dsymbol
*s
) override
;
130 void deleteObjFile();
131 static void runDeferredSemantic();
132 static void runDeferredSemantic2();
133 static void runDeferredSemantic3();
134 int imports(Module
*m
);
136 bool isRoot() { return this->importedFrom
== this; }
137 // true if the module source file is directly
138 // listed in command line.
139 bool isCoreModule(Identifier
*ident
);
143 int doppelganger
; // sub-module
144 Symbol
*cov
; // private uint[] __coverage;
145 unsigned *covb
; // bit array of valid code line numbers
147 Symbol
*sictor
; // module order independent constructor
148 Symbol
*sctor
; // module constructor
149 Symbol
*sdtor
; // module destructor
150 Symbol
*ssharedctor
; // module shared constructor
151 Symbol
*sshareddtor
; // module shared destructor
152 Symbol
*stest
; // module unit test
154 Symbol
*sfilename
; // symbol for filename
156 void *ctfe_cov
; // stores coverage information from ctfe
158 Module
*isModule() override
{ return this; }
159 void accept(Visitor
*v
) override
{ v
->visit(this); }
163 struct ModuleDeclaration
167 DArray
<Identifier
*> packages
; // array of Identifier's representing packages
168 bool isdeprecated
; // if it is a deprecated module
171 const char *toChars() const;
174 extern void getLocalClasses(Module
* mod
, Array
<ClassDeclaration
* >& aclasses
);