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