1 2 /* Compiler implementation of the D programming language 3 * Copyright (C) 1999-2021 by The D Language Foundation, All Rights Reserved 4 * written by Walter Bright 5 * http://www.digitalmars.com 6 * Distributed under the Boost Software License, Version 1.0. 7 * http://www.boost.org/LICENSE_1_0.txt 8 * https://github.com/dlang/dmd/blob/master/src/dmd/init.h 9 */ 10 11 #pragma once 12 13 #include "ast_node.h" 14 #include "globals.h" 15 #include "arraytypes.h" 16 #include "visitor.h" 17 18 class Identifier; 19 class Expression; 20 class Type; 21 class ErrorInitializer; 22 class VoidInitializer; 23 class StructInitializer; 24 class ArrayInitializer; 25 class ExpInitializer; 26 class CInitializer; 27 28 enum NeedInterpret { INITnointerpret, INITinterpret }; 29 30 class Initializer : public ASTNode 31 { 32 public: 33 Loc loc; 34 unsigned char kind; 35 36 const char *toChars() const; 37 38 ErrorInitializer *isErrorInitializer(); 39 VoidInitializer *isVoidInitializer(); 40 StructInitializer *isStructInitializer(); 41 ArrayInitializer *isArrayInitializer(); 42 ExpInitializer *isExpInitializer(); 43 CInitializer *isCInitializer(); 44 accept(Visitor * v)45 void accept(Visitor *v) { v->visit(this); } 46 }; 47 48 class VoidInitializer : public Initializer 49 { 50 public: 51 Type *type; // type that this will initialize to 52 accept(Visitor * v)53 void accept(Visitor *v) { v->visit(this); } 54 }; 55 56 class ErrorInitializer : public Initializer 57 { 58 public: accept(Visitor * v)59 void accept(Visitor *v) { v->visit(this); } 60 }; 61 62 class StructInitializer : public Initializer 63 { 64 public: 65 Identifiers field; // of Identifier *'s 66 Initializers value; // parallel array of Initializer *'s 67 accept(Visitor * v)68 void accept(Visitor *v) { v->visit(this); } 69 }; 70 71 class ArrayInitializer : public Initializer 72 { 73 public: 74 Expressions index; // indices 75 Initializers value; // of Initializer *'s 76 unsigned dim; // length of array being initialized 77 Type *type; // type that array will be used to initialize 78 bool sem; // true if semantic() is run 79 80 bool isAssociativeArray() const; 81 Expression *toAssocArrayLiteral(); 82 accept(Visitor * v)83 void accept(Visitor *v) { v->visit(this); } 84 }; 85 86 class ExpInitializer : public Initializer 87 { 88 public: 89 bool expandTuples; 90 Expression *exp; 91 accept(Visitor * v)92 void accept(Visitor *v) { v->visit(this); } 93 }; 94 95 struct Designator 96 { 97 Expression *exp; 98 Identifier *ident; 99 }; 100 101 struct DesigInit 102 { 103 Designators *designatorList; 104 Initializer *initializer; 105 }; 106 107 class CInitializer : public Initializer 108 { 109 public: 110 DesigInits initializerList; 111 Type *type; // type that array will be used to initialize 112 bool sem; // true if semantic() is run 113 accept(Visitor * v)114 void accept(Visitor *v) { v->visit(this); } 115 }; 116 117 Expression *initializerToExpression(Initializer *init, Type *t = NULL); 118