Skip to content

Commit 0a83b53

Browse files
committed
Add return type hint completion
1 parent 58a2234 commit 0a83b53

File tree

4 files changed

+51
-9
lines changed

4 files changed

+51
-9
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ The extension is not published yet.
1515

1616
## Known Issues
1717

18-
* The difference between classes and function calls when detecting types is determined by the first letter being upper case (unless the class or function is declared in the currently edited document).
18+
* The difference between classes and function calls when detecting types is determined by the first letter being upper case (unless the class or function is defined in the currently edited document).
1919

2020
-------------------------------------------------------------------------------------------

src/completionProvider.ts

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,20 @@ import {
1010
TextDocument
1111
} from "vscode";
1212
import { TypeResolver } from "./typeResolver";
13-
import { typeHintCharacter, Type } from "./syntax";
13+
import { paramHintTrigger, returnHintTrigger, Type } from "./syntax";
1414

1515
/**
16-
* Provides one or more type hint {@link CompletionItem}.
16+
* Provides one or more parameter type hint {@link CompletionItem}.
1717
*/
18-
export class HintCompletionProvider implements CompletionItemProvider {
18+
export class ParamHintCompletionProvider implements CompletionItemProvider {
1919

2020
public provideCompletionItems(
2121
doc: TextDocument,
2222
pos: Position,
2323
token: CancellationToken,
2424
context: CompletionContext
2525
): Thenable<CompletionList> | null {
26-
if (context.triggerCharacter !== typeHintCharacter) {
26+
if (context.triggerCharacter !== paramHintTrigger) {
2727
return null;
2828
}
2929
const items: CompletionItem[] = [];
@@ -59,4 +59,44 @@ export class HintCompletionProvider implements CompletionItemProvider {
5959
}
6060
return param;
6161
}
62+
}
63+
64+
/**
65+
* Provides one or more return type hint {@link CompletionItem}.
66+
*/
67+
export class ReturnHintCompletionProvider implements CompletionItemProvider {
68+
69+
public provideCompletionItems(
70+
doc: TextDocument,
71+
pos: Position,
72+
token: CancellationToken,
73+
context: CompletionContext
74+
): Thenable<CompletionList> | null {
75+
if (context.triggerCharacter !== returnHintTrigger) {
76+
return null;
77+
}
78+
const items: CompletionItem[] = [];
79+
const line = doc.lineAt(pos);
80+
81+
if (this.shouldProvideReturnHint(line, pos)) {
82+
pushDefaultCompletionItems(items);
83+
}
84+
return Promise.resolve(new CompletionList(items, false));
85+
}
86+
87+
private shouldProvideReturnHint(line: TextLine, pos: Position): boolean {
88+
if (pos.character > 0 && line.text.substr(pos.character - 2, 2) === "->") {
89+
90+
if (new RegExp("^[*\t]*def.*\\) *->[: ]*$", "m").test(line.text)) {
91+
return true;
92+
}
93+
}
94+
return false;
95+
}
96+
}
97+
98+
function pushDefaultCompletionItems(items: CompletionItem[]) {
99+
for (const type of Object.values(Type)) {
100+
items.push(new CompletionItem(" " + type, CompletionItemKind.TypeParameter));
101+
}
62102
}

src/extension.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as vscode from 'vscode';
2-
import { HintCompletionProvider } from './completionProvider';
3-
import { typeHintCharacter } from "./syntax";
2+
import { ParamHintCompletionProvider, ReturnHintCompletionProvider } from './completionProvider';
3+
import { paramHintTrigger, returnHintTrigger } from "./syntax";
44

55
// Called when the extension is activated.
66
export function activate(context: vscode.ExtensionContext) {
@@ -11,7 +11,8 @@ export function activate(context: vscode.ExtensionContext) {
1111
}
1212

1313
context.subscriptions.push(
14-
vscode.languages.registerCompletionItemProvider('python', new HintCompletionProvider(), typeHintCharacter)
14+
vscode.languages.registerCompletionItemProvider('python', new ParamHintCompletionProvider(), paramHintTrigger),
15+
vscode.languages.registerCompletionItemProvider('python', new ReturnHintCompletionProvider(), returnHintTrigger)
1516
);
1617
}
1718

src/syntax.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11

22
export const anyTypeName: string = "[a-zA-Z_][a-zA-Z0-9_.]*";
33

4-
export const typeHintCharacter: string = ":";
4+
export const paramHintTrigger: string = ":";
5+
export const returnHintTrigger: string = ">";
56

67
/**
78
* Contains built-in Python types which can be hinted.

0 commit comments

Comments
 (0)