/*
var filename = '__main__.py';
var python_source = 'a, b = 0\nfor x in y:\n t = 0';
parse = Sk.parse(filename, python_source);
ast = Sk.astFromParse(parse.cst, filename, parse.flags);
*/
var iter_fields = function(node) {
/** Yield a tuple of ``(fieldname, value)`` for each field in ``node._fields``
that is present on *node*. **/
var fieldList = [];
for (var i = 0; i < node._fields.length; i += 2) {
var field = node._fields[i];
if (field in node) {
fieldList.push([field, node[field]]);
}
}
return fieldList;
}
var iter_child_nodes = function(node) {
var fieldList = iter_fields(node);
var resultList = [];
for (var i = 0; i < fieldList.length; i += 1) {
var field = fieldList[i][0], value = fieldList[i][1];
if (value === null) {
continue;
}
if ("_astname" in value) {
resultList.push(value);
} else if (value.constructor === Array) {
for (var j = 0; j < value.length; j += 1) {
var subvalue = value[j];
if ("_astname" in subvalue) {
resultList.push(subvalue);
}
}
}
}
return resultList;
}
function NodeVisitor() {};
NodeVisitor.prototype.visit = function(node) {
/** Visit a node. **/
var method_name = 'visit_' + node._astname;
if (method_name in this) {
return this[method_name](node);
} else {
return this.generic_visit(node);
}
}
NodeVisitor.prototype.walk = function(node) {
var resultList = [node];
var childList = iter_child_nodes(node);
for (var i = 0; i < childList.length; i += 1) {
var child = childList[i];
resultList.concat(this.walk(child));
}
return resultList;
}
NodeVisitor.prototype.visitList = function(nodes) {
for (var j = 0; j < nodes.length; j += 1) {
var node = nodes[j];
if ("_astname" in node) {
this.visit(node);
}
}
}
NodeVisitor.prototype.generic_visit = function(node) {
/** Called if no explicit visitor function exists for a node. **/
var fieldList = iter_fields(node);
for (var i = 0; i < fieldList.length; i += 1) {
var field = fieldList[i][0], value = fieldList[i][1];
if (value === null) {
continue;
}
if (Array === value.constructor) {
for (var j = 0; j < value.length; j += 1) {
var subvalue = value[j];
if (subvalue instanceof Object && "_astname" in subvalue) {
this.visit(subvalue);
}
}
} else if (value instanceof Object && "_astname" in value) {
this.visit(value);
}
}
}
NodeVisitor.prototype.recursive_walk = function(node) {
var todo = [node];
var result = [];
while (todo.length > 0) {
node = todo.shift();
todo = todo.concat(iter_child_nodes(node))
result.push(node);
}
return result;
}
/*
function CodeAnalyzer() {
NodeVisitor.apply(this, Array.prototype.slice.call(arguments));
this.id = 0;
};
CodeAnalyzer.prototype = new NodeVisitor();
CodeAnalyzer.prototype.visit = function(node) {
node._id = this.id;
this.id += 1;
NodeVisitor.prototype.visit.call(this, node);
//console.log(node);
}
*/
/*
CodeAnalyzer.prototype.visit_Num = function(node) {
node._id = this.id;
this.id += 1;
console.log(node.n.v);
// NodeVisitor.prototype.visit_Num.call(this, node);
};*/
//console.log((new NodeVisitor()).visit(ast));