Skip to content

Commit eb882ea

Browse files
committed
Fix bug for shouldProvideItems and add tests
1 parent fd8ba70 commit eb882ea

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

src/completionProvider.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,14 @@ export class ParamHintCompletionProvider extends CompletionProvider implements C
117117
private shouldProvideItems(precedingText: string, activePos: Position, doc: TextDocument): boolean {
118118

119119
if (activePos.character > 0 && !/#/.test(precedingText)) {
120-
let provide = new RegExp("^[ \t]*def\\(", "m").test(precedingText);
120+
let provide = new RegExp("^[ \t]*def [^(]+\\(", "m").test(precedingText);
121121

122122
if (!provide) {
123123
const nLinesToCheck = activePos.line > 4 ? 4 : activePos.line;
124-
const range = new Range(doc.lineAt(activePos.line - nLinesToCheck).range.start, activePos);
125-
provide = new RegExp(
126-
`^[ \t]*def(?![\s\S]+(\\):|-> *${simpleIdentifier}:))`,
127-
"m"
128-
).test(doc.getText(range));
124+
const previousLines = doc.getText(
125+
new Range(doc.lineAt(activePos.line - nLinesToCheck).range.start, activePos)
126+
);
127+
provide = new RegExp(`^[ \t]*def(?![\\s\\S]+(\\):|-> *${simpleIdentifier}:))`, "m").test(previousLines);
129128
}
130129
return provide;
131130
}

test/providers/completionProvider.test.ts

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,15 @@ suite('ParamHintCompletionProvider', () => {
4242
assert.notEqual(actual, null);
4343
assert.equal(actual?.items[0].label.trim(), PythonType.Int);
4444
});
45+
46+
test("provides items for nestled function", async () => {
47+
let data = `):
48+
x = 1
49+
def nestled(multiple_lines,
50+
paramName:`;
51+
let actual = await providerResult(provider, data);
52+
assert.notEqual(actual, null);
53+
});
4554

4655
test("does not provide items unless a function def is detected", async () => {
4756
let text = " :";
@@ -56,10 +65,18 @@ suite('ParamHintCompletionProvider', () => {
5665
});
5766

5867
test("does not provide items for ':' under a function def", async () => {
59-
let data = "):\n d = 'val:";
68+
let data = "):\n d = ', not_a_param:";
6069
let expected = null;
6170
let actual = await providerResult(provider, data);
6271
assert.equal(actual, expected, messageFor({ data, expected }, actual));
72+
73+
data = `self, lt: List[Tuple[str]],
74+
s: str,
75+
f: float,
76+
i: int):
77+
v = ', not_a_param:`;
78+
actual = await providerResult(provider, data);
79+
assert.equal(actual, null, messageFor({ data, expected }, actual));
6380

6481
data = "):\n :";
6582
actual = await providerResult(provider, data);
@@ -68,6 +85,15 @@ suite('ParamHintCompletionProvider', () => {
6885
data = "):\n d = { key:";
6986
actual = await providerResult(provider, data);
7087
assert.equal(actual, null, messageFor({ data, expected }, actual));
88+
89+
data = `
90+
def __init__(self, lt: List[Tuple[str]],
91+
s: str,
92+
f: float,
93+
i: int):
94+
v = ', not_a_param:`;
95+
actual = await providerResult(provider, data);
96+
assert.equal(actual, null, messageFor({ data, expected }, actual));
7197
});
7298

7399
test("does not provide items for end of function definition", async () => {
@@ -99,7 +125,11 @@ async function providerResult(
99125
content += trailingText;
100126
}
101127

102-
return provideCompletionItems(provider, content, lastPos);
128+
const doc = await vsc.workspace.openTextDocument({ language, content });
129+
const token = new vsc.CancellationTokenSource().token;
130+
const ctx = { triggerCharacter: paramHintTrigger, triggerKind: vsc.CompletionTriggerKind.TriggerCharacter };
131+
132+
return provider.provideCompletionItems(doc, lastPos, token, ctx);
103133
}
104134

105135
async function provideCompletionItems(

0 commit comments

Comments
 (0)