Skip to content

Commit 7c99ef7

Browse files
committed
fix: handle recursive MemberExpressions
Signed-off-by: Snehil Shah <snehilshah.989@gmail.com>
1 parent 028f477 commit 7c99ef7

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

lib/node_modules/@stdlib/repl/lib/tokenizer.js

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,10 @@ function tokenizer( line, context ) {
264264
*
265265
* @private
266266
* @param {Object} node - AST node
267+
* @param {boolean} compute - boolean indicating whether to compute the `MemberExpression`
268+
* @returns {void|*} computed value of the `MemberExpression` if compute is true
267269
*/
268-
function resolveMemberExpression( node ) {
270+
function resolveMemberExpression( node, compute ) {
269271
var properties = linkedList();
270272
var property;
271273
var locals;
@@ -293,7 +295,6 @@ function tokenizer( line, context ) {
293295
if ( contains( locals, property.value.name ) ) {
294296
return;
295297
}
296-
297298
// Enter object's namespace:
298299
obj = context;
299300
properties = properties.iterator();
@@ -315,13 +316,17 @@ function tokenizer( line, context ) {
315316
property = properties.next();
316317
continue;
317318
}
318-
// Case: `foo.bar`:
319+
// Case: `foo.bar` - resolve property and push it as a token...
319320
if ( property.value.type === 'Identifier' ) {
320321
obj = obj[ property.value.name ];
321322
if ( !obj ) {
322323
// Property not found in context:
323324
break;
324325
}
326+
if ( compute ) {
327+
property = properties.next();
328+
continue;
329+
}
325330
// Push token if property exists in context:
326331
if ( isLiteralType( typeof obj ) ) {
327332
tokens.push({
@@ -341,8 +346,21 @@ function tokenizer( line, context ) {
341346
property = properties.next();
342347
continue;
343348
}
349+
// Case: `foo[a.b].bar` - recursively compute the internal `MemberExpression`...
350+
if ( property.value.type === 'MemberExpression' ) {
351+
obj = obj[ resolveMemberExpression( property.value, true ) ];
352+
if ( !obj ) {
353+
// Property not found in context:
354+
break;
355+
}
356+
property = properties.next();
357+
continue;
358+
}
344359
break;
345360
}
361+
if ( compute ) {
362+
return obj;
363+
}
346364

347365
/**
348366
* Resolves members of the `MemberExpression` node.
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
2-
"expression": "var foo = { 'bar': { 'func': function() { return true; } } };\nfoo['bar'].func()",
3-
"expected": "\u001b[31mfoo\u001b[0m[\u001b[32m'bar'\u001b[0m].\u001b[33mfunc\u001b[0m()",
2+
"expression": "var a = { 'b': 'bar' }; var foo = { 'bar': { 'func': function() { return true; } } };\nfoo[a.b].func()",
3+
"expected": "\u001b[31mfoo\u001b[0m[\u001b[31ma\u001b[0m.\u001b[32mb\u001b[0m].\u001b[33mfunc\u001b[0m()",
44
"theme": {
55
"object": "red",
66
"function": "yellow",
7-
"string": "green"
7+
"variable": "green"
88
}
99
}

0 commit comments

Comments
 (0)