Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions esquery.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
/* vim: set sw=4 sts=4 : */
(function () {

var estraverse = require('estraverse');
var parser = require('./parser');

var isArray = Array.isArray || function isArray(array) {
return {}.toString.call(array) === '[object Array]';
};

var PARSE_CACHE = {};

var LEFT_SIDE = {};
var RIGHT_SIDE = {};

Expand Down Expand Up @@ -312,7 +313,12 @@
* Parse a selector string and return its AST.
*/
function parse(selector) {
return parser.parse(selector);
if (PARSE_CACHE[selector]) {
return PARSE_CACHE[selector];
}
var parsed = parser.parse(selector);
PARSE_CACHE[selector] = parsed;
return parsed;
}

/**
Expand Down
8 changes: 6 additions & 2 deletions tests/parser.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
define([
"esquery",
"jstestr/assert",
"jstestr/test",
"jstestr/test"
], function (esquery, assert, test) {

test.defineSuite("basic query parsing", {
Expand All @@ -18,7 +18,11 @@ define([
assert.isNotEqual(void 0, esquery.parse("A "));
assert.isNotEqual(void 0, esquery.parse(" A "));
assert.isNotEqual(void 0, esquery.parse(" A "));
}
},

"memoize selector parsing": function () {
assert.isEqual(JSON.stringify(esquery.parse("A")) === JSON.stringify(esquery.parse("A")), true);
assert.isEqual(esquery.parse("A") === esquery.parse("A"), true);
}
});
});