Home | History | Annotate | Line # | Download | only in dmd
      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 
     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);
     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 
    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 
    158     Module *isModule() { return this; }
    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