forked from microsoft/vscode-docker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdockerHoverProvider.ts
82 lines (66 loc) · 2.97 KB
/
dockerHoverProvider.ts
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
80
81
82
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
'use strict';
import { Range, TextDocument, Position, CancellationToken, HoverProvider, Hover, MarkedString } from 'vscode';
import { KeyInfo } from "./dockerExtension";
import parser = require('./parser');
import hub = require('./dockerHubApi');
import suggestHelper = require('./helpers/suggestSupportHelper');
export class DockerHoverProvider implements HoverProvider {
_parser: parser.Parser;
_keyInfo: KeyInfo;
// Provide the parser you want to use as well as keyinfo dictionary.
constructor(wordParser: parser.Parser, keyInfo: KeyInfo) {
this._parser = wordParser;
this._keyInfo = keyInfo;
}
public provideHover(document: TextDocument, position: Position, token: CancellationToken): Thenable<Hover> {
var line = document.lineAt(position.line);
if (line.text.length === 0) {
return Promise.resolve(null);
}
var tokens = this._parser.parseLine(line);
return this._computeInfoForLineWithTokens(line.text, tokens, position);
}
private _computeInfoForLineWithTokens(line: string, tokens: parser.IToken[], position: Position): Promise<Hover> {
var possibleTokens = this._parser.tokensAtColumn(tokens, position.character);
return Promise.all(possibleTokens.map(tokenIndex => this._computeInfoForToken(line, tokens, tokenIndex))).then((results) => {
return possibleTokens.map((tokenIndex, arrayIndex) => {
return {
startIndex: tokens[tokenIndex].startIndex,
endIndex: tokens[tokenIndex].endIndex,
result: results[arrayIndex]
};
});
}).then((results) => {
var r = results.filter(r => !!r.result);
if (r.length === 0) {
return;
}
let range = new Range(position.line, r[0].startIndex, position.line, r[0].endIndex);
let hover = new Hover(r[0].result, range);
return hover;
});
}
private _computeInfoForToken(line: string, tokens: parser.IToken[], tokenIndex: number): Promise<MarkedString[]> {
// -------------
// Detect hovering on a key
if (tokens[tokenIndex].type === parser.TokenType.Key) {
var keyName = this._parser.keyNameFromKeyToken(this._parser.tokenValue(line, tokens[tokenIndex])).trim();
var r = this._keyInfo[keyName];
if (r) {
return Promise.resolve([r]);
}
}
// -------------
// Detect <<image: [["something"]]>>
// Detect <<image: [[something]]>>
var helper = new suggestHelper.SuggestSupportHelper();
var r2 = helper.getImageNameHover(line, this._parser, tokens, tokenIndex);
if (r2) {
return r2;
}
return;
}
}