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 +1 -0
- data/Rakefile +1 -1
- data/ext/include/iv/ast.h +53 -62
- data/ext/include/iv/ast_factory.h +16 -23
- data/ext/include/iv/ast_fwd.h +6 -6
- data/ext/include/iv/ast_info.h +1 -1
- data/ext/include/iv/ast_serializer.h +35 -36
- data/ext/include/iv/ast_visitor.h +0 -1
- data/ext/include/iv/maybe.h +72 -0
- data/ext/include/iv/parser.h +64 -9
- data/ext/iv/phonic/ast_fwd.h +1 -1
- data/ext/iv/phonic/creator.h +53 -32
- data/ext/iv/phonic/factory.h +20 -30
- metadata +3 -2
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
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
|
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,
|
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
|
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
|
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
|
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
|
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
|
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
|
465
|
-
Expression<Factory
|
466
|
-
Statement<Factory
|
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
|
474
|
-
inline Expression<Factory
|
475
|
-
inline Statement<Factory
|
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
|
480
|
-
Expression<Factory
|
481
|
-
Statement<Factory
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
588
|
+
explicit ReturnStatement(Maybe<Expression<Factory> > expr)
|
585
589
|
: expr_(expr) {
|
586
590
|
}
|
587
|
-
inline Expression<Factory
|
591
|
+
inline Maybe<Expression<Factory> > expr() const { return expr_; }
|
588
592
|
DECLARE_DERIVED_NODE_TYPE(ReturnStatement)
|
589
593
|
private:
|
590
|
-
Expression<Factory
|
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
|
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
|
660
|
+
return !expr_;
|
657
661
|
}
|
658
|
-
inline Expression<Factory
|
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
|
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
|
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
|
726
|
-
Block<Factory
|
727
|
-
Block<Factory
|
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
|
735
|
-
inline Block<Factory
|
736
|
-
inline Block<Factory
|
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
|
741
|
-
Block<Factory
|
742
|
-
Block<Factory
|
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>::
|
1121
|
+
typedef typename AstNode<Factory>::MaybeExpressions MaybeExpressions;
|
1131
1122
|
|
1132
|
-
explicit ArrayLiteral(
|
1123
|
+
explicit ArrayLiteral(MaybeExpressions* items)
|
1133
1124
|
: items_(items) {
|
1134
1125
|
}
|
1135
|
-
inline const
|
1126
|
+
inline const MaybeExpressions& items() const {
|
1136
1127
|
return *items_;
|
1137
1128
|
}
|
1138
1129
|
DECLARE_DERIVED_NODE_TYPE(ArrayLiteral)
|
1139
1130
|
private:
|
1140
|
-
|
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
|
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
|
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
|
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(
|
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
|
-
:
|
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
|
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(
|
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
|
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
|
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
|
239
|
-
Expression
|
240
|
-
Statement
|
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
|
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
|
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
|
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
|
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
|
299
|
-
Block
|
300
|
-
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_;
|
data/ext/include/iv/ast_fwd.h
CHANGED
@@ -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(
|
94
|
-
V(
|
95
|
-
V(
|
96
|
-
V(
|
97
|
-
V(
|
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
|
|
data/ext/include/iv/ast_info.h
CHANGED
@@ -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(
|
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
|
23
|
+
#define V(AST) typedef typename core::ast::AST<Factory> AST;
|
24
24
|
AST_NODE_LIST(V)
|
25
25
|
#undef V
|
26
|
-
#define V(
|
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
|
-
|
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
|
-
|
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()
|
140
|
+
if (const Maybe<const Statement> init = forstmt->init()) {
|
141
141
|
Append(",\"init\":");
|
142
|
-
|
142
|
+
(*init).Accept(this);
|
143
143
|
}
|
144
|
-
if (forstmt->cond()
|
144
|
+
if (const Maybe<const Expression> cond = forstmt->cond()) {
|
145
145
|
Append(",\"cond\":");
|
146
|
-
|
146
|
+
(*cond).Accept(this);
|
147
147
|
}
|
148
|
-
if (forstmt->next()
|
148
|
+
if (const Maybe<const Statement> next = forstmt->next()) {
|
149
149
|
Append(",\"next\":");
|
150
|
-
|
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
|
-
|
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
|
-
|
180
|
+
(*label).Accept(this);
|
181
181
|
}
|
182
182
|
Append('}');
|
183
183
|
}
|
184
184
|
|
185
185
|
void Visit(const ReturnStatement* returnstmt) {
|
186
|
-
Append("{\"type\":\"return\"
|
187
|
-
returnstmt->expr()
|
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.
|
218
|
-
Append("{\"type\":\"default\"");
|
219
|
-
} else {
|
220
|
+
if (const Maybe<const Expression> expr = clause.expr()) {
|
220
221
|
Append("{\"type\":\"case\",\"exp\":");
|
221
|
-
|
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
|
-
|
256
|
+
Visit(ident.Address());
|
254
257
|
Append(",\"body\":");
|
255
|
-
trystmt->catch_block()
|
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
|
-
|
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
|
373
|
-
const typename
|
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
|
-
(
|
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
|
-
|
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();
|