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
| import * as monaco from 'monaco-editor'
| const hints = [
| "SELECT",
| "INSERT",
| "DELETE",
| "UPDATE",
| "CREATE TABLE",
| "DROP TABLE",
| "ALTER TABLE",
| "CREATE VIEW",
| "DROP VIEW",
| "CREATE INDEX",
| "DROP INDEX",
| "CREATE PROCEDURE",
| "DROP PROCEDURE",
| "CREATE TRIGGER",
| "DROP TRIGGER",
| "CREATE SCHEMA",
| "DROP SCHEMA",
| "CREATE DOMAIN",
| "ALTER DOMAIN",
| "DROP DOMAIN",
| "GRANT",
| "DENY",
| "REVOKE",
| "COMMIT",
| "ROLLBACK",
| "SET TRANSACTION",
| "DECLARE",
| "EXPLAN",
| "OPEN",
| "FETCH",
| "CLOSE",
| "PREPARE",
| "EXECUTE",
| "DESCRIBE",
| "FORM",
| "ORDER BY"]
| function createCompleter(getExtraHints) {
| const createSuggestions = function (model, textUntilPosition) {
| let text = model.getValue();
| textUntilPosition = textUntilPosition.replace(/[\*\[\]@\$\(\)]/g, "").replace(/(\s+|\.)/g, " ");
| let arr = textUntilPosition.split(/[\s;]/);
| let activeStr = arr[arr.length - 1];
| let len = activeStr.length;
| let rexp = new RegExp("([^\\w]|^)" + activeStr + "\\w*", "gim");
| let match = text.match(rexp);
| let textHints = !match ? [] :
| match.map(ele => {
| let rexp = new RegExp(activeStr, "gim");
| let search = ele.search(rexp);
| return ele.substr(search);
| });
| let mergeHints = Array.from(new Set([...hints, ...textHints, ...getExtraHints(model)]))
| .sort()
| .filter(ele => {
| let rexp = new RegExp(ele.substr(0, len), "gim");
| return (match && match.length === 1 && ele === activeStr) ||
| ele.length === 1 ? false : activeStr.match(rexp);
| });
| return mergeHints.map(ele => ({
| label: ele,
| kind: hints.indexOf(ele) > -1 ?
| monaco.languages.CompletionItemKind.Keyword :
| monaco.languages.CompletionItemKind.Text,
| documentation: ele,
| insertText: ele
| }));
| };
| return {
| provideCompletionItems(model, position) {
| let textUntilPosition = model.getValueInRange({
| startLineNumber: position.lineNumber,
| startColumn: 1,
| endLineNumber: position.lineNumber,
| endColumn: position.column
| });
| return { suggestions: createSuggestions(model, textUntilPosition) };
| }
| }
| }
| export default createCompleter;
|
|