/
signatureHelp.ts
40 lines (35 loc) · 1.06 KB
/
signatureHelp.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
import {
Position,
Range,
SignatureHelp,
TextDocumentPositionParams,
} from "vscode-languageserver";
import { commentPattern } from "../common/patterns";
import { builtinDocs } from "../server/builtin";
import { documents } from "../server/documents";
export const signatureHelpProvider =
(params: TextDocumentPositionParams): SignatureHelp | undefined => {
const { textDocument, position } = params;
const doc = documents.get(textDocument.uri);
if (!doc) {
return;
}
const currentLine = doc.getText(
Range.create(
Position.create(position.line, 0),
Position.create(position.line + 1, 0),
),
);
// comment line
if (commentPattern.test(currentLine)) {
return;
}
const preSegment = currentLine.slice(0, position.character);
const m = preSegment.match(/([\w#&:]+)[ \t]*\(([^()]*|\([^)]*\))*$/);
if (!m) {
return;
}
const functionName = m["1"];
const placeIdx = m[0].split(",").length - 1;
return builtinDocs.getSignatureHelpByName(functionName, placeIdx);
};