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