diff --git a/esquery.js b/esquery.js index 97407ff..f2de80e 100644 --- a/esquery.js +++ b/esquery.js @@ -1,6 +1,5 @@ /* vim: set sw=4 sts=4 : */ (function () { - var estraverse = require('estraverse'); var parser = require('./parser'); @@ -8,6 +7,8 @@ return {}.toString.call(array) === '[object Array]'; }; + var PARSE_CACHE = {}; + var LEFT_SIDE = {}; var RIGHT_SIDE = {}; @@ -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; } /** diff --git a/tests/parser.js b/tests/parser.js index d79f093..de58d2c 100644 --- a/tests/parser.js +++ b/tests/parser.js @@ -1,7 +1,7 @@ define([ "esquery", "jstestr/assert", - "jstestr/test", + "jstestr/test" ], function (esquery, assert, test) { test.defineSuite("basic query parsing", { @@ -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); + } }); });