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