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