Skip to content

Commit 16b9a70

Browse files
authored
fix member expression completions (#1758)
* fix member expression completions * fix test (it cannot be seen in ide, so whatever) * restore completions before property completion restore completions in computed * simplify code with parent a bit * minor unintended change (added for syntax highlight)
1 parent 1abd10e commit 16b9a70

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

src/adapter/completions.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,16 +145,25 @@ export class Completions {
145145
let candidate: () => Promise<ICompletionWithSort[]> = () => Promise.resolve([]);
146146

147147
traverse(source, {
148-
enter: node => {
148+
enter: (node, parent) => {
149149
const asAcorn = node as AcornNode;
150150
if (asAcorn.start < offset && offset <= asAcorn.end) {
151-
if (node.type === 'Identifier') {
151+
if (
152+
node.type === 'MemberExpression' ||
153+
(node.type === 'Identifier' &&
154+
parent?.type === 'MemberExpression' &&
155+
!parent.computed &&
156+
parent.object !== node)
157+
) {
158+
const memberExpression =
159+
node.type === 'MemberExpression' ? node : (parent as MemberExpression);
160+
candidate = memberExpression.computed
161+
? () => this.elementAccessCompleter(options, memberExpression, offset)
162+
: () => this.propertyAccessCompleter(options, memberExpression, offset);
163+
} else if (node.type === 'Identifier') {
152164
candidate = () => this.identifierCompleter(options, source, node, offset);
153-
} else if (node.type === 'MemberExpression') {
154-
candidate = node.computed
155-
? () => this.elementAccessCompleter(options, node, offset)
156-
: () => this.propertyAccessCompleter(options, node, offset);
157165
}
166+
parent = node;
158167
}
159168
},
160169
});

src/test/completion/completion.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { itIntegrates } from '../testIntegrationUtils';
99
describe('completion', () => {
1010
const tcases: [string, Dap.CompletionItem[]][] = [
1111
['ar|', [{ label: 'arr', sortText: '~~arr', type: 'variable', detail: 'Array' }]],
12+
['ar|.length', [{ label: 'arr', sortText: '~~arr', type: 'variable', detail: 'Array' }]],
1213
[
1314
'arr.|',
1415
[
@@ -36,6 +37,27 @@ describe('completion', () => {
3637
},
3738
],
3839
],
40+
[
41+
'arr.len|',
42+
[
43+
{
44+
label: '[index]',
45+
text: '[index]',
46+
type: 'property',
47+
sortText: '~~[',
48+
length: 1,
49+
selectionLength: 5,
50+
selectionStart: 1,
51+
start: 3,
52+
},
53+
{
54+
label: 'length',
55+
detail: '3',
56+
sortText: '~~length',
57+
type: 'property',
58+
},
59+
],
60+
],
3961
['arr[|', []],
4062
[
4163
'arr[0].|',

0 commit comments

Comments
 (0)