diff --git a/lib/repl.js b/lib/repl.js index 321d5c6bf9c361..6621a4d9e8131e 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -1168,7 +1168,7 @@ const importRE = /\bimport\s*\(\s*['"`](([\w@./:-]+\/)?(?:[\w@./:-]*))(?![^'"`]) const requireRE = /\brequire\s*\(\s*['"`](([\w@./:-]+\/)?(?:[\w@./:-]*))(?![^'"`])$/; const fsAutoCompleteRE = /fs(?:\.promises)?\.\s*[a-z][a-zA-Z]+\(\s*["'](.*)/; const simpleExpressionRE = - /(?:[a-zA-Z_$](?:\w|\$)*\??\.)*[a-zA-Z_$](?:\w|\$)*\??\.?$/; + /(?:[\w$'"`[{(](?:\w|\$|['"`\]})])*\??\.)*[a-zA-Z_$](?:\w|\$)*\??\.?$/; const versionedFileNamesRe = /-\d+\.\d+/; function isIdentifier(str) { diff --git a/test/parallel/test-repl-tab-complete.js b/test/parallel/test-repl-tab-complete.js index aa5c7958a58b2e..270fb768b030cf 100644 --- a/test/parallel/test-repl-tab-complete.js +++ b/test/parallel/test-repl-tab-complete.js @@ -558,6 +558,26 @@ testMe.complete('obj.', common.mustCall(function(error, data) { putIn.run(['.clear']); testMe.complete('Buffer.prototype.', common.mustCall()); +// Make sure repl gives correct autocomplete on literals +testMe.complete('``.a', common.mustCall((err, data) => { + assert.strictEqual(data[0].includes('``.at'), true); +})); +testMe.complete('\'\'.a', common.mustCall((err, data) => { + assert.strictEqual(data[0].includes('\'\'.at'), true); +})); +testMe.complete('"".a', common.mustCall((err, data) => { + assert.strictEqual(data[0].includes('"".at'), true); +})); +testMe.complete('("").a', common.mustCall((err, data) => { + assert.strictEqual(data[0].includes('("").at'), true); +})); +testMe.complete('[].a', common.mustCall((err, data) => { + assert.strictEqual(data[0].includes('[].at'), true); +})); +testMe.complete('{}.a', common.mustCall((err, data) => { + assert.deepStrictEqual(data[0], []); +})); + const testNonGlobal = repl.start({ input: putIn, output: putIn,