ast-types
Advanced tools
Comparing version 0.2.15 to 0.2.16
@@ -113,12 +113,20 @@ var types = require("../lib/types"); | ||
.bases("Statement") | ||
.build("block", "handlers", "finalizer") | ||
.build("block", "handler", "finalizer") | ||
.field("block", def("BlockStatement")) | ||
// The Mozilla Parser API calls for the commented-out fields below, | ||
// but Esprima behaves the other way. TODO Report this. | ||
// .field("handler", or(def("CatchClause"), null)) | ||
// .field("guardedHandlers", [def("CatchClause")]) | ||
.field("handlers", [def("CatchClause")]) | ||
.field("handler", or(def("CatchClause"), null), function() { | ||
return this.handlers && this.handlers[0] || null; | ||
}) | ||
.field("handlers", [def("CatchClause")], function() { | ||
return this.handler ? [this.handler] : []; | ||
}, true) // Indicates this field is hidden from eachField iteration. | ||
.field("guardedHandlers", [def("CatchClause")], defaults.emptyArray) | ||
.field("finalizer", or(def("BlockStatement"), null), defaults.null); | ||
def("CatchClause") | ||
.bases("Node") | ||
.build("param", "guard", "body") | ||
.field("param", def("Pattern")) | ||
.field("guard", or(def("Expression"), null), defaults.null) | ||
.field("body", def("BlockStatement")); | ||
def("WhileStatement") | ||
@@ -328,9 +336,2 @@ .bases("Statement") | ||
def("CatchClause") | ||
.bases("Node") | ||
.build("param", "guard", "body") | ||
.field("param", def("Pattern")) | ||
.field("guard", or(def("Expression"), null), defaults.null) | ||
.field("body", def("BlockStatement")); | ||
def("Identifier") | ||
@@ -337,0 +338,0 @@ // But aren't Expressions and Patterns already Nodes? TODO Report this. |
@@ -203,3 +203,3 @@ var assert = require("assert"); | ||
function Field(name, type, defaultFn) { | ||
function Field(name, type, defaultFn, hidden) { | ||
var self = this; | ||
@@ -214,3 +214,4 @@ | ||
name: { value: name }, | ||
type: { value: type } | ||
type: { value: type }, | ||
hidden: { value: !!hidden } | ||
}; | ||
@@ -496,5 +497,5 @@ | ||
// any number of arguments to specify the field. | ||
Dp.field = function(name, type, defaultFn) { | ||
Dp.field = function(name, type, defaultFn, hidden) { | ||
assert.strictEqual(this.finalized, false); | ||
this.ownFields[name] = new Field(name, type, defaultFn); | ||
this.ownFields[name] = new Field(name, type, defaultFn, hidden); | ||
return this; // For chaining. | ||
@@ -534,3 +535,6 @@ }; | ||
Object.keys(all).forEach(function(name) { | ||
callback.call(this, name, all[name].getValue(object)); | ||
var field = all[name]; | ||
if (!field.hidden) { | ||
callback.call(this, name, field.getValue(object)); | ||
} | ||
}, context); | ||
@@ -537,0 +541,0 @@ } |
@@ -20,2 +20,3 @@ var types = require("./lib/types"); | ||
exports.eachField = types.eachField; | ||
exports.traverse = require("./lib/traverse"); | ||
exports.finalize = types.finalize; |
@@ -21,3 +21,3 @@ { | ||
], | ||
"version": "0.2.15", | ||
"version": "0.2.16", | ||
"homepage": "http://github.com/benjamn/ast-types", | ||
@@ -24,0 +24,0 @@ "repository": { |
@@ -195,2 +195,16 @@ var types = require("../main"); | ||
type: "TryStatement", | ||
}, "handler"), | ||
null | ||
); | ||
assert.deepEqual( | ||
types.getFieldValue({ | ||
type: "TryStatement", | ||
}, "handlers"), | ||
[] | ||
); | ||
assert.deepEqual( | ||
types.getFieldValue({ | ||
type: "TryStatement", | ||
}, "guardedHandlers"), | ||
@@ -236,3 +250,4 @@ [] | ||
check({ type: "TryStatement" }, [ | ||
"type", "block", "handlers", "guardedHandlers", "finalizer", "loc" | ||
// Note that the "handlers" field is now hidden from eachField. | ||
"type", "block", "handler", "guardedHandlers", "finalizer", "loc" | ||
]); | ||
@@ -248,1 +263,43 @@ | ||
}; | ||
exports.testTraverse = function(t, assert) { | ||
var traverse = types.traverse; | ||
var call = b.expressionStatement( | ||
b.callExpression( | ||
b.memberExpression( | ||
b.identifier("foo"), | ||
b.identifier("bar"), | ||
false | ||
), | ||
[b.literal("baz")] | ||
) | ||
); | ||
var ts = b.tryStatement( | ||
b.blockStatement([call, call]), | ||
b.catchClause( | ||
b.identifier("err"), | ||
null, | ||
b.blockStatement([]) | ||
) | ||
); | ||
var literalCount = 0; | ||
traverse(ts, function(node) { | ||
if (n.Literal.check(node)) { | ||
literalCount += 1; | ||
assert.strictEqual(node.value, "baz"); | ||
assert.strictEqual(this.parent.node, call.expression); | ||
assert.strictEqual(this.parent.parent.node, call); | ||
assert.strictEqual(this.parent.parent.parent.node, ts.block); | ||
assert.strictEqual(this.parent.parent.parent.parent.node, ts); | ||
assert.strictEqual(this.parent.parent.parent.parent.parent, null); | ||
} | ||
}); | ||
assert.strictEqual(literalCount, 2); | ||
t.finish(); | ||
}; |
381644
15
10802