iv-phonic 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -25,6 +25,7 @@ ext/include/iv/functor.h
25
25
  ext/include/iv/keyword.h
26
26
  ext/include/iv/lexer.h
27
27
  ext/include/iv/location.h
28
+ ext/include/iv/maybe.h
28
29
  ext/include/iv/mt19937.h
29
30
  ext/include/iv/noncopyable.h
30
31
  ext/include/iv/none.h
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'hoe'
6
6
  require 'pp'
7
7
  $root = File.dirname(__FILE__)
8
8
  $name = 'iv-phonic'
9
- $version = '0.1.5'
9
+ $version = '0.1.6'
10
10
 
11
11
  directory "ext/include/iv"
12
12
 
data/ext/include/iv/ast.h CHANGED
@@ -8,6 +8,7 @@
8
8
  #include "noncopyable.h"
9
9
  #include "utils.h"
10
10
  #include "space.h"
11
+ #include "maybe.h"
11
12
  #include "functor.h"
12
13
  #include "token.h"
13
14
  #include "ast_fwd.h"
@@ -120,6 +121,11 @@ class AstNode : public AstNodeBase<Factory> {
120
121
  typedef typename SpaceVector<Factory, Statement<Factory>*>::type Statements;
121
122
  typedef typename SpaceVector<Factory, Identifier<Factory>*>::type Identifiers;
122
123
  typedef typename SpaceVector<Factory, Expression<Factory>*>::type Expressions;
124
+ typedef typename SpaceVector<Factory,
125
+ Maybe<Expression<Factory> > >::type MaybeExpressions;
126
+ typedef typename SpaceVector<Factory,
127
+ Declaration<Factory>*>::type Declarations;
128
+ typedef typename SpaceVector<Factory, CaseClause<Factory>*>::type CaseClauses;
123
129
 
124
130
  STATEMENT_NODE_LIST(DECLARE_NODE_TYPE_BASE)
125
131
  EXPRESSION_NODE_LIST(DECLARE_NODE_TYPE_BASE)
@@ -308,9 +314,7 @@ INHERIT(VariableStatement);
308
314
  template<typename Factory>
309
315
  class VariableStatement : public VariableStatementBase<Factory> {
310
316
  public:
311
- typedef typename SpaceVector<
312
- Factory,
313
- Declaration<Factory>*>::type Declarations;
317
+ typedef typename AstNode<Factory>::Declarations Declarations;
314
318
  VariableStatement(Token::Type type, Declarations* decls)
315
319
  : is_const_(type == Token::CONST),
316
320
  decls_(decls) { }
@@ -336,20 +340,21 @@ INHERIT(Declaration);
336
340
  template<typename Factory>
337
341
  class Declaration : public DeclarationBase<Factory> {
338
342
  public:
339
- Declaration(Identifier<Factory>* name, Expression<Factory>* expr)
343
+ Declaration(Identifier<Factory>* name,
344
+ Maybe<Expression<Factory> > expr)
340
345
  : name_(name),
341
346
  expr_(expr) {
342
347
  }
343
348
  inline Identifier<Factory>* name() const {
344
349
  return name_;
345
350
  }
346
- inline Expression<Factory>* expr() const {
351
+ inline Maybe<Expression<Factory> > expr() const {
347
352
  return expr_;
348
353
  }
349
354
  DECLARE_DERIVED_NODE_TYPE(Declaration)
350
355
  private:
351
356
  Identifier<Factory>* name_;
352
- Expression<Factory>* expr_;
357
+ Maybe<Expression<Factory> > expr_;
353
358
  };
354
359
 
355
360
  // EmptyStatement
@@ -377,20 +382,19 @@ class IfStatement : public IfStatementBase<Factory> {
377
382
  public:
378
383
  IfStatement(Expression<Factory>* cond,
379
384
  Statement<Factory>* then,
380
- Statement<Factory>* elses)
385
+ Maybe<Statement<Factory> > elses)
381
386
  : cond_(cond),
382
387
  then_(then),
383
388
  else_(elses) {
384
- // else maybe NULL
385
389
  }
386
390
  inline Expression<Factory>* cond() const { return cond_; }
387
391
  inline Statement<Factory>* then_statement() const { return then_; }
388
- inline Statement<Factory>* else_statement() const { return else_; }
392
+ inline Maybe<Statement<Factory> > else_statement() const { return else_; }
389
393
  DECLARE_DERIVED_NODE_TYPE(IfStatement)
390
394
  private:
391
395
  Expression<Factory>* cond_;
392
396
  Statement<Factory>* then_;
393
- Statement<Factory>* else_;
397
+ Maybe<Statement<Factory> > else_;
394
398
  };
395
399
 
396
400
  // IterationStatement
@@ -461,24 +465,24 @@ template<typename Factory>
461
465
  class ForStatement : public ForStatementBase<Factory> {
462
466
  public:
463
467
  ForStatement(Statement<Factory>* body,
464
- Statement<Factory>* init,
465
- Expression<Factory>* cond,
466
- Statement<Factory>* next)
468
+ Maybe<Statement<Factory> > init,
469
+ Maybe<Expression<Factory> > cond,
470
+ Maybe<Statement<Factory> > next)
467
471
  : body_(body),
468
472
  init_(init),
469
473
  cond_(cond),
470
474
  next_(next) {
471
475
  }
472
476
  inline Statement<Factory>* body() const { return body_; }
473
- inline Statement<Factory>* init() const { return init_; }
474
- inline Expression<Factory>* cond() const { return cond_; }
475
- inline Statement<Factory>* next() const { return next_; }
477
+ inline Maybe<Statement<Factory> > init() const { return init_; }
478
+ inline Maybe<Expression<Factory> > cond() const { return cond_; }
479
+ inline Maybe<Statement<Factory> > next() const { return next_; }
476
480
  DECLARE_DERIVED_NODE_TYPE(ForStatement)
477
481
  private:
478
482
  Statement<Factory>* body_;
479
- Statement<Factory>* init_;
480
- Expression<Factory>* cond_;
481
- Statement<Factory>* next_;
483
+ Maybe<Statement<Factory> > init_;
484
+ Maybe<Expression<Factory> > cond_;
485
+ Maybe<Statement<Factory> > next_;
482
486
  };
483
487
 
484
488
  // ForInStatement
@@ -518,20 +522,20 @@ INHERIT(ContinueStatement);
518
522
  template<typename Factory>
519
523
  class ContinueStatement : public ContinueStatementBase<Factory> {
520
524
  public:
521
- ContinueStatement(Identifier<Factory>* label,
525
+ ContinueStatement(Maybe<Identifier<Factory> > label,
522
526
  IterationStatement<Factory>** target)
523
527
  : label_(label),
524
528
  target_(target) {
525
529
  assert(target_);
526
530
  }
527
- inline Identifier<Factory>* label() const { return label_; }
531
+ inline Maybe<Identifier<Factory> > label() const { return label_; }
528
532
  inline IterationStatement<Factory>* target() const {
529
533
  assert(target_ && *target_);
530
534
  return *target_;
531
535
  }
532
536
  DECLARE_DERIVED_NODE_TYPE(ContinueStatement)
533
537
  private:
534
- Identifier<Factory>* label_;
538
+ Maybe<Identifier<Factory> > label_;
535
539
  IterationStatement<Factory>** target_;
536
540
  };
537
541
 
@@ -545,7 +549,7 @@ INHERIT(BreakStatement);
545
549
  template<typename Factory>
546
550
  class BreakStatement : public BreakStatementBase<Factory> {
547
551
  public:
548
- BreakStatement(Identifier<Factory>* label,
552
+ BreakStatement(Maybe<Identifier<Factory> > label,
549
553
  BreakableStatement<Factory>** target)
550
554
  : label_(label),
551
555
  target_(target) {
@@ -556,7 +560,7 @@ class BreakStatement : public BreakStatementBase<Factory> {
556
560
  // if above example, target is NULL
557
561
  assert(target_ || label_);
558
562
  }
559
- inline Identifier<Factory>* label() const { return label_; }
563
+ inline Maybe<Identifier<Factory> > label() const { return label_; }
560
564
  inline BreakableStatement<Factory>* target() const {
561
565
  if (target_) {
562
566
  assert(*target_);
@@ -567,7 +571,7 @@ class BreakStatement : public BreakStatementBase<Factory> {
567
571
  }
568
572
  DECLARE_DERIVED_NODE_TYPE(BreakStatement)
569
573
  private:
570
- Identifier<Factory>* label_;
574
+ Maybe<Identifier<Factory> > label_;
571
575
  BreakableStatement<Factory>** target_;
572
576
  };
573
577
 
@@ -581,13 +585,13 @@ INHERIT(ReturnStatement);
581
585
  template<typename Factory>
582
586
  class ReturnStatement : public ReturnStatementBase<Factory> {
583
587
  public:
584
- explicit ReturnStatement(Expression<Factory>* expr)
588
+ explicit ReturnStatement(Maybe<Expression<Factory> > expr)
585
589
  : expr_(expr) {
586
590
  }
587
- inline Expression<Factory>* expr() const { return expr_; }
591
+ inline Maybe<Expression<Factory> > expr() const { return expr_; }
588
592
  DECLARE_DERIVED_NODE_TYPE(ReturnStatement)
589
593
  private:
590
- Expression<Factory>* expr_;
594
+ Maybe<Expression<Factory> > expr_;
591
595
  };
592
596
 
593
597
  // WithStatement
@@ -646,16 +650,16 @@ class CaseClause : public CaseClauseBase<Factory> {
646
650
  public:
647
651
  typedef typename AstNode<Factory>::Statements Statements;
648
652
  explicit CaseClause(bool is_default,
649
- Expression<Factory>* expr,
653
+ Maybe<Expression<Factory> > expr,
650
654
  Statements* body)
651
655
  : expr_(expr),
652
656
  body_(body),
653
657
  default_(is_default) {
654
658
  }
655
659
  inline bool IsDefault() const {
656
- return default_;
660
+ return !expr_;
657
661
  }
658
- inline Expression<Factory>* expr() const {
662
+ inline Maybe<Expression<Factory> > expr() const {
659
663
  return expr_;
660
664
  }
661
665
  inline const Statements& body() const {
@@ -663,7 +667,7 @@ class CaseClause : public CaseClauseBase<Factory> {
663
667
  }
664
668
  DECLARE_DERIVED_NODE_TYPE(CaseClause)
665
669
  private:
666
- Expression<Factory>* expr_;
670
+ Maybe<Expression<Factory> > expr_;
667
671
  Statements* body_;
668
672
  bool default_;
669
673
  };
@@ -678,7 +682,7 @@ INHERIT(SwitchStatement);
678
682
  template<typename Factory>
679
683
  class SwitchStatement : public SwitchStatementBase<Factory> {
680
684
  public:
681
- typedef typename SpaceVector<Factory, CaseClause<Factory>*>::type CaseClauses;
685
+ typedef typename AstNode<Factory>::CaseClauses CaseClauses;
682
686
  SwitchStatement(Expression<Factory>* expr,
683
687
  CaseClauses* clauses)
684
688
  : expr_(expr),
@@ -722,24 +726,24 @@ template<typename Factory>
722
726
  class TryStatement : public TryStatementBase<Factory> {
723
727
  public:
724
728
  explicit TryStatement(Block<Factory>* try_block,
725
- Identifier<Factory>* catch_name,
726
- Block<Factory>* catch_block,
727
- Block<Factory>* finally_block)
729
+ Maybe<Identifier<Factory> > catch_name,
730
+ Maybe<Block<Factory> > catch_block,
731
+ Maybe<Block<Factory> > finally_block)
728
732
  : body_(try_block),
729
733
  catch_name_(catch_name),
730
734
  catch_block_(catch_block),
731
735
  finally_block_(finally_block) {
732
736
  }
733
737
  inline Block<Factory>* body() const { return body_; }
734
- inline Identifier<Factory>* catch_name() const { return catch_name_; }
735
- inline Block<Factory>* catch_block() const { return catch_block_; }
736
- inline Block<Factory>* finally_block() const { return finally_block_; }
738
+ inline Maybe<Identifier<Factory> > catch_name() const { return catch_name_; }
739
+ inline Maybe<Block<Factory> > catch_block() const { return catch_block_; }
740
+ inline Maybe<Block<Factory> > finally_block() const { return finally_block_; }
737
741
  DECLARE_DERIVED_NODE_TYPE(TryStatement)
738
742
  private:
739
743
  Block<Factory>* body_;
740
- Identifier<Factory>* catch_name_;
741
- Block<Factory>* catch_block_;
742
- Block<Factory>* finally_block_;
744
+ Maybe<Identifier<Factory> > catch_name_;
745
+ Maybe<Block<Factory> > catch_block_;
746
+ Maybe<Block<Factory> > finally_block_;
743
747
  };
744
748
 
745
749
  // DebuggerStatement
@@ -1074,19 +1078,6 @@ class FalseLiteral : public FalseLiteralBase<Factory> {
1074
1078
  DECLARE_DERIVED_NODE_TYPE(FalseLiteral)
1075
1079
  };
1076
1080
 
1077
- // Undefined
1078
- template<typename Factory>
1079
- class Inherit<Factory, kUndefined>
1080
- : public Literal<Factory> {
1081
- };
1082
- INHERIT(Undefined);
1083
-
1084
- template<typename Factory>
1085
- class Undefined : public UndefinedBase<Factory> {
1086
- public:
1087
- DECLARE_DERIVED_NODE_TYPE(Undefined)
1088
- };
1089
-
1090
1081
  // RegExpLiteral
1091
1082
  template<typename Factory>
1092
1083
  class Inherit<Factory, kRegExpLiteral>
@@ -1127,17 +1118,17 @@ INHERIT(ArrayLiteral);
1127
1118
  template<typename Factory>
1128
1119
  class ArrayLiteral : public ArrayLiteralBase<Factory> {
1129
1120
  public:
1130
- typedef typename AstNode<Factory>::Expressions Expressions;
1121
+ typedef typename AstNode<Factory>::MaybeExpressions MaybeExpressions;
1131
1122
 
1132
- explicit ArrayLiteral(Expressions* items)
1123
+ explicit ArrayLiteral(MaybeExpressions* items)
1133
1124
  : items_(items) {
1134
1125
  }
1135
- inline const Expressions& items() const {
1126
+ inline const MaybeExpressions& items() const {
1136
1127
  return *items_;
1137
1128
  }
1138
1129
  DECLARE_DERIVED_NODE_TYPE(ArrayLiteral)
1139
1130
  private:
1140
- Expressions* items_;
1131
+ MaybeExpressions* items_;
1141
1132
  };
1142
1133
 
1143
1134
  // ObjectLiteral
@@ -1208,7 +1199,7 @@ class FunctionLiteral : public FunctionLiteralBase<Factory> {
1208
1199
  SETTER,
1209
1200
  GETTER
1210
1201
  };
1211
- inline Identifier<Factory>* name() const {
1202
+ inline Maybe<Identifier<Factory> > name() const {
1212
1203
  return name_;
1213
1204
  }
1214
1205
  inline DeclType type() const { return type_; }
@@ -1231,7 +1222,7 @@ class FunctionLiteral : public FunctionLiteralBase<Factory> {
1231
1222
  return strict_;
1232
1223
  }
1233
1224
  FunctionLiteral(DeclType type,
1234
- Identifier<Factory>* name,
1225
+ Maybe<Identifier<Factory> > name,
1235
1226
  Identifiers* params,
1236
1227
  Statements* body,
1237
1228
  Scope<Factory>* scope,
@@ -1249,7 +1240,7 @@ class FunctionLiteral : public FunctionLiteralBase<Factory> {
1249
1240
  }
1250
1241
  DECLARE_DERIVED_NODE_TYPE(FunctionLiteral)
1251
1242
  private:
1252
- Identifier<Factory>* name_;
1243
+ Maybe<Identifier<Factory> > name_;
1253
1244
  DeclType type_;
1254
1245
  Identifiers* params_;
1255
1246
  Statements* body_;
@@ -20,7 +20,7 @@ class BasicAstFactory {
20
20
  #define V(AST) typedef typename ast::AST<Factory> AST;
21
21
  AST_NODE_LIST(V)
22
22
  #undef V
23
- #define V(X, XS) typedef typename SpaceVector<Factory, X*>::type XS;
23
+ #define V(XS) typedef typename ast::AstNode<Factory>::XS XS;
24
24
  AST_LIST_LIST(V)
25
25
  #undef V
26
26
  #define V(S) typedef typename SpaceUString<Factory>::type S;
@@ -28,9 +28,7 @@ class BasicAstFactory {
28
28
  #undef V
29
29
 
30
30
  BasicAstFactory()
31
- : undefined_instance_(
32
- new(static_cast<Factory*>(this))Undefined()),
33
- empty_statement_instance_(
31
+ : empty_statement_instance_(
34
32
  new(static_cast<Factory*>(this))EmptyStatement()),
35
33
  debugger_statement_instance_(
36
34
  new(static_cast<Factory*>(this))DebuggerStatement()),
@@ -88,7 +86,7 @@ class BasicAstFactory {
88
86
  }
89
87
 
90
88
  FunctionLiteral* NewFunctionLiteral(typename FunctionLiteral::DeclType type,
91
- Identifier* name,
89
+ Maybe<Identifier> name,
92
90
  Identifiers* params,
93
91
  Statements* body,
94
92
  Scope* scope,
@@ -108,7 +106,7 @@ class BasicAstFactory {
108
106
  end_block_position);
109
107
  }
110
108
 
111
- ArrayLiteral* NewArrayLiteral(Expressions* items,
109
+ ArrayLiteral* NewArrayLiteral(MaybeExpressions* items,
112
110
  std::size_t begin, std::size_t end) {
113
111
  return new (static_cast<Factory*>(this)) ArrayLiteral(items);
114
112
  }
@@ -146,10 +144,6 @@ class BasicAstFactory {
146
144
  return this_instance_;
147
145
  }
148
146
 
149
- Undefined* NewUndefined() {
150
- return undefined_instance_;
151
- }
152
-
153
147
  TrueLiteral* NewTrueLiteral(std::size_t begin, std::size_t end) {
154
148
  return true_instance_;
155
149
  }
@@ -192,7 +186,7 @@ class BasicAstFactory {
192
186
 
193
187
  // if you want begin / end position,
194
188
  // set position to Identifier / Expression and use it
195
- Declaration* NewDeclaration(Identifier* name, Expression* expr) {
189
+ Declaration* NewDeclaration(Identifier* name, Maybe<Expression> expr) {
196
190
  return new (static_cast<Factory*>(this)) Declaration(name, expr);
197
191
  }
198
192
 
@@ -200,7 +194,7 @@ class BasicAstFactory {
200
194
  // set position to Statement and use it
201
195
  IfStatement* NewIfStatement(Expression* cond,
202
196
  Statement* then_statement,
203
- Statement* else_statement,
197
+ Maybe<Statement> else_statement,
204
198
  std::size_t begin) {
205
199
  return new (static_cast<Factory*>(this)) IfStatement(cond,
206
200
  then_statement,
@@ -235,9 +229,9 @@ class BasicAstFactory {
235
229
  // if you want end position,
236
230
  // set position to Statement and use it
237
231
  ForStatement* NewForStatement(Statement* body,
238
- Statement* init,
239
- Expression* cond,
240
- Statement* next,
232
+ Maybe<Statement> init,
233
+ Maybe<Expression> cond,
234
+ Maybe<Statement> next,
241
235
  std::size_t begin) {
242
236
  return new (static_cast<Factory*>(this)) ForStatement(body, init,
243
237
  cond, next);
@@ -247,21 +241,21 @@ class BasicAstFactory {
247
241
  return new (static_cast<Factory*>(this)) ExpressionStatement(expr);
248
242
  }
249
243
 
250
- ContinueStatement* NewContinueStatement(Identifier* label,
244
+ ContinueStatement* NewContinueStatement(Maybe<Identifier> label,
251
245
  IterationStatement** target,
252
246
  std::size_t begin,
253
247
  std::size_t end) {
254
248
  return new (static_cast<Factory*>(this)) ContinueStatement(label, target);
255
249
  }
256
250
 
257
- BreakStatement* NewBreakStatement(Identifier* label,
251
+ BreakStatement* NewBreakStatement(Maybe<Identifier> label,
258
252
  BreakableStatement** target,
259
253
  std::size_t begin,
260
254
  std::size_t end) {
261
255
  return new (static_cast<Factory*>(this)) BreakStatement(label, target);
262
256
  }
263
257
 
264
- ReturnStatement* NewReturnStatement(Expression* expr,
258
+ ReturnStatement* NewReturnStatement(Maybe<Expression> expr,
265
259
  std::size_t begin,
266
260
  std::size_t end) {
267
261
  return new (static_cast<Factory*>(this)) ReturnStatement(expr);
@@ -281,7 +275,7 @@ class BasicAstFactory {
281
275
 
282
276
  // !!! if body is empty, end_position is end.
283
277
  CaseClause* NewCaseClause(bool is_default,
284
- Expression* expr, Statements* body,
278
+ Maybe<Expression> expr, Statements* body,
285
279
  std::size_t begin,
286
280
  std::size_t end) {
287
281
  return new (static_cast<Factory*>(this)) CaseClause(is_default, expr, body);
@@ -295,9 +289,9 @@ class BasicAstFactory {
295
289
  // if you want end position,
296
290
  // set position to Block and use it
297
291
  TryStatement* NewTryStatement(Block* try_block,
298
- Identifier* catch_name,
299
- Block* catch_block,
300
- Block* finally_block,
292
+ Maybe<Identifier> catch_name,
293
+ Maybe<Block> catch_block,
294
+ Maybe<Block> finally_block,
301
295
  std::size_t begin) {
302
296
  return new (static_cast<Factory*>(this)) TryStatement(try_block,
303
297
  catch_name,
@@ -380,7 +374,6 @@ class BasicAstFactory {
380
374
  }
381
375
 
382
376
  private:
383
- Undefined* undefined_instance_;
384
377
  EmptyStatement* empty_statement_instance_;
385
378
  DebuggerStatement* debugger_statement_instance_;
386
379
  ThisLiteral* this_instance_;
@@ -46,7 +46,6 @@ V(ArrayLiteral)\
46
46
  V(ObjectLiteral)\
47
47
  V(NullLiteral)\
48
48
  V(ThisLiteral)\
49
- V(Undefined)\
50
49
  V(TrueLiteral)\
51
50
  V(FalseLiteral)
52
51
 
@@ -90,11 +89,12 @@ STATEMENT_NODE_LIST(V)\
90
89
  EXPRESSION_NODE_LIST(V)
91
90
 
92
91
  #define AST_LIST_LIST(V)\
93
- V(Identifier, Identifiers)\
94
- V(Declaration, Declarations)\
95
- V(Expression, Expressions)\
96
- V(Statement, Statements)\
97
- V(CaseClause, CaseClauses)
92
+ V(Identifiers)\
93
+ V(Declarations)\
94
+ V(Expressions)\
95
+ V(Statements)\
96
+ V(CaseClauses)\
97
+ V(MaybeExpressions)
98
98
 
99
99
  #define AST_STRING(V) V(SpaceUString)
100
100
 
@@ -10,7 +10,7 @@ struct AstInfo {
10
10
  #define V(AST) typedef typename AST<Factory> AST;
11
11
  AST_NODE_LIST(V)
12
12
  #undef V
13
- #define V(X, XS) typedef typename SpaceVector<Factory, X *>::type XS;
13
+ #define V(XS) typedef typename ast::AstNode<Factory>::XS XS;
14
14
  AST_LIST_LIST(V)
15
15
  #undef V
16
16
  #define V(S) typedef typename SpaceUString<Factory>::type S;
@@ -20,10 +20,10 @@ class AstSerializer: public AstVisitor<Factory>::const_type {
20
20
 
21
21
  typedef void ReturnType;
22
22
 
23
- #define V(AST) typedef typename iv::core::ast::AST<Factory> AST;
23
+ #define V(AST) typedef typename core::ast::AST<Factory> AST;
24
24
  AST_NODE_LIST(V)
25
25
  #undef V
26
- #define V(X, XS) typedef typename core::SpaceVector<Factory, X *>::type XS;
26
+ #define V(XS) typedef typename core::ast::AstNode<Factory>::XS XS;
27
27
  AST_LIST_LIST(V)
28
28
  #undef V
29
29
  #define V(S) typedef typename core::SpaceUString<Factory>::type S;
@@ -91,8 +91,8 @@ class AstSerializer: public AstVisitor<Factory>::const_type {
91
91
  Append("{\"type\":\"decl\",\"name\":");
92
92
  decl.name()->Accept(this);
93
93
  Append(",\"exp\":");
94
- if (decl.expr()) {
95
- decl.expr()->Accept(this);
94
+ if (const Maybe<const Expression> expr = decl.expr()) {
95
+ (*expr).Accept(this);
96
96
  }
97
97
  Append('}');
98
98
  ++it;
@@ -112,9 +112,9 @@ class AstSerializer: public AstVisitor<Factory>::const_type {
112
112
  ifstmt->cond()->Accept(this);
113
113
  Append(",\"body\":");
114
114
  ifstmt->then_statement()->Accept(this);
115
- if (ifstmt->else_statement()) {
115
+ if (const Maybe<const Statement> else_stmt = ifstmt->else_statement()) {
116
116
  Append(",\"else\":");
117
- ifstmt->else_statement()->Accept(this);
117
+ (*else_stmt).Accept(this);
118
118
  }
119
119
  Append('}');
120
120
  }
@@ -137,17 +137,17 @@ class AstSerializer: public AstVisitor<Factory>::const_type {
137
137
 
138
138
  void Visit(const ForStatement* forstmt) {
139
139
  Append("{\"type\":\"for\"");
140
- if (forstmt->init() != NULL) {
140
+ if (const Maybe<const Statement> init = forstmt->init()) {
141
141
  Append(",\"init\":");
142
- forstmt->init()->Accept(this);
142
+ (*init).Accept(this);
143
143
  }
144
- if (forstmt->cond() != NULL) {
144
+ if (const Maybe<const Expression> cond = forstmt->cond()) {
145
145
  Append(",\"cond\":");
146
- forstmt->cond()->Accept(this);
146
+ (*cond).Accept(this);
147
147
  }
148
- if (forstmt->next() != NULL) {
148
+ if (const Maybe<const Statement> next = forstmt->next()) {
149
149
  Append(",\"next\":");
150
- forstmt->next()->Accept(this);
150
+ (*next).Accept(this);
151
151
  }
152
152
  Append(",\"body\":");
153
153
  forstmt->body()->Accept(this);
@@ -166,25 +166,28 @@ class AstSerializer: public AstVisitor<Factory>::const_type {
166
166
 
167
167
  void Visit(const ContinueStatement* continuestmt) {
168
168
  Append("{\"type\":\"continue\"");
169
- if (continuestmt->label()) {
169
+ if (const Maybe<const Identifier> label = continuestmt->label()) {
170
170
  Append(",\"label\":");
171
- continuestmt->label()->Accept(this);
171
+ (*label).Accept(this);
172
172
  }
173
173
  Append('}');
174
174
  }
175
175
 
176
176
  void Visit(const BreakStatement* breakstmt) {
177
177
  Append("{\"type\":\"break\"");
178
- if (breakstmt->label()) {
178
+ if (const Maybe<const Identifier> label = breakstmt->label()) {
179
179
  Append(",\"label\":");
180
- breakstmt->label()->Accept(this);
180
+ (*label).Accept(this);
181
181
  }
182
182
  Append('}');
183
183
  }
184
184
 
185
185
  void Visit(const ReturnStatement* returnstmt) {
186
- Append("{\"type\":\"return\",\"exp\":");
187
- returnstmt->expr()->Accept(this);
186
+ Append("{\"type\":\"return\"");
187
+ if (const Maybe<const Expression> expr = returnstmt->expr()) {
188
+ Append(",\"exp\":");
189
+ (*expr).Accept(this);
190
+ }
188
191
  Append('}');
189
192
  }
190
193
 
@@ -214,11 +217,11 @@ class AstSerializer: public AstVisitor<Factory>::const_type {
214
217
  end = switchstmt->clauses().end();
215
218
  while (it != end) {
216
219
  const CaseClause& clause = **it;
217
- if (clause.IsDefault()) {
218
- Append("{\"type\":\"default\"");
219
- } else {
220
+ if (const Maybe<const Expression> expr = clause.expr()) {
220
221
  Append("{\"type\":\"case\",\"exp\":");
221
- clause.expr()->Accept(this);
222
+ (*expr).Accept(this);
223
+ } else {
224
+ Append("{\"type\":\"default\"");
222
225
  }
223
226
  Append(",\"body\"[");
224
227
  typename Statements::const_iterator stit = clause.body().begin();
@@ -248,16 +251,16 @@ class AstSerializer: public AstVisitor<Factory>::const_type {
248
251
  void Visit(const TryStatement* trystmt) {
249
252
  Append("{\"type\":\"try\",\"body\":");
250
253
  trystmt->body()->Accept(this);
251
- if (trystmt->catch_name()) {
254
+ if (const Maybe<const Identifier> ident = trystmt->catch_name()) {
252
255
  Append(",\"catch\":{\"type\":\"catch\",\"name\":");
253
- trystmt->catch_name()->Accept(this);
256
+ Visit(ident.Address());
254
257
  Append(",\"body\":");
255
- trystmt->catch_block()->Accept(this);
258
+ Visit(trystmt->catch_block().Address());
256
259
  Append('}');
257
260
  }
258
- if (trystmt->finally_block()) {
261
+ if (const Maybe<const Block> block = trystmt->finally_block()) {
259
262
  Append(",\"finally\":{\"type\":\"finally\",\"body\":");
260
- trystmt->finally_block()->Accept(this);
263
+ Visit(block.Address());
261
264
  Append('}');
262
265
  }
263
266
  Append('}');
@@ -355,10 +358,6 @@ class AstSerializer: public AstVisitor<Factory>::const_type {
355
358
  Append("{\"type\":\"false\"}");
356
359
  }
357
360
 
358
- void Visit(const Undefined* literal) {
359
- Append("{\"type\":\"undefined\"}");
360
- }
361
-
362
361
  void Visit(const RegExpLiteral* literal) {
363
362
  Append("{\"type\":\"regexp\",\"value\":\"");
364
363
  DecodeString(literal->value().begin(), literal->value().end());
@@ -369,12 +368,12 @@ class AstSerializer: public AstVisitor<Factory>::const_type {
369
368
 
370
369
  void Visit(const ArrayLiteral* literal) {
371
370
  Append("{\"type\":\"array\",\"value\":[");
372
- typename Expressions::const_iterator it = literal->items().begin();
373
- const typename Expressions::const_iterator end = literal->items().end();
371
+ typename MaybeExpressions::const_iterator it = literal->items().begin();
372
+ const typename MaybeExpressions::const_iterator end = literal->items().end();
374
373
  bool previous_is_elision = false;
375
374
  while (it != end) {
376
375
  if ((*it)) {
377
- (*it)->Accept(this);
376
+ (**it).Accept(this);
378
377
  previous_is_elision = false;
379
378
  } else {
380
379
  previous_is_elision = true;
@@ -423,8 +422,8 @@ class AstSerializer: public AstVisitor<Factory>::const_type {
423
422
 
424
423
  void Visit(const FunctionLiteral* literal) {
425
424
  Append("{\"type\":\"function\",\"name\":");
426
- if (literal->name()) {
427
- literal->name()->Accept(this);
425
+ if (const Maybe<const Identifier> name = literal->name()) {
426
+ Visit(name.Address());
428
427
  }
429
428
  Append(",\"params\":[");
430
429
  typename Identifiers::const_iterator it = literal->params().begin();