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/cond.h
      9  */
     10 
     11 #pragma once
     12 
     13 #include "ast_node.h"
     14 #include "globals.h"
     15 #include "visitor.h"
     16 
     17 class Expression;
     18 class Identifier;
     19 class Module;
     20 struct Scope;
     21 class DebugCondition;
     22 class ForeachStatement;
     23 class ForeachRangeStatement;
     24 
     25 enum Include
     26 {
     27     INCLUDEnotComputed, /// not computed yet
     28     INCLUDEyes,         /// include the conditional code
     29     INCLUDEno           /// do not include the conditional code
     30 };
     31 
     32 class Condition : public ASTNode
     33 {
     34 public:
     35     Loc loc;
     36     Include inc;
     37 
     38     virtual Condition *syntaxCopy() = 0;
     39     virtual int include(Scope *sc) = 0;
     40     virtual DebugCondition *isDebugCondition() { return NULL; }
     41     virtual VersionCondition *isVersionCondition() { return NULL; }
     42     void accept(Visitor *v) { v->visit(this); }
     43 };
     44 
     45 class StaticForeach
     46 {
     47 public:
     48     Loc loc;
     49 
     50     ForeachStatement *aggrfe;
     51     ForeachRangeStatement *rangefe;
     52 
     53     bool needExpansion;
     54 
     55     StaticForeach *syntaxCopy();
     56 };
     57 
     58 class DVCondition : public Condition
     59 {
     60 public:
     61     unsigned level;
     62     Identifier *ident;
     63     Module *mod;
     64 
     65     DVCondition *syntaxCopy();
     66     void accept(Visitor *v) { v->visit(this); }
     67 };
     68 
     69 class DebugCondition : public DVCondition
     70 {
     71 public:
     72     static void addGlobalIdent(const char *ident);
     73 
     74     int include(Scope *sc);
     75     DebugCondition *isDebugCondition() { return this; }
     76     void accept(Visitor *v) { v->visit(this); }
     77 };
     78 
     79 class VersionCondition : public DVCondition
     80 {
     81 public:
     82     static void addGlobalIdent(const char *ident);
     83     static void addPredefinedGlobalIdent(const char *ident);
     84 
     85     int include(Scope *sc);
     86     VersionCondition *isVersionCondition() { return this; }
     87     void accept(Visitor *v) { v->visit(this); }
     88 };
     89 
     90 class StaticIfCondition : public Condition
     91 {
     92 public:
     93     Expression *exp;
     94 
     95     StaticIfCondition *syntaxCopy();
     96     int include(Scope *sc);
     97     void accept(Visitor *v) { v->visit(this); }
     98 };
     99