iv-phonic 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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();