src/compiler/AST.h
author David Anderson <dvander@alliedmods.net>
Sat Dec 29 00:55:38 2012 -0800 (2012-12-29)
changeset 250 0998a43cc155
parent 247 7721042bdb67
child 251 ca99a81745fe
permissions -rw-r--r--
Collect error messages per-translation unit.
dvander@132
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@132
     2
 *
dvander@0
     3
 * Copyright (C) 2012 David Anderson
dvander@0
     4
 *
dvander@132
     5
 * This file is part of SourcePawn.
dvander@0
     6
 *
dvander@132
     7
 * SourcePawn is free software: you can redistribute it and/or modify it under
dvander@0
     8
 * the terms of the GNU General Public License as published by the Free
dvander@0
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
    10
 * any later version.
dvander@0
    11
 * 
dvander@132
    12
 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    15
 *
dvander@0
    16
 * You should have received a copy of the GNU General Public License along with
dvander@132
    17
 * SourcePawn. If not, see http://www.gnu.org/licenses/.
dvander@0
    18
 */
dvander@168
    19
#ifndef _include_sourcepawn_ast_h_
dvander@168
    20
#define _include_sourcepawn_ast_h_
dvander@0
    21
dvander@195
    22
#include "../PoolAllocator.h"
dvander@195
    23
#include "../Vector.h"
dvander@0
    24
#include "Token.h"
dvander@0
    25
#include "NameBinding.h"
dvander@195
    26
#include "Symbols.h"
dvander@0
    27
dvander@59
    28
namespace ke {
dvander@0
    29
dvander@195
    30
class Scope;
dvander@195
    31
dvander@0
    32
#define ASTKINDS(_)             \
dvander@0
    33
    _(VariableDeclaration)      \
dvander@0
    34
    _(ForStatement)             \
dvander@0
    35
    _(ReturnStatement)          \
dvander@4
    36
    _(IntegerLiteral)           \
dvander@4
    37
    _(FloatLiteral)             \
dvander@21
    38
    _(StringLiteral)            \
dvander@0
    39
    _(BinaryExpression)         \
dvander@0
    40
    _(BlockStatement)           \
dvander@0
    41
    _(Assignment)               \
dvander@0
    42
    _(NameProxy)                \
dvander@0
    43
    _(ExpressionStatement)      \
dvander@0
    44
    _(FunctionStatement)        \
dvander@0
    45
    _(CallExpression)           \
dvander@0
    46
    _(IfStatement)              \
dvander@2
    47
    _(IndexExpression)          \
dvander@148
    48
    _(FieldExpression)          \
dvander@9
    49
    _(EnumStatement)            \
dvander@10
    50
    _(WhileStatement)           \
dvander@10
    51
    _(BreakStatement)           \
dvander@23
    52
    _(ContinueStatement)        \
dvander@174
    53
    _(FunctionTypeStatement)    \
dvander@78
    54
    _(IncDecExpression)         \
dvander@83
    55
    _(UnaryExpression)          \
dvander@143
    56
    _(TernaryExpression)        \
dvander@146
    57
    _(BooleanLiteral)           \
dvander@172
    58
    _(StructureStatement)       \
dvander@187
    59
    _(SwitchStatement)          \
dvander@195
    60
    _(ArrayLiteral)             \
dvander@195
    61
	_(ImportStatement)
dvander@0
    62
dvander@0
    63
// Forward declarations.
dvander@0
    64
#define _(name) class name;
dvander@0
    65
ASTKINDS(_)
dvander@0
    66
#undef _
dvander@0
    67
dvander@0
    68
class AstVisitor;
dvander@0
    69
dvander@0
    70
// Interface for AST nodes.
dvander@0
    71
class AstNode : public PoolObject
dvander@0
    72
{
dvander@25
    73
    SourcePosition pos_;
dvander@25
    74
dvander@0
    75
  public:
dvander@0
    76
    enum Kind {
dvander@0
    77
#       define _(name) k##name,
dvander@0
    78
        ASTKINDS(_)
dvander@0
    79
#       undef _
dvander@0
    80
        AstKind_Invalid
dvander@0
    81
    };
dvander@25
    82
dvander@25
    83
    AstNode(const SourcePosition &pos)
dvander@25
    84
      : pos_(pos)
dvander@25
    85
    {
dvander@25
    86
    }
dvander@0
    87
    
dvander@0
    88
    virtual Kind kind() const = 0;
dvander@0
    89
dvander@0
    90
#define _(name)     bool is##name() { return kind() == k##name; }                   \
dvander@187
    91
                    name *to##name() { assert(is##name()); return (name *)this; }   \
dvander@187
    92
                    name *as##name() { if (!is##name()) return NULL; return to##name(); }
dvander@0
    93
    ASTKINDS(_)
dvander@0
    94
#undef _
dvander@0
    95
dvander@0
    96
    virtual void accept(AstVisitor *visitor) = 0;
dvander@25
    97
dvander@25
    98
    const SourcePosition &pos() const {
dvander@25
    99
        return pos_;
dvander@25
   100
    }
dvander@0
   101
};
dvander@0
   102
dvander@195
   103
#define DECLARE_NODE(type)                      \
dvander@195
   104
    Kind kind() const {                         \
dvander@195
   105
        return k##type;                         \
dvander@195
   106
    }                                           \
dvander@195
   107
    void accept(AstVisitor *visitor) {          \
dvander@195
   108
        visitor->visit##type(this);             \
dvander@195
   109
    }
dvander@195
   110
dvander@0
   111
class AstVisitor
dvander@0
   112
{
dvander@0
   113
  public:
dvander@195
   114
#define _(name) virtual void visit##name(name *node) { assert(false); }
dvander@0
   115
    ASTKINDS(_)
dvander@0
   116
#undef _
dvander@0
   117
};
dvander@0
   118
dvander@0
   119
class Statement : public AstNode
dvander@0
   120
{
dvander@25
   121
  public:
dvander@25
   122
    Statement(const SourcePosition &pos)
dvander@25
   123
      : AstNode(pos)
dvander@25
   124
    {
dvander@25
   125
    }
dvander@0
   126
};
dvander@0
   127
dvander@0
   128
class Expression : public AstNode
dvander@0
   129
{
dvander@29
   130
    ScopedRoot<Type> type_;
dvander@0
   131
dvander@0
   132
  public:
dvander@25
   133
    Expression(const SourcePosition &pos)
dvander@25
   134
      : AstNode(pos),
dvander@25
   135
        type_(NULL)
dvander@0
   136
    {
dvander@0
   137
    }
dvander@0
   138
dvander@0
   139
    void setType(Type *type) {
dvander@0
   140
        type_ = type;
dvander@0
   141
    }
dvander@0
   142
    Type *type() const {
dvander@0
   143
        return type_;
dvander@0
   144
    }
dvander@0
   145
};
dvander@0
   146
dvander@0
   147
typedef PoolList<Statement *> StatementList;
dvander@56
   148
typedef PoolList<Expression *> ExpressionList;
dvander@0
   149
dvander@25
   150
class VariableDeclaration : public Statement
dvander@0
   151
{
dvander@195
   152
    TypeQualifiers qual_;
dvander@195
   153
    ScopedRoot<String> name_;
dvander@0
   154
    Expression *initialization_;
dvander@209
   155
    ExpressionList *dims_;
dvander@195
   156
    Expression *type_;
dvander@195
   157
    VariableSymbol *sym_;
dvander@0
   158
dvander@0
   159
  public:
dvander@195
   160
    VariableDeclaration(const SourcePosition &pos, TypeQualifiers qual, Handle<String> name,
dvander@209
   161
                        Expression *type, ExpressionList *dims, Expression *initialization)
dvander@25
   162
      : Statement(pos),
dvander@195
   163
        qual_(qual),
dvander@195
   164
        name_(name),
dvander@28
   165
        initialization_(initialization),
dvander@209
   166
        dims_(dims),
dvander@145
   167
        type_(type),
dvander@195
   168
        sym_(NULL)
dvander@0
   169
    {
dvander@0
   170
    }
dvander@0
   171
dvander@195
   172
    DECLARE_NODE(VariableDeclaration);
dvander@195
   173
dvander@0
   174
    Expression *initialization() const {
dvander@0
   175
        return initialization_;
dvander@0
   176
    }
dvander@195
   177
    Handle<String> name() {
dvander@195
   178
        return name_;
dvander@195
   179
    }
dvander@195
   180
    Expression *declType() const {
dvander@195
   181
        return type_;
dvander@0
   182
    }
dvander@195
   183
    void setSymbol(VariableSymbol *sym) {
dvander@195
   184
        assert(!sym_);
dvander@195
   185
        sym_ = sym;
dvander@0
   186
    }
dvander@195
   187
    VariableSymbol *sym() const {
dvander@195
   188
        return sym_;
dvander@195
   189
    }
dvander@195
   190
    Expression *type() const {
dvander@195
   191
        return type_;
dvander@135
   192
    }
dvander@209
   193
    ExpressionList *dims() const {
dvander@209
   194
        return dims_;
dvander@209
   195
    }
dvander@241
   196
    TypeQualifiers quals() const {
dvander@241
   197
        return qual_;
dvander@241
   198
    }
dvander@0
   199
};
dvander@0
   200
dvander@14
   201
class Parameter : public PoolObject
dvander@14
   202
{
dvander@195
   203
    ScopedRoot<String> name_;
dvander@195
   204
    Expression *type_;
dvander@14
   205
    bool reference_;
dvander@133
   206
    Expression *initializer_;
dvander@195
   207
    VariableSymbol *sym_;
dvander@195
   208
    SourcePosition pos_;
dvander@220
   209
    ExpressionList *dims_;
dvander@241
   210
    TypeQualifiers quals_;
dvander@14
   211
dvander@14
   212
  public:
dvander@241
   213
    Parameter(Handle<String> name, Expression *type, bool reference, TypeQualifiers quals,
dvander@220
   214
              ExpressionList *dims, Expression *initializer, const SourcePosition &pos)
dvander@195
   215
      : name_(name),
dvander@145
   216
        type_(type),
dvander@66
   217
        reference_(reference),
dvander@195
   218
        initializer_(initializer),
dvander@195
   219
        sym_(NULL),
dvander@220
   220
        pos_(pos),
dvander@241
   221
        dims_(dims),
dvander@241
   222
        quals_(quals)
dvander@14
   223
    {
dvander@14
   224
    }
dvander@14
   225
dvander@195
   226
    Expression *type() const {
dvander@145
   227
        return type_;
dvander@14
   228
    }
dvander@195
   229
    Handle<String> name() const {
dvander@195
   230
        return name_;
dvander@14
   231
    }
dvander@14
   232
    bool reference() const {
dvander@14
   233
        return reference_;
dvander@14
   234
    }
dvander@241
   235
    TypeQualifiers quals() const {
dvander@241
   236
        return quals_;
dvander@67
   237
    }
dvander@220
   238
    ExpressionList *dims() const {
dvander@220
   239
        return dims_;
dvander@220
   240
    }
dvander@133
   241
    Expression *initializer() const {
dvander@133
   242
        return initializer_;
dvander@133
   243
    }
dvander@195
   244
    void setSymbol(VariableSymbol *sym) {
dvander@195
   245
        assert(!sym_);
dvander@195
   246
        sym_ = sym;
dvander@195
   247
    }
dvander@195
   248
    VariableSymbol *sym() const {
dvander@195
   249
        return sym_;
dvander@195
   250
    }
dvander@195
   251
    const SourcePosition &pos() const {
dvander@195
   252
        return pos_;
dvander@195
   253
    }
dvander@14
   254
};
dvander@14
   255
dvander@0
   256
class NameProxy : public Expression
dvander@0
   257
{
dvander@54
   258
    ScopedRoot<String> name_;
dvander@195
   259
    Symbol *binding_;
dvander@0
   260
dvander@0
   261
  public:
dvander@195
   262
    NameProxy(const SourcePosition &pos, Handle<String> name)
dvander@25
   263
      : Expression(pos),
dvander@25
   264
        name_(name),
dvander@195
   265
        binding_(NULL)
dvander@0
   266
    {
dvander@0
   267
    }
dvander@0
   268
dvander@195
   269
    DECLARE_NODE(NameProxy);
dvander@195
   270
    
dvander@195
   271
    Handle<String> name() const {
dvander@0
   272
        return name_;
dvander@0
   273
    }
dvander@195
   274
    Symbol *sym() const {
dvander@0
   275
        return binding_;
dvander@0
   276
    }
dvander@195
   277
    void bind(Symbol *sym) {
dvander@195
   278
        binding_ = sym;
dvander@0
   279
    }
dvander@0
   280
};
dvander@0
   281
dvander@143
   282
class BooleanLiteral : public Expression
dvander@143
   283
{
dvander@143
   284
    TokenKind token_;
dvander@143
   285
dvander@143
   286
  public:
dvander@143
   287
    BooleanLiteral(const SourcePosition &pos, TokenKind token)
dvander@143
   288
      : Expression(pos),
dvander@143
   289
        token_(token)
dvander@143
   290
    {
dvander@143
   291
    }
dvander@143
   292
dvander@195
   293
    DECLARE_NODE(BooleanLiteral);
dvander@143
   294
    TokenKind token() const {
dvander@143
   295
        return token_;
dvander@143
   296
    }
dvander@143
   297
};
dvander@143
   298
dvander@4
   299
class IntegerLiteral : public Expression
dvander@0
   300
{
dvander@0
   301
    int value_;
dvander@0
   302
dvander@0
   303
  public:
dvander@25
   304
    IntegerLiteral(const SourcePosition &pos, int value)
dvander@25
   305
      : Expression(pos),
dvander@25
   306
        value_(value)
dvander@0
   307
    {
dvander@0
   308
    }
dvander@0
   309
dvander@195
   310
    DECLARE_NODE(IntegerLiteral);
dvander@195
   311
dvander@0
   312
    int value() const {
dvander@0
   313
        return value_;
dvander@0
   314
    }
dvander@0
   315
};
dvander@0
   316
dvander@4
   317
class FloatLiteral : public Expression
dvander@4
   318
{
dvander@4
   319
    double value_;
dvander@4
   320
dvander@4
   321
  public:
dvander@25
   322
    FloatLiteral(const SourcePosition &pos, double value)
dvander@25
   323
      : Expression(pos),
dvander@25
   324
        value_(value)
dvander@4
   325
    {
dvander@4
   326
    }
dvander@4
   327
dvander@195
   328
    DECLARE_NODE(FloatLiteral);
dvander@195
   329
dvander@4
   330
    double value() const {
dvander@4
   331
        return value_;
dvander@4
   332
    }
dvander@4
   333
};
dvander@4
   334
dvander@21
   335
class StringLiteral : public Expression
dvander@21
   336
{
dvander@234
   337
    ScopedRoot<String> string_;
dvander@21
   338
dvander@21
   339
  public:
dvander@234
   340
    StringLiteral(const SourcePosition &pos, String *string)
dvander@25
   341
      : Expression(pos),
dvander@234
   342
        string_(string)
dvander@21
   343
    {
dvander@21
   344
    }
dvander@21
   345
dvander@195
   346
    DECLARE_NODE(StringLiteral);
dvander@195
   347
dvander@234
   348
    String *string() const {
dvander@21
   349
        return string_;
dvander@21
   350
    }
dvander@21
   351
};
dvander@21
   352
dvander@187
   353
class ArrayLiteral : public Expression
dvander@187
   354
{
dvander@187
   355
    TokenKind token_;
dvander@187
   356
    ExpressionList *expressions_;
dvander@187
   357
dvander@187
   358
  public:
dvander@187
   359
    ArrayLiteral(const SourcePosition &pos, TokenKind token, ExpressionList *expressions)
dvander@187
   360
      : Expression(pos),
dvander@187
   361
        token_(token),
dvander@187
   362
        expressions_(expressions)
dvander@187
   363
    {
dvander@187
   364
    }
dvander@187
   365
dvander@195
   366
    DECLARE_NODE(ArrayLiteral);
dvander@195
   367
dvander@187
   368
    TokenKind token() const {
dvander@187
   369
        return token_;
dvander@187
   370
    }
dvander@187
   371
    ExpressionList *expressions() const {
dvander@187
   372
        return expressions_;
dvander@187
   373
    }
dvander@187
   374
    bool isFixed() const {
dvander@187
   375
        return token_ == TOK_LBRACE;
dvander@187
   376
    }
dvander@187
   377
};
dvander@187
   378
dvander@78
   379
class UnaryExpression : public Expression
dvander@78
   380
{
dvander@78
   381
    Expression *expression_;
dvander@78
   382
    TokenKind token_;
dvander@195
   383
    NameProxy *tag_;
dvander@78
   384
dvander@78
   385
  public:
dvander@78
   386
    UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
dvander@78
   387
      : Expression(pos),
dvander@78
   388
        expression_(expr),
dvander@195
   389
        token_(token),
dvander@195
   390
        tag_(NULL)
dvander@78
   391
    {
dvander@78
   392
    }
dvander@78
   393
dvander@142
   394
    UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
dvander@195
   395
                    NameProxy *tag)
dvander@142
   396
      : Expression(pos),
dvander@142
   397
        expression_(expr),
dvander@142
   398
        token_(token),
dvander@195
   399
        tag_(tag)
dvander@142
   400
    {
dvander@142
   401
    }
dvander@142
   402
dvander@195
   403
    DECLARE_NODE(UnaryExpression);
dvander@195
   404
dvander@78
   405
    Expression *expression() const {
dvander@78
   406
        return expression_;
dvander@78
   407
    }
dvander@78
   408
    TokenKind token() const {
dvander@78
   409
        return token_;
dvander@78
   410
    }
dvander@195
   411
    NameProxy *tag() const {
dvander@195
   412
        return tag_;
dvander@78
   413
    }
dvander@78
   414
};
dvander@78
   415
dvander@0
   416
class BinaryExpression : public Expression
dvander@0
   417
{
dvander@0
   418
    Expression *left_;
dvander@0
   419
    Expression *right_;
dvander@0
   420
    TokenKind token_;
dvander@0
   421
dvander@0
   422
  public:
dvander@25
   423
    BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   424
      : Expression(pos),
dvander@0
   425
        left_(left),
dvander@28
   426
        right_(right),
dvander@28
   427
        token_(token)
dvander@0
   428
    {
dvander@0
   429
    }
dvander@0
   430
dvander@195
   431
    DECLARE_NODE(BinaryExpression);
dvander@195
   432
dvander@0
   433
    Expression *left() const {
dvander@0
   434
        return left_;
dvander@0
   435
    }
dvander@0
   436
    Expression *right() const {
dvander@0
   437
        return right_;
dvander@0
   438
    }
dvander@0
   439
    TokenKind token() const {
dvander@0
   440
        return token_;
dvander@0
   441
    }
dvander@0
   442
};
dvander@0
   443
dvander@83
   444
class TernaryExpression : public Expression
dvander@83
   445
{
dvander@83
   446
    Expression *condition_;
dvander@83
   447
    Expression *left_;
dvander@83
   448
    Expression *right_;
dvander@83
   449
dvander@83
   450
  public:
dvander@83
   451
    TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
dvander@83
   452
      : Expression(pos),
dvander@83
   453
        condition_(condition),
dvander@83
   454
        left_(left),
dvander@83
   455
        right_(right)
dvander@83
   456
    {
dvander@83
   457
    }
dvander@83
   458
dvander@195
   459
    DECLARE_NODE(TernaryExpression);
dvander@195
   460
dvander@83
   461
    Expression *condition() const {
dvander@83
   462
        return condition_;
dvander@83
   463
    }
dvander@83
   464
    Expression *left() const {
dvander@83
   465
        return left_;
dvander@83
   466
    }
dvander@83
   467
    Expression *right() const {
dvander@83
   468
        return right_;
dvander@83
   469
    }
dvander@83
   470
};
dvander@83
   471
dvander@0
   472
class IndexExpression : public Expression
dvander@0
   473
{
dvander@0
   474
    Expression *left_;
dvander@0
   475
    Expression *right_;
dvander@0
   476
dvander@0
   477
  public:
dvander@25
   478
    IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
dvander@25
   479
      : Expression(pos),
dvander@25
   480
        left_(left),
dvander@0
   481
        right_(right)
dvander@0
   482
    {
dvander@0
   483
    }
dvander@0
   484
dvander@195
   485
    DECLARE_NODE(IndexExpression);
dvander@195
   486
dvander@0
   487
    Expression *left() const {
dvander@0
   488
        return left_;
dvander@0
   489
    }
dvander@0
   490
    Expression *right() const {
dvander@0
   491
        return right_;
dvander@0
   492
    }
dvander@0
   493
};
dvander@0
   494
dvander@148
   495
class FieldExpression : public Expression
dvander@148
   496
{
dvander@148
   497
    Expression *left_;
dvander@148
   498
    ScopedRoot<String> field_;
dvander@148
   499
    unsigned fieldIndex_;
dvander@148
   500
dvander@148
   501
  public:
dvander@148
   502
    FieldExpression(const SourcePosition &pos, Expression *left, Handle<String> field)
dvander@148
   503
      : Expression(pos),
dvander@148
   504
        left_(left),
dvander@148
   505
        field_(field),
dvander@148
   506
        fieldIndex_(unsigned(-1))
dvander@148
   507
    {
dvander@148
   508
    }
dvander@148
   509
dvander@195
   510
    DECLARE_NODE(FieldExpression);
dvander@195
   511
dvander@148
   512
    Expression *left() const {
dvander@148
   513
        return left_;
dvander@148
   514
    }
dvander@148
   515
    String *field() const {
dvander@148
   516
        return field_;
dvander@148
   517
    }
dvander@148
   518
    void setFieldIndex(unsigned index) {
dvander@148
   519
        assert(fieldIndex_ == unsigned(-1));
dvander@148
   520
        fieldIndex_ = index;
dvander@148
   521
    }
dvander@148
   522
    unsigned fieldIndex() const {
dvander@148
   523
        assert(fieldIndex_ != unsigned(-1));
dvander@148
   524
        return fieldIndex_;
dvander@148
   525
    }
dvander@148
   526
};
dvander@148
   527
dvander@0
   528
class CallExpression : public Expression
dvander@0
   529
{
dvander@0
   530
    Expression *callee_;
dvander@0
   531
    ExpressionList *arguments_;
dvander@0
   532
dvander@0
   533
  public:
dvander@25
   534
    CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
dvander@25
   535
      : Expression(pos),
dvander@25
   536
        callee_(callee),
dvander@0
   537
        arguments_(arguments)
dvander@0
   538
    {
dvander@0
   539
    }
dvander@0
   540
dvander@195
   541
    DECLARE_NODE(CallExpression);
dvander@195
   542
dvander@0
   543
    Expression *callee() const {
dvander@0
   544
        return callee_;
dvander@0
   545
    }
dvander@0
   546
    ExpressionList *arguments() const {
dvander@0
   547
        return arguments_;
dvander@0
   548
    }
dvander@0
   549
};
dvander@0
   550
dvander@0
   551
class ForStatement : public Statement
dvander@0
   552
{
dvander@22
   553
    Statement *initialization_;
dvander@0
   554
    Expression *condition_;
dvander@0
   555
    Statement *update_;
dvander@0
   556
    Statement *body_;
dvander@195
   557
    Scope *scope_;
dvander@0
   558
dvander@0
   559
  public:
dvander@195
   560
    ForStatement(const SourcePosition &pos, Statement *initialization,
dvander@0
   561
                 Expression *condition, Statement *update, Statement *body)
dvander@25
   562
      : Statement(pos),
dvander@22
   563
        initialization_(initialization),
dvander@0
   564
        condition_(condition),
dvander@0
   565
        update_(update),
dvander@195
   566
        body_(body),
dvander@195
   567
        scope_(NULL)
dvander@0
   568
    {
dvander@0
   569
    }
dvander@0
   570
dvander@195
   571
    DECLARE_NODE(ForStatement);
dvander@195
   572
dvander@22
   573
    Statement *initialization() const {
dvander@22
   574
        return initialization_;
dvander@0
   575
    }
dvander@0
   576
    Expression *condition() const {
dvander@0
   577
        return condition_;
dvander@0
   578
    }
dvander@0
   579
    Statement *update() const {
dvander@0
   580
        return update_;
dvander@0
   581
    }
dvander@0
   582
    Statement *body() const {
dvander@0
   583
        return body_;
dvander@0
   584
    }
dvander@195
   585
    Scope *scope() const {
dvander@195
   586
        return scope_;
dvander@195
   587
    }
dvander@195
   588
    void setScope(Scope *scope) {
dvander@195
   589
        scope_ = scope;
dvander@0
   590
    }
dvander@0
   591
};
dvander@0
   592
dvander@9
   593
class WhileStatement : public Statement
dvander@9
   594
{
dvander@9
   595
    TokenKind token_;
dvander@9
   596
    Expression *condition_;
dvander@9
   597
    Statement *body_;
dvander@9
   598
dvander@9
   599
  public:
dvander@25
   600
    WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
dvander@25
   601
      : Statement(pos),
dvander@25
   602
        token_(kind),
dvander@9
   603
        condition_(condition),
dvander@9
   604
        body_(body)
dvander@9
   605
    {
dvander@9
   606
    }
dvander@9
   607
    
dvander@195
   608
    DECLARE_NODE(WhileStatement);
dvander@195
   609
dvander@9
   610
    TokenKind token() const {
dvander@9
   611
        return token_;
dvander@9
   612
    }
dvander@9
   613
    Expression *condition() const {
dvander@9
   614
        return condition_;
dvander@9
   615
    }
dvander@9
   616
    Statement *body() const {
dvander@9
   617
        return body_;
dvander@9
   618
    }
dvander@9
   619
};
dvander@9
   620
dvander@0
   621
class ReturnStatement : public Statement
dvander@0
   622
{
dvander@0
   623
    Expression *expression_;
dvander@0
   624
dvander@0
   625
  public:
dvander@25
   626
    ReturnStatement(const SourcePosition &pos, Expression *expression)
dvander@25
   627
      : Statement(pos),
dvander@25
   628
        expression_(expression)
dvander@0
   629
    {
dvander@0
   630
    }
dvander@0
   631
dvander@195
   632
    DECLARE_NODE(ReturnStatement);
dvander@195
   633
dvander@0
   634
    Expression *expression() const {
dvander@0
   635
        return expression_;
dvander@0
   636
    }
dvander@0
   637
};
dvander@0
   638
dvander@10
   639
class BreakStatement : public Statement
dvander@10
   640
{
dvander@10
   641
  public:
dvander@25
   642
    BreakStatement(const SourcePosition &pos)
dvander@25
   643
      : Statement(pos)
dvander@10
   644
    {
dvander@10
   645
    }
dvander@10
   646
dvander@195
   647
    DECLARE_NODE(BreakStatement);
dvander@10
   648
};
dvander@10
   649
dvander@10
   650
class ContinueStatement : public Statement
dvander@10
   651
{
dvander@10
   652
  public:
dvander@25
   653
    ContinueStatement(const SourcePosition &pos)
dvander@25
   654
      : Statement(pos)
dvander@10
   655
    {
dvander@10
   656
    }
dvander@10
   657
dvander@195
   658
    DECLARE_NODE(ContinueStatement);
dvander@10
   659
};
dvander@10
   660
dvander@0
   661
class Assignment : public Expression
dvander@0
   662
{
dvander@22
   663
    TokenKind token_;
dvander@0
   664
    Expression *lvalue_;
dvander@0
   665
    Expression *expression_;
dvander@0
   666
dvander@0
   667
  public:
dvander@25
   668
    Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   669
      : Expression(pos),
dvander@25
   670
        token_(token),
dvander@22
   671
        lvalue_(left),
dvander@0
   672
        expression_(right)
dvander@0
   673
    {
dvander@0
   674
    }
dvander@0
   675
dvander@195
   676
    DECLARE_NODE(Assignment);
dvander@195
   677
dvander@22
   678
    TokenKind token() const {
dvander@22
   679
        return token_;
dvander@22
   680
    }
dvander@0
   681
    Expression *lvalue() const {
dvander@0
   682
        return lvalue_;
dvander@0
   683
    }
dvander@0
   684
    Expression *expression() const {
dvander@0
   685
        return expression_;
dvander@0
   686
    }
dvander@0
   687
};
dvander@0
   688
dvander@0
   689
class ExpressionStatement : public Statement
dvander@0
   690
{
dvander@0
   691
    Expression *expression_;
dvander@0
   692
dvander@0
   693
  public:
dvander@0
   694
    ExpressionStatement(Expression *expression)
dvander@25
   695
      : Statement(expression->pos()),
dvander@25
   696
        expression_(expression)
dvander@0
   697
    {
dvander@0
   698
    }
dvander@0
   699
dvander@195
   700
    DECLARE_NODE(ExpressionStatement);
dvander@195
   701
dvander@0
   702
    Expression *expression() const {
dvander@0
   703
        return expression_;
dvander@0
   704
    }
dvander@0
   705
};
dvander@0
   706
dvander@0
   707
class BlockStatement : public Statement
dvander@0
   708
{
dvander@195
   709
    StatementList *statements_;
dvander@0
   710
    Scope *scope_;
dvander@247
   711
    TokenKind type_;
dvander@0
   712
dvander@0
   713
  public:
dvander@247
   714
    BlockStatement(const SourcePosition &pos, StatementList *statements, TokenKind kind)
dvander@25
   715
      : Statement(pos),
dvander@195
   716
        statements_(statements),
dvander@247
   717
        scope_(NULL),
dvander@247
   718
        type_(kind)
dvander@0
   719
    {
dvander@0
   720
    }
dvander@0
   721
dvander@195
   722
    DECLARE_NODE(BlockStatement);
dvander@195
   723
dvander@195
   724
    StatementList *statements() const {
dvander@195
   725
        return statements_;
dvander@0
   726
    }
dvander@0
   727
    Scope *scope() const {
dvander@0
   728
        return scope_;
dvander@0
   729
    }
dvander@195
   730
    void setScope(Scope *scope) {
dvander@195
   731
        scope_ = scope;
dvander@0
   732
    }
dvander@247
   733
    TokenKind type() const {
dvander@247
   734
        return type_;
dvander@247
   735
    }
dvander@0
   736
};
dvander@0
   737
dvander@57
   738
typedef PoolList<Parameter *> ParameterList;
dvander@14
   739
dvander@174
   740
class FunctionSignature
dvander@174
   741
{
dvander@174
   742
  public:
dvander@195
   743
    FunctionSignature(Expression *returnType, ParameterList *parameters, bool variadic)
dvander@174
   744
      : returnType_(returnType),
dvander@195
   745
        parameters_(parameters),
dvander@195
   746
        variadic_(variadic)
dvander@174
   747
    {
dvander@174
   748
    }
dvander@174
   749
dvander@195
   750
    Expression *returnType() const {
dvander@174
   751
        return returnType_;
dvander@174
   752
    }
dvander@174
   753
    ParameterList *parameters() const {
dvander@174
   754
        return parameters_;
dvander@174
   755
    }
dvander@195
   756
    bool variadic() const {
dvander@195
   757
        return variadic_;
dvander@195
   758
    }
dvander@174
   759
dvander@174
   760
  private:
dvander@195
   761
    Expression *returnType_;
dvander@174
   762
    ParameterList *parameters_;
dvander@195
   763
    bool variadic_;
dvander@174
   764
};
dvander@174
   765
dvander@174
   766
class FunctionTypeStatement : public Statement
dvander@174
   767
{
dvander@174
   768
  public:
dvander@195
   769
    FunctionTypeStatement(const SourcePosition &pos, Handle<String> name, const FunctionSignature &signature)
dvander@174
   770
      : Statement(pos),
dvander@195
   771
        name_(name),
dvander@174
   772
        signature_(signature)
dvander@174
   773
    {
dvander@174
   774
    }
dvander@174
   775
dvander@195
   776
    DECLARE_NODE(FunctionTypeStatement);
dvander@195
   777
dvander@195
   778
    Handle<String> name() const {
dvander@195
   779
        return name_;
dvander@174
   780
    }
dvander@174
   781
    const FunctionSignature &signature() const {
dvander@174
   782
        return signature_;
dvander@174
   783
    }
dvander@174
   784
dvander@174
   785
  private:
dvander@195
   786
    ScopedRoot<String> name_;
dvander@174
   787
    FunctionSignature signature_;
dvander@195
   788
    
dvander@174
   789
};
dvander@174
   790
dvander@0
   791
class FunctionStatement : public Statement
dvander@0
   792
{
dvander@195
   793
    ScopedRoot<String> name_;
dvander@195
   794
    TokenKind kind_;
dvander@0
   795
    Statement *body_;
dvander@174
   796
    FunctionSignature signature_;
dvander@71
   797
    bool explicitReturn_;
dvander@195
   798
    FunctionSymbol *sym_;
dvander@195
   799
    Scope *argScope_;
dvander@195
   800
    Scope *varScope_;
dvander@0
   801
dvander@0
   802
  public:
dvander@195
   803
    FunctionStatement(const SourcePosition &pos, Handle<String> name, TokenKind kind,
dvander@195
   804
                      Statement *body, const FunctionSignature &signature, bool explicitReturn)
dvander@25
   805
      : Statement(pos),
dvander@195
   806
        name_(name),
dvander@195
   807
        kind_(kind),
dvander@14
   808
        body_(body),
dvander@174
   809
        signature_(signature),
dvander@195
   810
        explicitReturn_(explicitReturn),
dvander@195
   811
        sym_(NULL),
dvander@195
   812
        argScope_(NULL),
dvander@195
   813
        varScope_(NULL)
dvander@0
   814
    {
dvander@0
   815
    }
dvander@0
   816
dvander@195
   817
    DECLARE_NODE(FunctionStatement);
dvander@195
   818
dvander@195
   819
    Handle<String> name() const {
dvander@195
   820
        return name_;
dvander@0
   821
    }
dvander@0
   822
    Statement *body() const {
dvander@0
   823
        return body_;
dvander@0
   824
    }
dvander@174
   825
    const FunctionSignature &signature() {
dvander@174
   826
        return signature_;
dvander@14
   827
    }
dvander@71
   828
    bool hasExplicitReturn() const {
dvander@71
   829
        return explicitReturn_;
dvander@71
   830
    }
dvander@195
   831
    TokenKind token() const {
dvander@195
   832
        return kind_;
dvander@195
   833
    }
dvander@195
   834
    void setSymbol(FunctionSymbol *sym) {
dvander@195
   835
        assert(!sym_);
dvander@195
   836
        sym_ = sym;
dvander@195
   837
    }
dvander@195
   838
    FunctionSymbol *sym() const {
dvander@195
   839
        return sym_;
dvander@195
   840
    }
dvander@195
   841
    void setScopes(Scope *argScope, Scope *varScope) {
dvander@195
   842
        argScope_ = argScope;
dvander@195
   843
        varScope_ = varScope;
dvander@195
   844
    }
dvander@195
   845
    Scope *argScope() const {
dvander@195
   846
        return argScope_;
dvander@195
   847
    }
dvander@195
   848
    Scope *varScope() const {
dvander@195
   849
        return varScope_;
dvander@195
   850
    }
dvander@0
   851
};
dvander@0
   852
dvander@0
   853
class IfStatement : public Statement
dvander@0
   854
{
dvander@0
   855
    Expression *condition_;
dvander@0
   856
    Statement *ifTrue_;
dvander@0
   857
    Statement *ifFalse_;
dvander@0
   858
dvander@0
   859
  public:
dvander@25
   860
    IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
dvander@25
   861
      : Statement(pos),
dvander@25
   862
        condition_(condition),
dvander@0
   863
        ifTrue_(ifTrue),
dvander@0
   864
        ifFalse_(NULL)
dvander@0
   865
    {
dvander@0
   866
    }
dvander@0
   867
dvander@195
   868
    DECLARE_NODE(IfStatement);
dvander@195
   869
dvander@0
   870
    Expression *condition() const {
dvander@0
   871
        return condition_;
dvander@0
   872
    }
dvander@0
   873
    Statement *ifTrue() const {
dvander@0
   874
        return ifTrue_;
dvander@0
   875
    }
dvander@0
   876
    Statement *ifFalse() const {
dvander@0
   877
        return ifFalse_;
dvander@0
   878
    }
dvander@0
   879
    void setIfFalse(Statement *ifFalse) {
dvander@0
   880
        ifFalse_ = ifFalse;
dvander@0
   881
    }
dvander@0
   882
};
dvander@0
   883
dvander@2
   884
class EnumStatement : public Statement
dvander@2
   885
{
dvander@54
   886
    ScopedRoot<String> name_;
dvander@195
   887
    TypeSymbol *sym_;
dvander@2
   888
dvander@2
   889
  public:
dvander@2
   890
    struct Entry {
dvander@195
   891
        ScopedRoot<String> name;
dvander@2
   892
        Expression *expr;
dvander@233
   893
        SourcePosition pos;
dvander@2
   894
dvander@233
   895
        Entry(Handle<String> name, Expression *expr, const SourcePosition &pos)
dvander@2
   896
          : name(name),
dvander@233
   897
            expr(expr),
dvander@233
   898
            pos(pos)
dvander@2
   899
        {
dvander@2
   900
        }
dvander@2
   901
    };
dvander@2
   902
dvander@57
   903
    typedef PoolList<Entry> EntryList;
dvander@2
   904
dvander@2
   905
  public:
dvander@195
   906
    EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
dvander@25
   907
      : Statement(pos),
dvander@25
   908
        name_(name),
dvander@196
   909
        sym_(NULL),
dvander@196
   910
        entries_(entries)
dvander@2
   911
    {
dvander@2
   912
    }
dvander@2
   913
dvander@195
   914
    DECLARE_NODE(EnumStatement);
dvander@195
   915
dvander@54
   916
    String *name() const {
dvander@2
   917
        return name_;
dvander@2
   918
    }
dvander@2
   919
    EntryList *entries() const {
dvander@2
   920
        return entries_;
dvander@2
   921
    }
dvander@195
   922
    void setSymbol(TypeSymbol *sym) {
dvander@195
   923
        assert(!sym_);
dvander@195
   924
        sym_ = sym;
dvander@145
   925
    }
dvander@195
   926
    TypeSymbol *sym() const {
dvander@195
   927
        return sym_;
dvander@2
   928
    }
dvander@2
   929
dvander@2
   930
  private:
dvander@2
   931
    EntryList *entries_;
dvander@2
   932
};
dvander@2
   933
dvander@23
   934
class IncDecExpression : public Expression
dvander@23
   935
{
dvander@23
   936
    TokenKind token_;
dvander@23
   937
    Expression *expression_;
dvander@23
   938
    bool postfix_;
dvander@23
   939
dvander@23
   940
  public:
dvander@25
   941
    IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
dvander@25
   942
      : Expression(pos),
dvander@25
   943
        token_(token),
dvander@23
   944
        expression_(expression),
dvander@23
   945
        postfix_(postfix)
dvander@23
   946
    {
dvander@23
   947
    }
dvander@23
   948
dvander@195
   949
    DECLARE_NODE(IncDecExpression);
dvander@195
   950
dvander@23
   951
    TokenKind token() const {
dvander@23
   952
        return token_;
dvander@23
   953
    }
dvander@23
   954
    Expression *expression() const {
dvander@23
   955
        return expression_;
dvander@23
   956
    }
dvander@23
   957
    bool postfix() const {
dvander@23
   958
        return postfix_;
dvander@23
   959
    }
dvander@23
   960
};
dvander@23
   961
dvander@172
   962
class Case : public PoolObject
dvander@172
   963
{
dvander@172
   964
  public:
dvander@172
   965
    Case(Expression *expression, ExpressionList *others, Statement *statement)
dvander@172
   966
      : expression_(expression),
dvander@172
   967
        others_(others),
dvander@172
   968
        statement_(statement)
dvander@172
   969
    {
dvander@172
   970
    }
dvander@172
   971
dvander@172
   972
    Expression *expression() const {
dvander@172
   973
        return expression_;
dvander@172
   974
    }
dvander@172
   975
    PoolList<Expression *> *others() const {
dvander@172
   976
        return others_;
dvander@172
   977
    }
dvander@172
   978
    Statement *statement() const {
dvander@172
   979
        return statement_;
dvander@172
   980
    }
dvander@172
   981
dvander@172
   982
  private:
dvander@172
   983
    Expression *expression_;
dvander@172
   984
    PoolList <Expression *> *others_;
dvander@172
   985
    Statement *statement_;
dvander@172
   986
};
dvander@172
   987
dvander@172
   988
struct CaseValue
dvander@172
   989
{
dvander@172
   990
    BoxedPrimitive box;
dvander@172
   991
    size_t statement;
dvander@172
   992
dvander@172
   993
    CaseValue(size_t statement)
dvander@172
   994
      : statement(statement)
dvander@172
   995
    {
dvander@172
   996
    }
dvander@172
   997
};
dvander@172
   998
dvander@172
   999
typedef PoolList<CaseValue> CaseValueList;
dvander@172
  1000
dvander@172
  1001
class SwitchStatement : public Statement
dvander@172
  1002
{
dvander@172
  1003
  public:
dvander@172
  1004
    SwitchStatement(const SourcePosition &pos, Expression *expression, PoolList<Case *> *cases,
dvander@172
  1005
                    Statement *def)
dvander@172
  1006
      : Statement(pos),
dvander@172
  1007
        expression_(expression),
dvander@172
  1008
        cases_(cases),
dvander@172
  1009
        default_(def),
dvander@172
  1010
        table_(NULL)
dvander@172
  1011
    {
dvander@172
  1012
    }
dvander@172
  1013
dvander@195
  1014
    DECLARE_NODE(SwitchStatement);
dvander@195
  1015
dvander@172
  1016
    Expression *expression() const {
dvander@172
  1017
        return expression_;
dvander@172
  1018
    }
dvander@172
  1019
    PoolList<Case *> *cases() const {
dvander@172
  1020
        return cases_;
dvander@172
  1021
    }
dvander@172
  1022
    Statement *defaultCase() const {
dvander@172
  1023
        return default_;
dvander@172
  1024
    }
dvander@172
  1025
    void setCaseValueList(CaseValueList *list) {
dvander@172
  1026
        table_ = list;
dvander@172
  1027
    }
dvander@172
  1028
    CaseValueList *caseValueList() const {
dvander@172
  1029
        return table_;
dvander@172
  1030
    }
dvander@172
  1031
dvander@172
  1032
  private:
dvander@172
  1033
    Expression *expression_;
dvander@172
  1034
    PoolList<Case *> *cases_;
dvander@172
  1035
    Statement *default_;
dvander@172
  1036
    CaseValueList *table_;
dvander@172
  1037
};
dvander@172
  1038
dvander@146
  1039
class StructureStatement : public Statement
dvander@146
  1040
{
dvander@146
  1041
  public:
dvander@146
  1042
    class Field : public PoolObject
dvander@146
  1043
    {
dvander@146
  1044
        SourcePosition pos_;
dvander@195
  1045
        Expression *type_;
dvander@146
  1046
        ScopedRoot<String> name_;
dvander@146
  1047
dvander@146
  1048
      public:
dvander@146
  1049
        Field(const SourcePosition &pos,
dvander@195
  1050
              Expression *type,
dvander@195
  1051
              Handle<String> name)
dvander@146
  1052
          : pos_(pos),
dvander@146
  1053
            type_(type),
dvander@195
  1054
            name_(name)
dvander@146
  1055
        {
dvander@146
  1056
        }
dvander@146
  1057
dvander@146
  1058
        const SourcePosition &pos() const {
dvander@146
  1059
            return pos_;
dvander@146
  1060
        }
dvander@195
  1061
        Handle<String> name() const {
dvander@146
  1062
            return name_;
dvander@146
  1063
        }
dvander@195
  1064
        Expression *type() const {
dvander@195
  1065
            return type_;
dvander@146
  1066
        }
dvander@146
  1067
    };
dvander@146
  1068
dvander@146
  1069
    typedef PoolList<StructureStatement::Field *> FieldList;
dvander@146
  1070
dvander@146
  1071
  public:
dvander@195
  1072
    StructureStatement(const SourcePosition &pos, Handle<String> name, FieldList *fields)
dvander@146
  1073
      : Statement(pos),
dvander@195
  1074
        name_(name),
dvander@195
  1075
        fields_(fields),
dvander@195
  1076
        sym_(NULL)
dvander@146
  1077
    {
dvander@146
  1078
    }
dvander@146
  1079
dvander@195
  1080
    DECLARE_NODE(StructureStatement);
dvander@195
  1081
dvander@146
  1082
    FieldList *fields() const {
dvander@146
  1083
        return fields_;
dvander@146
  1084
    }
dvander@195
  1085
    Handle<String> name() const {
dvander@195
  1086
        return name_;
dvander@146
  1087
    }
dvander@195
  1088
    void setSymbol(TypeSymbol *sym) {
dvander@195
  1089
        assert(!sym_);
dvander@195
  1090
        sym_ = sym;
dvander@195
  1091
    }
dvander@195
  1092
    TypeSymbol *sym() const {
dvander@195
  1093
        return sym_;
dvander@146
  1094
    }
dvander@146
  1095
dvander@146
  1096
  private:
dvander@195
  1097
    ScopedRoot<String> name_;
dvander@146
  1098
    FieldList *fields_;
dvander@195
  1099
    TypeSymbol *sym_;
dvander@195
  1100
};
dvander@195
  1101
dvander@195
  1102
typedef PoolList<ScopedRoot<String> *> NameList;
dvander@195
  1103
dvander@195
  1104
class ImportStatement : public Statement
dvander@195
  1105
{
dvander@195
  1106
  public:
dvander@195
  1107
    ImportStatement(const SourcePosition &pos, NameList *names, TokenKind suffix)
dvander@195
  1108
      : Statement(pos),
dvander@195
  1109
        names_(names),
dvander@195
  1110
        suffix_(suffix),
dvander@195
  1111
        source_(NULL)
dvander@195
  1112
    {
dvander@195
  1113
    }
dvander@195
  1114
dvander@195
  1115
    DECLARE_NODE(ImportStatement);
dvander@195
  1116
dvander@195
  1117
    NameList *path() const {
dvander@195
  1118
        return names_;
dvander@195
  1119
    }
dvander@195
  1120
    void setImportSource(TranslationUnit *unit) {
dvander@195
  1121
        source_ = unit;
dvander@195
  1122
    }
dvander@195
  1123
    TranslationUnit *source() const {
dvander@195
  1124
        return source_;
dvander@195
  1125
    }
dvander@195
  1126
    TokenKind suffix() const {
dvander@195
  1127
        return suffix_;
dvander@195
  1128
    }
dvander@195
  1129
    Handle<String> name() const {
dvander@195
  1130
        assert(suffix() != TOK_STAR);
dvander@195
  1131
        return *names_->at(names_->length() - 1);
dvander@195
  1132
    }
dvander@195
  1133
dvander@195
  1134
  private:
dvander@195
  1135
    NameList *names_;
dvander@195
  1136
    TokenKind suffix_;
dvander@195
  1137
    TranslationUnit *source_;
dvander@146
  1138
};
dvander@146
  1139
dvander@146
  1140
typedef StructureStatement::FieldList FieldList;
dvander@195
  1141
typedef PoolList<NameProxy *> NameProxyList;
dvander@146
  1142
dvander@195
  1143
#undef DECLARE_NODE
dvander@0
  1144
dvander@0
  1145
class ParseTree : public PoolObject
dvander@0
  1146
{
dvander@0
  1147
    StatementList *statements_;
dvander@0
  1148
    NameProxyList *unbound_;
dvander@195
  1149
    PoolList<ImportStatement *> *imports_;
dvander@0
  1150
dvander@0
  1151
  public:
dvander@195
  1152
    ParseTree(StatementList *statements, NameProxyList *unbound, PoolList<ImportStatement *> *imports)
dvander@0
  1153
      : statements_(statements),
dvander@195
  1154
        unbound_(unbound),
dvander@195
  1155
        imports_(imports)
dvander@0
  1156
    {
dvander@0
  1157
    }
dvander@0
  1158
dvander@0
  1159
    void dump(FILE *fp);
dvander@0
  1160
dvander@0
  1161
    StatementList *statements() const {
dvander@0
  1162
        return statements_;
dvander@0
  1163
    }
dvander@0
  1164
    NameProxyList *unbound() const {
dvander@0
  1165
        return unbound_;
dvander@0
  1166
    }
dvander@195
  1167
    PoolList<ImportStatement *> *imports() const {
dvander@195
  1168
        return imports_;
dvander@195
  1169
    }
dvander@0
  1170
};
dvander@0
  1171
dvander@0
  1172
}
dvander@0
  1173
dvander@168
  1174
#endif // _include_sourcepawn_ast_h_