1 2 /* Compiler implementation of the D programming language 3 * Copyright (C) 1999-2022 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 9 */ 10 11 #pragma once 12 13 #include "dsymbol.h" 14 15 struct ModuleDeclaration; 16 struct Escape; 17 struct FileBuffer; 18 19 struct MacroTable 20 { 21 void* internal; // PIMPL 22 }; 23 24 enum PKG 25 { 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 29 }; 30 31 class Package : public ScopeDsymbol 32 { 33 public: 34 PKG isPkgMod; 35 unsigned tag; // auto incremented tag, used to mask package tree in scopes 36 Module *mod; // != NULL if isPkgMod == PKGmodule 37 38 const char *kind() const; 39 40 bool equals(const RootObject *o) const; 41 isPackage()42 Package *isPackage() { return this; } 43 44 bool isAncestorPackageOf(const Package * const pkg) const; 45 46 Dsymbol *search(const Loc &loc, Identifier *ident, int flags = SearchLocalsOnly); accept(Visitor * v)47 void accept(Visitor *v) { v->visit(this); } 48 49 Module *isPackageMod(); 50 }; 51 52 class Module : public Package 53 { 54 public: 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 61 static unsigned dprogress; // progress resolving the deferred list 62 63 static void _init(); 64 65 static AggregateDeclaration *moduleinfo; 66 67 68 DString arg; // original argument name 69 ModuleDeclaration *md; // if !NULL, the contents of the ModuleDeclaration declaration 70 FileName srcfile; // input source file 71 FileName objfile; // output .obj file 72 FileName hdrfile; // 'header' file 73 FileName docfile; // output documentation file 74 DArray<unsigned char> src; // Raw content of the file 75 unsigned errors; // if any errors in file 76 unsigned numlines; // number of lines in source file 77 FileType filetype; // source file type 78 bool hasAlwaysInlines; // contains references to functions that must be inlined 79 bool isPackageFile; // if it is a package.d 80 Package *pkg; // if isPackageFile is true, the Package that contains this package.d 81 Strings contentImportedFiles; // array of files whose content was imported 82 int needmoduleinfo; 83 int selfimports; // 0: don't know, 1: does not, 2: does 84 void* tagSymTab; // ImportC: tag symbols that conflict with other symbols used as the index 85 bool selfImports(); // returns true if module imports itself 86 87 int rootimports; // 0: don't know, 1: does not, 2: does 88 bool rootImports(); // returns true if module imports root module 89 90 int insearch; 91 Identifier *searchCacheIdent; 92 Dsymbol *searchCacheSymbol; // cached value of search 93 int searchCacheFlags; // cached flags 94 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 98 Module *importedFrom; 99 100 Dsymbols *decldefs; // top level declarations for this Module 101 102 Modules aimports; // all imported modules 103 104 unsigned debuglevel; // debug level 105 Identifiers *debugids; // debug identifiers 106 Identifiers *debugidsNot; // forward referenced debug identifiers 107 108 unsigned versionlevel; // version level 109 Identifiers *versionids; // version identifiers 110 Identifiers *versionidsNot; // forward referenced version identifiers 111 112 MacroTable macrotable; // document comment macros 113 Escape *escapetable; // document comment escapes 114 115 size_t nameoffset; // offset of module name from start of ModuleInfo 116 size_t namelen; // length of module name in characters 117 118 static Module* create(const char *arg, Identifier *ident, int doDocComment, int doHdrGen); 119 120 static Module *load(const Loc &loc, Identifiers *packages, Identifier *ident); 121 122 const char *kind() const; 123 bool read(const Loc &loc); // read file, returns 'true' if succeed, 'false' otherwise. 124 Module *parse(); // syntactic parse 125 void importAll(Scope *sc); 126 int needModuleInfo(); 127 Dsymbol *search(const Loc &loc, Identifier *ident, int flags = SearchLocalsOnly); 128 bool isPackageAccessible(Package *p, Visibility visibility, int flags = 0); 129 Dsymbol *symtabInsert(Dsymbol *s); 130 void deleteObjFile(); 131 static void runDeferredSemantic(); 132 static void runDeferredSemantic2(); 133 static void runDeferredSemantic3(); 134 int imports(Module *m); 135 isRoot()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); 140 141 // Back end 142 143 int doppelganger; // sub-module 144 Symbol *cov; // private uint[] __coverage; 145 unsigned *covb; // bit array of valid code line numbers 146 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 153 154 Symbol *sfilename; // symbol for filename 155 156 void *ctfe_cov; // stores coverage information from ctfe 157 isModule()158 Module *isModule() { return this; } accept(Visitor * v)159 void accept(Visitor *v) { v->visit(this); } 160 }; 161 162 163 struct ModuleDeclaration 164 { 165 Loc loc; 166 Identifier *id; 167 DArray<Identifier*> packages; // array of Identifier's representing packages 168 bool isdeprecated; // if it is a deprecated module 169 Expression *msg; 170 171 const char *toChars() const; 172 }; 173