ext/iv/phonic/creator.h in iv-phonic-0.1.0 vs ext/iv/phonic/creator.h in iv-phonic-0.1.1
- old
+ new
@@ -34,53 +34,64 @@
last = stmt->body().end(); it != last; ++it) {
(*it)->Accept(this);
rb_ary_push(array, ret_);
}
rb_hash_aset(hash, SYM("body"), array);
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const FunctionStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("FunctionStatement"));
Visit(stmt->function());
rb_hash_aset(hash, SYM("body"), ret_);
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const FunctionDeclaration* decl) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("FunctionDeclaration"));
Visit(decl->function());
rb_hash_aset(hash, SYM("body"), ret_);
+ SetLocation(hash, decl);
ret_ = hash;
}
void Visit(const VariableStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("VariableStatement"));
rb_hash_aset(hash, SYM("const"), stmt->IsConst() ? Qtrue : Qfalse);
VALUE array = rb_ary_new();
for (Declarations::const_iterator it = stmt->decls().begin(),
last = stmt->decls().end(); it != last; ++it) {
- VALUE decl = rb_hash_new();
- rb_hash_aset(decl, SYM("type"), rb_str_new_cstr("Declaration"));
- Visit((*it)->name());
- rb_hash_aset(decl, SYM("name"), ret_);
- if ((*it)->expr()) {
- (*it)->expr()->Accept(this);
- rb_hash_aset(decl, SYM("expr"), ret_);
- }
- rb_ary_push(array, decl);
+ Visit(*it);
+ rb_ary_push(array, ret_);
}
rb_hash_aset(hash, SYM("body"), array);
+ SetLocation(hash, stmt);
ret_ = hash;
}
+ void Visit(const Declaration* decl) {
+ VALUE hash = rb_hash_new();
+ rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("Declaration"));
+ Visit(decl->name());
+ rb_hash_aset(hash, SYM("name"), ret_);
+ if (decl->expr()) {
+ decl->expr()->Accept(this);
+ rb_hash_aset(hash, SYM("expr"), ret_);
+ }
+ SetLocation(hash, decl);
+ ret_ = hash;
+ }
+
void Visit(const EmptyStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("EmptyStatement"));
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const IfStatement* stmt) {
VALUE hash = rb_hash_new();
@@ -91,30 +102,33 @@
rb_hash_aset(hash, SYM("then"), ret_);
if (stmt->else_statement()) {
stmt->else_statement()->Accept(this);
rb_hash_aset(hash, SYM("else"), ret_);
}
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const DoWhileStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("DoWhileStatement"));
stmt->cond()->Accept(this);
rb_hash_aset(hash, SYM("cond"), ret_);
stmt->body()->Accept(this);
rb_hash_aset(hash, SYM("body"), ret_);
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const WhileStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("WhileStatement"));
stmt->cond()->Accept(this);
rb_hash_aset(hash, SYM("cond"), ret_);
stmt->body()->Accept(this);
rb_hash_aset(hash, SYM("body"), ret_);
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const ForStatement* stmt) {
VALUE hash = rb_hash_new();
@@ -131,10 +145,11 @@
stmt->next()->Accept(this);
rb_hash_aset(hash, SYM("next"), ret_);
}
stmt->body()->Accept(this);
rb_hash_aset(hash, SYM("body"), ret_);
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const ForInStatement* stmt) {
VALUE hash = rb_hash_new();
@@ -143,58 +158,64 @@
rb_hash_aset(hash, SYM("each"), ret_);
stmt->enumerable()->Accept(this);
rb_hash_aset(hash, SYM("enum"), ret_);
stmt->body()->Accept(this);
rb_hash_aset(hash, SYM("body"), ret_);
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const ContinueStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("ContinueStatement"));
if (stmt->label()) {
stmt->label()->Accept(this);
rb_hash_aset(hash, SYM("label"), ret_);
}
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const BreakStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("BreakStatement"));
if (stmt->label()) {
stmt->label()->Accept(this);
rb_hash_aset(hash, SYM("label"), ret_);
}
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const ReturnStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("ReturnStatement"));
stmt->expr()->Accept(this);
rb_hash_aset(hash, SYM("expr"), ret_);
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const WithStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("WithStatement"));
stmt->context()->Accept(this);
rb_hash_aset(hash, SYM("context"), ret_);
stmt->body()->Accept(this);
rb_hash_aset(hash, SYM("body"), ret_);
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const LabelledStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("LabelledStatement"));
stmt->label()->Accept(this);
rb_hash_aset(hash, SYM("label"), ret_);
stmt->body()->Accept(this);
rb_hash_aset(hash, SYM("body"), ret_);
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const SwitchStatement* stmt) {
VALUE hash = rb_hash_new();
@@ -202,54 +223,65 @@
stmt->expr()->Accept(this);
rb_hash_aset(hash, SYM("cond"), ret_);
VALUE array = rb_ary_new();
for (CaseClauses::const_iterator it = stmt->clauses().begin(),
last = stmt->clauses().end(); it != last; ++it) {
- VALUE clause = rb_hash_new();
- if ((*it)->IsDefault()) {
- rb_hash_aset(clause, SYM("type"), rb_str_new_cstr("Default"));
- } else {
- rb_hash_aset(clause, SYM("type"), rb_str_new_cstr("Case"));
- (*it)->expr()->Accept(this);
- rb_hash_aset(clause, SYM("expr"), ret_);
- }
- VALUE stmts = rb_ary_new();
- for (Statements::const_iterator st = (*it)->body().begin(),
- stlast = (*it)->body().end(); st != stlast; ++st) {
- (*st)->Accept(this);
- rb_ary_push(stmts, ret_);
- }
- rb_hash_aset(clause, SYM("body"), stmts);
+ Visit(*it);
rb_ary_push(array, ret_);
}
rb_hash_aset(hash, SYM("clauses"), array);
+ SetLocation(hash, stmt);
ret_ = hash;
}
+ void Visit(const CaseClause* cl) {
+ VALUE hash = rb_hash_new();
+ if (cl->IsDefault()) {
+ rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("Default"));
+ } else {
+ rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("Case"));
+ cl->expr()->Accept(this);
+ rb_hash_aset(hash, SYM("expr"), ret_);
+ }
+ VALUE stmts = rb_ary_new();
+ for (Statements::const_iterator st = cl->body().begin(),
+ stlast = cl->body().end(); st != stlast; ++st) {
+ (*st)->Accept(this);
+ rb_ary_push(stmts, ret_);
+ }
+ rb_hash_aset(hash, SYM("body"), stmts);
+ SetLocation(hash, cl);
+ ret_ = hash;
+ }
+
void Visit(const ThrowStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("ThrowStatement"));
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const TryStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("TryStatement"));
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const DebuggerStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("DebuggerStatement"));
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const ExpressionStatement* stmt) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("ExpressionStatement"));
stmt->expr()->Accept(this);
rb_hash_aset(hash, SYM("body"), ret_);
+ SetLocation(hash, stmt);
ret_ = hash;
}
void Visit(const Assignment* expr) {
VALUE hash = rb_hash_new();
@@ -258,10 +290,11 @@
rb_str_new_cstr(core::Token::ToString(expr->op())));
expr->left()->Accept(this);
rb_hash_aset(hash, SYM("left"), ret_);
expr->right()->Accept(this);
rb_hash_aset(hash, SYM("right"), ret_);
+ SetLocation(hash, expr);
ret_ = hash;
}
void Visit(const BinaryOperation* expr) {
VALUE hash = rb_hash_new();
@@ -270,10 +303,11 @@
rb_str_new_cstr(core::Token::ToString(expr->op())));
expr->left()->Accept(this);
rb_hash_aset(hash, SYM("left"), ret_);
expr->right()->Accept(this);
rb_hash_aset(hash, SYM("right"), ret_);
+ SetLocation(hash, expr);
ret_ = hash;
}
void Visit(const ConditionalExpression* expr) {
VALUE hash = rb_hash_new();
@@ -282,30 +316,33 @@
rb_hash_aset(hash, SYM("cond"), ret_);
expr->left()->Accept(this);
rb_hash_aset(hash, SYM("left"), ret_);
expr->right()->Accept(this);
rb_hash_aset(hash, SYM("right"), ret_);
+ SetLocation(hash, expr);
ret_ = hash;
}
void Visit(const UnaryOperation* expr) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("UnaryOperation"));
rb_hash_aset(hash, SYM("op"),
rb_str_new_cstr(core::Token::ToString(expr->op())));
expr->expr()->Accept(this);
rb_hash_aset(hash, SYM("expr"), ret_);
+ SetLocation(hash, expr);
ret_ = hash;
}
void Visit(const PostfixExpression* expr) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("PostfixExpression"));
rb_hash_aset(hash, SYM("op"),
rb_str_new_cstr(core::Token::ToString(expr->op())));
expr->expr()->Accept(this);
rb_hash_aset(hash, SYM("expr"), ret_);
+ SetLocation(hash, expr);
ret_ = hash;
}
void Visit(const StringLiteral* literal) {
VALUE hash = rb_hash_new();
@@ -315,17 +352,19 @@
Encoding::ConvertToDefaultInternal(
rb_enc_str_new(
reinterpret_cast<const char*>(str.data()),
str.size()*2,
rb_to_encoding(Encoding::UTF16Encoding()))));
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const NumberLiteral* literal) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("NumberLiteral"));
rb_hash_aset(hash, SYM("value"), rb_float_new(literal->value()));
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const Identifier* literal) {
VALUE hash = rb_hash_new();
@@ -335,38 +374,44 @@
Encoding::ConvertToDefaultInternal(
rb_enc_str_new(
reinterpret_cast<const char*>(str.data()),
str.size()*2,
rb_to_encoding(Encoding::UTF16Encoding()))));
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const ThisLiteral* literal) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("ThisLiteral"));
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const NullLiteral* literal) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("NullLiteral"));
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const TrueLiteral* literal) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("TrueLiteral"));
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const FalseLiteral* literal) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("FalseLiteral"));
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const Undefined* literal) {
+ // Undefined has no location
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("Undefined"));
ret_ = hash;
}
@@ -385,10 +430,11 @@
Encoding::ConvertToDefaultInternal(
rb_enc_str_new(
reinterpret_cast<const char*>(flags.data()),
flags.size()*2,
rb_to_encoding(Encoding::UTF16Encoding()))));
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const ArrayLiteral* literal) {
VALUE hash = rb_hash_new();
@@ -398,10 +444,11 @@
last = literal->items().end(); it != last; ++it) {
(*it)->Accept(this);
rb_ary_push(array, ret_);
}
rb_hash_aset(hash, SYM("value"), array);
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const ObjectLiteral* literal) {
using std::tr1::get;
@@ -439,10 +486,11 @@
SYM("value"),
ret_);
rb_ary_push(array, item);
}
rb_hash_aset(hash, SYM("value"), array);
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const FunctionLiteral* literal) {
VALUE hash = rb_hash_new();
@@ -467,30 +515,33 @@
(*it)->Accept(this);
rb_ary_push(array, ret_);
}
rb_hash_aset(hash, SYM("body"), array);
}
+ SetLocation(hash, literal);
ret_ = hash;
}
void Visit(const IndexAccess* expr) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("IndexAccess"));
expr->target()->Accept(this);
rb_hash_aset(hash, SYM("target"), ret_);
expr->key()->Accept(this);
rb_hash_aset(hash, SYM("key"), ret_);
+ SetLocation(hash, expr);
ret_ = hash;
}
void Visit(const IdentifierAccess* expr) {
VALUE hash = rb_hash_new();
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("IdentifierAccess"));
expr->target()->Accept(this);
rb_hash_aset(hash, SYM("target"), ret_);
Visit(expr->key());
rb_hash_aset(hash, SYM("key"), ret_);
+ SetLocation(hash, expr);
ret_ = hash;
}
void Visit(const FunctionCall* call) {
VALUE hash = rb_hash_new();
@@ -502,10 +553,11 @@
last = call->args().end(); it != last; ++it) {
(*it)->Accept(this);
rb_ary_push(args, ret_);
}
rb_hash_aset(hash, SYM("args"), args);
+ SetLocation(hash, call);
ret_ = hash;
}
void Visit(const ConstructorCall* call) {
VALUE hash = rb_hash_new();
@@ -517,13 +569,20 @@
last = call->args().end(); it != last; ++it) {
(*it)->Accept(this);
rb_ary_push(args, ret_);
}
rb_hash_aset(hash, SYM("args"), args);
+ SetLocation(hash, call);
ret_ = hash;
}
private:
+
+ static void SetLocation(VALUE hash, const AstNode* node) {
+ rb_hash_aset(hash, SYM("begin"), INT2NUM(node->begin_position()));
+ rb_hash_aset(hash, SYM("end"), INT2NUM(node->end_position()));
+ }
+
VALUE ret_;
};
} } // namespace iv::phonic