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