forked from microsoft/vscode-pull-request-github
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathissueHoverProvider.ts
More file actions
79 lines (72 loc) · 2.71 KB
/
Copy pathissueHoverProvider.ts
File metadata and controls
79 lines (72 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as vscode from 'vscode';
import { StateManager } from './stateManager';
import {
getIssue,
shouldShowHover,
} from './util';
import { ITelemetry } from '../common/telemetry';
import { FolderRepositoryManager } from '../github/folderRepositoryManager';
import { issueMarkdown } from '../github/markdownUtils';
import { RepositoriesManager } from '../github/repositoriesManager';
import { ISSUE_OR_URL_EXPRESSION, ParsedIssue, parseIssueExpressionOutput } from '../github/utils';
export class IssueHoverProvider implements vscode.HoverProvider {
constructor(
private manager: RepositoriesManager,
private stateManager: StateManager,
private context: vscode.ExtensionContext,
private telemetry: ITelemetry,
) { }
async provideHover(
document: vscode.TextDocument,
position: vscode.Position,
_token: vscode.CancellationToken,
): Promise<vscode.Hover | undefined> {
if (!(await shouldShowHover(document, position))) {
return;
}
let wordPosition = document.getWordRangeAtPosition(position, ISSUE_OR_URL_EXPRESSION);
if (wordPosition && wordPosition.start.character > 0) {
wordPosition = new vscode.Range(
new vscode.Position(wordPosition.start.line, wordPosition.start.character),
wordPosition.end,
);
const word = document.getText(wordPosition);
const match = word.match(ISSUE_OR_URL_EXPRESSION);
const tryParsed = parseIssueExpressionOutput(match);
const folderManager = this.manager.getManagerForFile(document.uri) ?? this.manager.folderManagers[0];
if (!folderManager) {
return;
}
if (
tryParsed &&
match &&
// Only check the max issue number if the owner/repo format isn't used here.
(tryParsed.owner || tryParsed.issueNumber <= this.stateManager.maxIssueNumber(folderManager.repository.rootUri))
) {
return this.createHover(folderManager, match[0], tryParsed, wordPosition);
}
} else {
return;
}
}
private async createHover(
folderManager: FolderRepositoryManager,
value: string,
parsed: ParsedIssue,
range: vscode.Range,
): Promise<vscode.Hover | undefined> {
const issue = await getIssue(this.stateManager, folderManager, value, parsed);
if (!issue) {
return;
}
/* __GDPR__
"issue.issueHover" : {}
*/
this.telemetry.sendTelemetryEvent('issues.issueHover');
return new vscode.Hover(await issueMarkdown(issue, this.context, this.manager, parsed.commentNumber), range);
}
}