Skip to content

Commit 07f4835

Browse files
committed
fix #438 #433 #457
1 parent 5eb1e58 commit 07f4835

9 files changed

Lines changed: 246 additions & 201 deletions

File tree

src/client/providers/completionProvider.ts

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export class PythonCompletionItemProvider implements vscode.CompletionItemProvid
88
private jediProxyHandler: proxy.JediProxyHandler<proxy.ICompletionResult, vscode.CompletionItem[]>;
99

1010
public constructor(context: vscode.ExtensionContext) {
11-
this.jediProxyHandler = new proxy.JediProxyHandler(context, [], PythonCompletionItemProvider.parseData);
11+
this.jediProxyHandler = new proxy.JediProxyHandler(context);
1212
}
1313
private static parseData(data: proxy.ICompletionResult): vscode.CompletionItem[] {
1414
if (data && data.items.length > 0) {
@@ -24,30 +24,30 @@ export class PythonCompletionItemProvider implements vscode.CompletionItemProvid
2424
return [];
2525
}
2626
public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable<vscode.CompletionItem[]> {
27-
return new Promise<vscode.CompletionItem[]>((resolve, reject) => {
28-
const filename = document.fileName;
29-
if (document.lineAt(position.line).text.match(/^\s*\/\//)) {
30-
return resolve([]);
31-
}
32-
if (position.character <= 0) {
33-
return resolve([]);
34-
}
27+
const filename = document.fileName;
28+
if (document.lineAt(position.line).text.match(/^\s*\/\//)) {
29+
return Promise.resolve([]);
30+
}
31+
if (position.character <= 0) {
32+
return Promise.resolve([]);
33+
}
3534

36-
const txt = document.getText(new vscode.Range(new vscode.Position(position.line, position.character - 1), position));
37-
const type = proxy.CommandType.Completions;
38-
const columnIndex = position.character;
35+
const txt = document.getText(new vscode.Range(new vscode.Position(position.line, position.character - 1), position));
36+
const type = proxy.CommandType.Completions;
37+
const columnIndex = position.character;
3938

40-
const source = document.getText();
41-
const cmd: proxy.ICommand<proxy.ICommandResult> = {
42-
telemetryEvent: telemetryContracts.IDE.Completion,
43-
command: type,
44-
fileName: filename,
45-
columnIndex: columnIndex,
46-
lineIndex: position.line,
47-
source: source
48-
};
39+
const source = document.getText();
40+
const cmd: proxy.ICommand<proxy.ICommandResult> = {
41+
telemetryEvent: telemetryContracts.IDE.Completion,
42+
command: type,
43+
fileName: filename,
44+
columnIndex: columnIndex,
45+
lineIndex: position.line,
46+
source: source
47+
};
4948

50-
this.jediProxyHandler.sendCommand(cmd, resolve, token);
49+
return this.jediProxyHandler.sendCommand(cmd, token).then(data => {
50+
return PythonCompletionItemProvider.parseData(data);
5151
});
5252
}
5353
}

src/client/providers/definitionProvider.ts

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import * as vscode from 'vscode';
44
import * as proxy from './jediProxy';
5-
import * as fs from 'fs';
65
import * as telemetryContracts from "../common/telemetryContracts";
76

87
export class PythonDefinitionProvider implements vscode.DefinitionProvider {
@@ -12,7 +11,7 @@ export class PythonDefinitionProvider implements vscode.DefinitionProvider {
1211
}
1312

1413
public constructor(context: vscode.ExtensionContext) {
15-
this.jediProxyHandler = new proxy.JediProxyHandler(context, null, PythonDefinitionProvider.parseData);
14+
this.jediProxyHandler = new proxy.JediProxyHandler(context);
1615
}
1716
private static parseData(data: proxy.IDefinitionResult): vscode.Definition {
1817
if (data && data.definition) {
@@ -24,28 +23,28 @@ export class PythonDefinitionProvider implements vscode.DefinitionProvider {
2423
return null;
2524
}
2625
public provideDefinition(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable<vscode.Definition> {
27-
return new Promise<vscode.Definition>((resolve, reject) => {
28-
var filename = document.fileName;
29-
if (document.lineAt(position.line).text.match(/^\s*\/\//)) {
30-
return resolve();
31-
}
32-
if (position.character <= 0) {
33-
return resolve();
34-
}
26+
var filename = document.fileName;
27+
if (document.lineAt(position.line).text.match(/^\s*\/\//)) {
28+
return Promise.resolve();
29+
}
30+
if (position.character <= 0) {
31+
return Promise.resolve();
32+
}
3533

36-
var range = document.getWordRangeAtPosition(position);
37-
var columnIndex = range.isEmpty ? position.character : range.end.character;
38-
var cmd: proxy.ICommand<proxy.IDefinitionResult> = {
39-
telemetryEvent: telemetryContracts.IDE.Definition,
40-
command: proxy.CommandType.Definitions,
41-
fileName: filename,
42-
columnIndex: columnIndex,
43-
lineIndex: position.line
44-
};
45-
if (document.isDirty){
46-
cmd.source = document.getText();
47-
}
48-
this.jediProxyHandler.sendCommand(cmd, resolve, token);
34+
var range = document.getWordRangeAtPosition(position);
35+
var columnIndex = range.isEmpty ? position.character : range.end.character;
36+
var cmd: proxy.ICommand<proxy.IDefinitionResult> = {
37+
telemetryEvent: telemetryContracts.IDE.Definition,
38+
command: proxy.CommandType.Definitions,
39+
fileName: filename,
40+
columnIndex: columnIndex,
41+
lineIndex: position.line
42+
};
43+
if (document.isDirty) {
44+
cmd.source = document.getText();
45+
}
46+
return this.jediProxyHandler.sendCommand(cmd, token).then(data => {
47+
return PythonDefinitionProvider.parseData(data);
4948
});
5049
}
5150
}

src/client/providers/hoverProvider.ts

Lines changed: 46 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,64 @@
33
import * as vscode from 'vscode';
44
import * as proxy from './jediProxy';
55
import * as telemetryContracts from "../common/telemetryContracts";
6-
6+
import { EOL } from 'os';
77

88
export class PythonHoverProvider implements vscode.HoverProvider {
99
private jediProxyHandler: proxy.JediProxyHandler<proxy.ICompletionResult, vscode.Hover>;
1010

1111
public constructor(context: vscode.ExtensionContext) {
12-
this.jediProxyHandler = new proxy.JediProxyHandler(context, null, PythonHoverProvider.parseData);
12+
this.jediProxyHandler = new proxy.JediProxyHandler(context);
1313
}
14-
private static parseData(data: proxy.ICompletionResult): vscode.Hover {
15-
if (data && data.items.length > 0) {
16-
var definition = data.items[0];
14+
public provideHover(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable<vscode.Hover> {
15+
var filename = document.fileName;
16+
if (document.lineAt(position.line).text.match(/^\s*\/\//)) {
17+
return Promise.resolve();
18+
}
19+
if (position.character <= 0) {
20+
return Promise.resolve();
21+
}
1722

18-
var txt = definition.description || definition.text;
19-
return new vscode.Hover({ language: "python", value: txt });
23+
var range = document.getWordRangeAtPosition(position);
24+
if (!range || range.isEmpty) {
25+
return Promise.resolve();
2026
}
21-
return null;
22-
}
23-
public provideHover(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable<vscode.Hover> {
24-
return new Promise<vscode.Hover>((resolve, reject) => {
25-
var filename = document.fileName;
26-
if (document.lineAt(position.line).text.match(/^\s*\/\//)) {
27-
return resolve();
27+
var columnIndex = range.start.character < range.end.character ? range.start.character + 2 : range.end.character;
28+
var cmd: proxy.ICommand<proxy.ICompletionResult> = {
29+
telemetryEvent: telemetryContracts.IDE.HoverDefinition,
30+
command: proxy.CommandType.Completions,
31+
fileName: filename,
32+
columnIndex: columnIndex,
33+
lineIndex: position.line
34+
};
35+
if (document.isDirty) {
36+
cmd.source = document.getText();
37+
}
38+
39+
return this.jediProxyHandler.sendCommand(cmd, token).then(data => {
40+
if (!data || !Array.isArray(data.items) || data.items.length === 0) {
41+
return;
2842
}
29-
if (position.character <= 0) {
30-
return resolve();
43+
// Find the right items
44+
const wordUnderCursor = document.getText(range);
45+
const completionItem = data.items.filter(item => item.text === wordUnderCursor);
46+
if (completionItem.length === 0) {
47+
return;
3148
}
32-
33-
var range = document.getWordRangeAtPosition(position);
34-
if (range == undefined || range.isEmpty) {
35-
return resolve();
49+
var definition = completionItem[0];
50+
var txt = definition.description || definition.text;
51+
if (typeof txt !== 'string' || txt.length === 0) {
52+
return;
53+
}
54+
if (wordUnderCursor === txt) {
55+
return;
3656
}
37-
var columnIndex = range.end.character;
38-
var cmd: proxy.ICommand<proxy.ICompletionResult> = {
39-
telemetryEvent: telemetryContracts.IDE.HoverDefinition,
40-
command: proxy.CommandType.Completions,
41-
fileName: filename,
42-
columnIndex: columnIndex,
43-
lineIndex: position.line
44-
};
45-
if (document.isDirty){
46-
cmd.source = document.getText();
57+
const lines = txt.split(EOL);
58+
if (lines.length > 2 && lines[1].trim().length === 0) {
59+
const line1 = lines[0];
60+
lines.shift();
61+
return new vscode.Hover([{ language: 'python', value: line1 }, lines.join(EOL)]);
4762
}
48-
this.jediProxyHandler.sendCommand(cmd, resolve, token);
63+
return new vscode.Hover(txt);
4964
});
5065
}
5166
}

0 commit comments

Comments
 (0)