155714Skris 255714Skris/* Compiler implementation of the D programming language 355714Skris * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved 455714Skris * written by Walter Bright 555714Skris * http://www.digitalmars.com 655714Skris * Distributed under the Boost Software License, Version 1.0. 755714Skris * http://www.boost.org/LICENSE_1_0.txt 855714Skris * https://github.com/dlang/dmd/blob/master/src/dmd/enum.h 955714Skris */ 1055714Skris 1155714Skris#pragma once 1255714Skris 1355714Skris#include "root/root.h" 1455714Skris#include "dsymbol.h" 1555714Skris#include "declaration.h" 16#include "tokens.h" 17 18class Identifier; 19class Type; 20class Expression; 21class VarDeclaration; 22 23class EnumDeclaration : public ScopeDsymbol 24{ 25public: 26 /* The separate, and distinct, cases are: 27 * 1. enum { ... } 28 * 2. enum : memtype { ... } 29 * 3. enum id { ... } 30 * 4. enum id : memtype { ... } 31 * 5. enum id : memtype; 32 * 6. enum id; 33 */ 34 Type *type; // the TypeEnum 35 Type *memtype; // type of the members 36 Prot protection; 37 38 Expression *maxval; 39 Expression *minval; 40 Expression *defaultval; // default initializer 41 42 bool isdeprecated; 43 bool added; 44 int inuse; 45 46 EnumDeclaration(Loc loc, Identifier *id, Type *memtype); 47 Dsymbol *syntaxCopy(Dsymbol *s); 48 void addMember(Scope *sc, ScopeDsymbol *sds); 49 void setScope(Scope *sc); 50 void semantic(Scope *sc); 51 bool oneMember(Dsymbol **ps, Identifier *ident); 52 Type *getType(); 53 const char *kind() const; 54 Dsymbol *search(const Loc &loc, Identifier *ident, int flags = SearchLocalsOnly); 55 bool isDeprecated(); // is Dsymbol deprecated? 56 Prot prot(); 57 Expression *getMaxMinValue(Loc loc, Identifier *id); 58 bool isSpecial() const; 59 Expression *getDefaultValue(Loc loc); 60 Type *getMemtype(Loc loc); 61 62 EnumDeclaration *isEnumDeclaration() { return this; } 63 64 Symbol *sinit; 65 void accept(Visitor *v) { v->visit(this); } 66}; 67 68 69class EnumMember : public VarDeclaration 70{ 71public: 72 /* Can take the following forms: 73 * 1. id 74 * 2. id = value 75 * 3. type id = value 76 */ 77 Expression *&value(); 78 79 // A cast() is injected to 'value' after semantic(), 80 // but 'origValue' will preserve the original value, 81 // or previous value + 1 if none was specified. 82 Expression *origValue; 83 Type *origType; 84 85 EnumDeclaration *ed; 86 87 EnumMember(Loc loc, Identifier *id, Expression *value, Type *origType); 88 Dsymbol *syntaxCopy(Dsymbol *s); 89 const char *kind() const; 90 void semantic(Scope *sc); 91 Expression *getVarExp(Loc loc, Scope *sc); 92 93 EnumMember *isEnumMember() { return this; } 94 void accept(Visitor *v) { v->visit(this); } 95}; 96