1 2 /* Compiler implementation of the D programming language 3 * Copyright (C) 1999-2019 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 "root/root.h" 14 15 #include "globals.h" 16 #include "arraytypes.h" 17 #include "visitor.h" 18 19 class Identifier; 20 class Expression; 21 struct Scope; 22 class Type; 23 class AggregateDeclaration; 24 class ErrorInitializer; 25 class VoidInitializer; 26 class StructInitializer; 27 class ArrayInitializer; 28 class ExpInitializer; 29 30 enum NeedInterpret { INITnointerpret, INITinterpret }; 31 32 class Initializer : public RootObject 33 { 34 public: 35 Loc loc; 36 37 Initializer(Loc loc); 38 virtual Initializer *syntaxCopy() = 0; 39 static Initializers *arraySyntaxCopy(Initializers *ai); 40 41 const char *toChars(); 42 isErrorInitializer()43 virtual ErrorInitializer *isErrorInitializer() { return NULL; } isVoidInitializer()44 virtual VoidInitializer *isVoidInitializer() { return NULL; } isStructInitializer()45 virtual StructInitializer *isStructInitializer() { return NULL; } isArrayInitializer()46 virtual ArrayInitializer *isArrayInitializer() { return NULL; } isExpInitializer()47 virtual ExpInitializer *isExpInitializer() { return NULL; } accept(Visitor * v)48 virtual void accept(Visitor *v) { v->visit(this); } 49 }; 50 51 class VoidInitializer : public Initializer 52 { 53 public: 54 Type *type; // type that this will initialize to 55 56 VoidInitializer(Loc loc); 57 Initializer *syntaxCopy(); 58 isVoidInitializer()59 virtual VoidInitializer *isVoidInitializer() { return this; } accept(Visitor * v)60 void accept(Visitor *v) { v->visit(this); } 61 }; 62 63 class ErrorInitializer : public Initializer 64 { 65 public: 66 ErrorInitializer(); 67 Initializer *syntaxCopy(); 68 isErrorInitializer()69 virtual ErrorInitializer *isErrorInitializer() { return this; } accept(Visitor * v)70 void accept(Visitor *v) { v->visit(this); } 71 }; 72 73 class StructInitializer : public Initializer 74 { 75 public: 76 Identifiers field; // of Identifier *'s 77 Initializers value; // parallel array of Initializer *'s 78 79 StructInitializer(Loc loc); 80 Initializer *syntaxCopy(); 81 void addInit(Identifier *field, Initializer *value); 82 isStructInitializer()83 StructInitializer *isStructInitializer() { return this; } accept(Visitor * v)84 void accept(Visitor *v) { v->visit(this); } 85 }; 86 87 class ArrayInitializer : public Initializer 88 { 89 public: 90 Expressions index; // indices 91 Initializers value; // of Initializer *'s 92 unsigned dim; // length of array being initialized 93 Type *type; // type that array will be used to initialize 94 bool sem; // true if semantic() is run 95 96 ArrayInitializer(Loc loc); 97 Initializer *syntaxCopy(); 98 void addInit(Expression *index, Initializer *value); 99 bool isAssociativeArray(); 100 Expression *toAssocArrayLiteral(); 101 isArrayInitializer()102 ArrayInitializer *isArrayInitializer() { return this; } accept(Visitor * v)103 void accept(Visitor *v) { v->visit(this); } 104 }; 105 106 class ExpInitializer : public Initializer 107 { 108 public: 109 Expression *exp; 110 bool expandTuples; 111 112 ExpInitializer(Loc loc, Expression *exp); 113 Initializer *syntaxCopy(); 114 isExpInitializer()115 ExpInitializer *isExpInitializer() { return this; } accept(Visitor * v)116 void accept(Visitor *v) { v->visit(this); } 117 }; 118 119 Expression *initializerToExpression(Initializer *init, Type *t = NULL); 120