| |
| /* Compiler implementation of the D programming language |
| * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved |
| * written by Walter Bright |
| * http://www.digitalmars.com |
| * Distributed under the Boost Software License, Version 1.0. |
| * http://www.boost.org/LICENSE_1_0.txt |
| * https://github.com/dlang/dmd/blob/master/src/dmd/init.h |
| */ |
| |
| #pragma once |
| |
| #include "root/root.h" |
| |
| #include "globals.h" |
| #include "arraytypes.h" |
| #include "visitor.h" |
| |
| class Identifier; |
| class Expression; |
| struct Scope; |
| class Type; |
| class AggregateDeclaration; |
| class ErrorInitializer; |
| class VoidInitializer; |
| class StructInitializer; |
| class ArrayInitializer; |
| class ExpInitializer; |
| |
| enum NeedInterpret { INITnointerpret, INITinterpret }; |
| |
| class Initializer : public RootObject |
| { |
| public: |
| Loc loc; |
| |
| Initializer(Loc loc); |
| virtual Initializer *syntaxCopy() = 0; |
| static Initializers *arraySyntaxCopy(Initializers *ai); |
| |
| const char *toChars(); |
| |
| virtual ErrorInitializer *isErrorInitializer() { return NULL; } |
| virtual VoidInitializer *isVoidInitializer() { return NULL; } |
| virtual StructInitializer *isStructInitializer() { return NULL; } |
| virtual ArrayInitializer *isArrayInitializer() { return NULL; } |
| virtual ExpInitializer *isExpInitializer() { return NULL; } |
| virtual void accept(Visitor *v) { v->visit(this); } |
| }; |
| |
| class VoidInitializer : public Initializer |
| { |
| public: |
| Type *type; // type that this will initialize to |
| |
| VoidInitializer(Loc loc); |
| Initializer *syntaxCopy(); |
| |
| virtual VoidInitializer *isVoidInitializer() { return this; } |
| void accept(Visitor *v) { v->visit(this); } |
| }; |
| |
| class ErrorInitializer : public Initializer |
| { |
| public: |
| ErrorInitializer(); |
| Initializer *syntaxCopy(); |
| |
| virtual ErrorInitializer *isErrorInitializer() { return this; } |
| void accept(Visitor *v) { v->visit(this); } |
| }; |
| |
| class StructInitializer : public Initializer |
| { |
| public: |
| Identifiers field; // of Identifier *'s |
| Initializers value; // parallel array of Initializer *'s |
| |
| StructInitializer(Loc loc); |
| Initializer *syntaxCopy(); |
| void addInit(Identifier *field, Initializer *value); |
| |
| StructInitializer *isStructInitializer() { return this; } |
| void accept(Visitor *v) { v->visit(this); } |
| }; |
| |
| class ArrayInitializer : public Initializer |
| { |
| public: |
| Expressions index; // indices |
| Initializers value; // of Initializer *'s |
| unsigned dim; // length of array being initialized |
| Type *type; // type that array will be used to initialize |
| bool sem; // true if semantic() is run |
| |
| ArrayInitializer(Loc loc); |
| Initializer *syntaxCopy(); |
| void addInit(Expression *index, Initializer *value); |
| bool isAssociativeArray(); |
| Expression *toAssocArrayLiteral(); |
| |
| ArrayInitializer *isArrayInitializer() { return this; } |
| void accept(Visitor *v) { v->visit(this); } |
| }; |
| |
| class ExpInitializer : public Initializer |
| { |
| public: |
| Expression *exp; |
| bool expandTuples; |
| |
| ExpInitializer(Loc loc, Expression *exp); |
| Initializer *syntaxCopy(); |
| |
| ExpInitializer *isExpInitializer() { return this; } |
| void accept(Visitor *v) { v->visit(this); } |
| }; |
| |
| Expression *initializerToExpression(Initializer *init, Type *t = NULL); |