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/scope.h 9 */ 10 11#pragma once 12 13class Identifier; 14class Module; 15class Statement; 16class SwitchStatement; 17class TryFinallyStatement; 18class LabelStatement; 19class ForeachStatement; 20class ClassDeclaration; 21class AggregateDeclaration; 22class FuncDeclaration; 23class UserAttributeDeclaration; 24struct DocComment; 25struct AA; 26class TemplateInstance; 27class CPPNamespaceDeclaration; 28 29#include "dsymbol.h" 30 31enum 32{ 33 CSXthis_ctor = 1, // called this() 34 CSXsuper_ctor = 2, // called super() 35 CSXthis = 4, // referenced this 36 CSXsuper = 8, // referenced super 37 CSXlabel = 0x10, // seen a label 38 CSXreturn = 0x20, // seen a return statement 39 CSXany_ctor = 0x40, // either this() or super() was called 40 CSXhalt = 0x80, // assert(0) 41}; 42 43enum 44{ 45 // Flags that would not be inherited beyond scope nesting 46 SCOPEctor = 0x0001, // constructor type 47 SCOPEcondition = 0x0004, // inside static if/assert condition 48 SCOPEdebug = 0x0008, // inside debug conditional 49 50 // Flags that would be inherited beyond scope nesting 51 SCOPEnoaccesscheck = 0x0002, // don't do access checks 52 SCOPEconstraint = 0x0010, // inside template constraint 53 SCOPEinvariant = 0x0020, // inside invariant code 54 SCOPErequire = 0x0040, // inside in contract code 55 SCOPEensure = 0x0060, // inside out contract code 56 SCOPEcontract = 0x0060, // [mask] we're inside contract code 57 SCOPEctfe = 0x0080, // inside a ctfe-only expression 58 SCOPEcompile = 0x0100, // inside __traits(compile) 59 SCOPEignoresymbolvisibility = 0x0200, // ignore symbol visibility (Bugzilla 15907) 60 61 SCOPEfree = 0x8000, // is on free list 62 SCOPEfullinst = 0x10000, // fully instantiate templates 63 SCOPEalias = 0x20000, // inside alias declaration 64 65 // The following are mutually exclusive 66 SCOPEprintf = 0x40000, // printf-style function 67 SCOPEscanf = 0x80000, // scanf-style function 68}; 69 70struct Scope 71{ 72 Scope *enclosing; // enclosing Scope 73 74 Module *_module; // Root module 75 ScopeDsymbol *scopesym; // current symbol 76 FuncDeclaration *func; // function we are in 77 Dsymbol *parent; // parent to use 78 LabelStatement *slabel; // enclosing labelled statement 79 SwitchStatement *sw; // enclosing switch statement 80 Statement *tryBody; // enclosing _body of TryCatchStatement or TryFinallyStatement 81 TryFinallyStatement *tf; // enclosing try finally statement 82 ScopeGuardStatement *os; // enclosing scope(xxx) statement 83 Statement *sbreak; // enclosing statement that supports "break" 84 Statement *scontinue; // enclosing statement that supports "continue" 85 ForeachStatement *fes; // if nested function for ForeachStatement, this is it 86 Scope *callsc; // used for __FUNCTION__, __PRETTY_FUNCTION__ and __MODULE__ 87 Dsymbol *inunion; // !=null if processing members of a union 88 bool nofree; // true if shouldn't free it 89 bool inLoop; // true if inside a loop (where constructor calls aren't allowed) 90 int intypeof; // in typeof(exp) 91 VarDeclaration *lastVar; // Previous symbol used to prevent goto-skips-init 92 93 /* If minst && !tinst, it's in definitely non-speculative scope (eg. module member scope). 94 * If !minst && !tinst, it's in definitely speculative scope (eg. template constraint). 95 * If minst && tinst, it's in instantiated code scope without speculation. 96 * If !minst && tinst, it's in instantiated code scope with speculation. 97 */ 98 Module *minst; // root module where the instantiated templates should belong to 99 TemplateInstance *tinst; // enclosing template instance 100 101 unsigned char callSuper; // primitive flow analysis for constructors 102 unsigned char *fieldinit; 103 size_t fieldinit_dim; 104 105 AlignDeclaration *aligndecl; // alignment for struct members 106 107 /// C++ namespace this symbol belongs to 108 CPPNamespaceDeclaration *namespace_; 109 110 LINK linkage; // linkage for external functions 111 CPPMANGLE cppmangle; // C++ mangle type 112 PragmaDeclaration *inlining; // inlining strategy for functions 113 114 Visibility visibility; // visibility for class members 115 int explicitVisibility; // set if in an explicit visibility attribute 116 117 StorageClass stc; // storage class 118 119 DeprecatedDeclaration *depdecl; // customized deprecation message 120 121 unsigned flags; 122 123 UserAttributeDeclaration *userAttribDecl; // user defined attributes 124 125 DocComment *lastdc; // documentation comment for last symbol at this scope 126 AA *anchorCounts; // lookup duplicate anchor name count 127 Identifier *prevAnchor; // qualified symbol name of last doc anchor 128 129 AliasDeclaration *aliasAsg; // if set, then aliasAsg is being assigned a new value, 130 // do not set wasRead for it 131 Scope(); 132 133 Scope *copy(); 134 135 Scope *push(); 136 Scope *push(ScopeDsymbol *ss); 137 Scope *pop(); 138 139 Scope *startCTFE(); 140 Scope *endCTFE(); 141 142 Dsymbol *search(const Loc &loc, Identifier *ident, Dsymbol **pscopesym, int flags = IgnoreNone); 143 144 ClassDeclaration *getClassScope(); 145 AggregateDeclaration *getStructClassScope(); 146 147 structalign_t alignment(); 148 149 bool isDeprecated() const; 150}; 151