Home | History | Annotate | Line # | Download | only in dmd
      1 
      2 /* Compiler implementation of the D programming language
      3  * Copyright (C) 1999-2022 by The D Language Foundation, All Rights Reserved
      4  * written by Walter Bright
      5  * https://www.digitalmars.com
      6  * Distributed under the Boost Software License, Version 1.0.
      7  * https://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 
     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 
     53     void accept(Visitor *v) { v->visit(this); }
     54 };
     55 
     56 class ErrorInitializer : public Initializer
     57 {
     58 public:
     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 
     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 
     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 
     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 
    114     void accept(Visitor *v) { v->visit(this); }
    115 };
    116 
    117 Expression *initializerToExpression(Initializer *init, Type *t = NULL, const bool isCfile = false);
    118