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