Home | History | Annotate | Line # | Download | only in dmd
      1      1.1  mrg 
      2      1.1  mrg /* Compiler implementation of the D programming language
      3  1.1.1.2  mrg  * Copyright (C) 1999-2022 by The D Language Foundation, All Rights Reserved
      4      1.1  mrg  * written by Walter Bright
      5  1.1.1.2  mrg  * https://www.digitalmars.com
      6      1.1  mrg  * Distributed under the Boost Software License, Version 1.0.
      7  1.1.1.2  mrg  * https://www.boost.org/LICENSE_1_0.txt
      8      1.1  mrg  * https://github.com/dlang/dmd/blob/master/src/dmd/init.h
      9      1.1  mrg  */
     10      1.1  mrg 
     11      1.1  mrg #pragma once
     12      1.1  mrg 
     13  1.1.1.2  mrg #include "ast_node.h"
     14      1.1  mrg #include "globals.h"
     15      1.1  mrg #include "arraytypes.h"
     16      1.1  mrg #include "visitor.h"
     17      1.1  mrg 
     18      1.1  mrg class Identifier;
     19      1.1  mrg class Expression;
     20      1.1  mrg class Type;
     21      1.1  mrg class ErrorInitializer;
     22      1.1  mrg class VoidInitializer;
     23      1.1  mrg class StructInitializer;
     24      1.1  mrg class ArrayInitializer;
     25      1.1  mrg class ExpInitializer;
     26  1.1.1.2  mrg class CInitializer;
     27      1.1  mrg 
     28      1.1  mrg enum NeedInterpret { INITnointerpret, INITinterpret };
     29      1.1  mrg 
     30  1.1.1.2  mrg class Initializer : public ASTNode
     31      1.1  mrg {
     32      1.1  mrg public:
     33      1.1  mrg     Loc loc;
     34  1.1.1.2  mrg     unsigned char kind;
     35  1.1.1.2  mrg 
     36  1.1.1.2  mrg     const char *toChars() const;
     37  1.1.1.2  mrg 
     38  1.1.1.2  mrg     ErrorInitializer   *isErrorInitializer();
     39  1.1.1.2  mrg     VoidInitializer    *isVoidInitializer();
     40  1.1.1.2  mrg     StructInitializer  *isStructInitializer();
     41  1.1.1.2  mrg     ArrayInitializer   *isArrayInitializer();
     42  1.1.1.2  mrg     ExpInitializer     *isExpInitializer();
     43  1.1.1.2  mrg     CInitializer       *isCInitializer();
     44      1.1  mrg 
     45  1.1.1.2  mrg     void accept(Visitor *v) { v->visit(this); }
     46      1.1  mrg };
     47      1.1  mrg 
     48      1.1  mrg class VoidInitializer : public Initializer
     49      1.1  mrg {
     50      1.1  mrg public:
     51      1.1  mrg     Type *type;         // type that this will initialize to
     52      1.1  mrg 
     53      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
     54      1.1  mrg };
     55      1.1  mrg 
     56      1.1  mrg class ErrorInitializer : public Initializer
     57      1.1  mrg {
     58      1.1  mrg public:
     59      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
     60      1.1  mrg };
     61      1.1  mrg 
     62      1.1  mrg class StructInitializer : public Initializer
     63      1.1  mrg {
     64      1.1  mrg public:
     65      1.1  mrg     Identifiers field;  // of Identifier *'s
     66      1.1  mrg     Initializers value; // parallel array of Initializer *'s
     67      1.1  mrg 
     68      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
     69      1.1  mrg };
     70      1.1  mrg 
     71      1.1  mrg class ArrayInitializer : public Initializer
     72      1.1  mrg {
     73      1.1  mrg public:
     74      1.1  mrg     Expressions index;  // indices
     75      1.1  mrg     Initializers value; // of Initializer *'s
     76      1.1  mrg     unsigned dim;       // length of array being initialized
     77      1.1  mrg     Type *type;         // type that array will be used to initialize
     78      1.1  mrg     bool sem;           // true if semantic() is run
     79      1.1  mrg 
     80  1.1.1.2  mrg     bool isAssociativeArray() const;
     81      1.1  mrg     Expression *toAssocArrayLiteral();
     82      1.1  mrg 
     83      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
     84      1.1  mrg };
     85      1.1  mrg 
     86      1.1  mrg class ExpInitializer : public Initializer
     87      1.1  mrg {
     88      1.1  mrg public:
     89      1.1  mrg     bool expandTuples;
     90  1.1.1.2  mrg     Expression *exp;
     91  1.1.1.2  mrg 
     92  1.1.1.2  mrg     void accept(Visitor *v) { v->visit(this); }
     93  1.1.1.2  mrg };
     94      1.1  mrg 
     95  1.1.1.2  mrg struct Designator
     96  1.1.1.2  mrg {
     97  1.1.1.2  mrg     Expression *exp;
     98  1.1.1.2  mrg     Identifier *ident;
     99  1.1.1.2  mrg };
    100  1.1.1.2  mrg 
    101  1.1.1.2  mrg struct DesigInit
    102  1.1.1.2  mrg {
    103  1.1.1.2  mrg     Designators *designatorList;
    104  1.1.1.2  mrg     Initializer *initializer;
    105  1.1.1.2  mrg };
    106  1.1.1.2  mrg 
    107  1.1.1.2  mrg class CInitializer : public Initializer
    108  1.1.1.2  mrg {
    109  1.1.1.2  mrg public:
    110  1.1.1.2  mrg     DesigInits initializerList;
    111  1.1.1.2  mrg     Type *type;         // type that array will be used to initialize
    112  1.1.1.2  mrg     bool sem;           // true if semantic() is run
    113      1.1  mrg 
    114      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    115      1.1  mrg };
    116      1.1  mrg 
    117  1.1.1.2  mrg Expression *initializerToExpression(Initializer *init, Type *t = NULL, const bool isCfile = false);
    118