@spyglassmc/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +10 -0
  2. package/lib/common/Heap.d.ts +1 -0
  3. package/lib/common/Heap.js +2 -0
  4. package/lib/common/index.d.ts +2 -0
  5. package/lib/common/index.js +14 -0
  6. package/lib/common/util.d.ts +120 -0
  7. package/lib/common/util.js +292 -0
  8. package/lib/index.d.ts +8 -0
  9. package/lib/index.js +20 -0
  10. package/lib/node/AstNode.d.ts +64 -0
  11. package/lib/node/AstNode.js +108 -0
  12. package/lib/node/BooleanNode.d.ts +13 -0
  13. package/lib/node/BooleanNode.js +20 -0
  14. package/lib/node/CommentNode.d.ts +12 -0
  15. package/lib/node/CommentNode.js +11 -0
  16. package/lib/node/ErrorNode.d.ts +8 -0
  17. package/lib/node/ErrorNode.js +12 -0
  18. package/lib/node/FileNode.d.ts +21 -0
  19. package/lib/node/FileNode.js +11 -0
  20. package/lib/node/FloatNode.d.ts +13 -0
  21. package/lib/node/FloatNode.js +21 -0
  22. package/lib/node/IntegerNode.d.ts +13 -0
  23. package/lib/node/IntegerNode.js +20 -0
  24. package/lib/node/ListNode.d.ts +15 -0
  25. package/lib/node/ListNode.js +11 -0
  26. package/lib/node/LiteralNode.d.ts +19 -0
  27. package/lib/node/LiteralNode.js +22 -0
  28. package/lib/node/LongNode.d.ts +13 -0
  29. package/lib/node/LongNode.js +20 -0
  30. package/lib/node/RecordNode.d.ts +20 -0
  31. package/lib/node/RecordNode.js +11 -0
  32. package/lib/node/ResourceLocationNode.d.ts +41 -0
  33. package/lib/node/ResourceLocationNode.js +65 -0
  34. package/lib/node/Sequence.d.ts +22 -0
  35. package/lib/node/Sequence.js +11 -0
  36. package/lib/node/StringNode.d.ts +63 -0
  37. package/lib/node/StringNode.js +43 -0
  38. package/lib/node/SymbolNode.d.ts +21 -0
  39. package/lib/node/SymbolNode.js +22 -0
  40. package/lib/node/TableNode.d.ts +17 -0
  41. package/lib/node/TableNode.js +11 -0
  42. package/lib/node/index.d.ts +16 -0
  43. package/lib/node/index.js +28 -0
  44. package/lib/parser/Parser.d.ts +16 -0
  45. package/lib/parser/Parser.js +5 -0
  46. package/lib/parser/boolean.d.ts +4 -0
  47. package/lib/parser/boolean.js +11 -0
  48. package/lib/parser/comment.d.ts +12 -0
  49. package/lib/parser/comment.js +34 -0
  50. package/lib/parser/empty.d.ts +3 -0
  51. package/lib/parser/empty.js +7 -0
  52. package/lib/parser/error.d.ts +8 -0
  53. package/lib/parser/error.js +22 -0
  54. package/lib/parser/file.d.ts +9 -0
  55. package/lib/parser/file.js +37 -0
  56. package/lib/parser/float.d.ts +33 -0
  57. package/lib/parser/float.js +57 -0
  58. package/lib/parser/index.d.ts +17 -0
  59. package/lib/parser/index.js +36 -0
  60. package/lib/parser/integer.d.ts +33 -0
  61. package/lib/parser/integer.js +46 -0
  62. package/lib/parser/list.d.ts +12 -0
  63. package/lib/parser/list.js +70 -0
  64. package/lib/parser/literal.d.ts +5 -0
  65. package/lib/parser/literal.js +41 -0
  66. package/lib/parser/long.d.ts +33 -0
  67. package/lib/parser/long.js +50 -0
  68. package/lib/parser/record.d.ts +22 -0
  69. package/lib/parser/record.js +97 -0
  70. package/lib/parser/resourceLocation.d.ts +4 -0
  71. package/lib/parser/resourceLocation.js +67 -0
  72. package/lib/parser/string.d.ts +18 -0
  73. package/lib/parser/string.js +129 -0
  74. package/lib/parser/symbol.d.ts +12 -0
  75. package/lib/parser/symbol.js +33 -0
  76. package/lib/parser/table.d.ts +22 -0
  77. package/lib/parser/table.js +97 -0
  78. package/lib/parser/util.d.ts +134 -0
  79. package/lib/parser/util.js +224 -0
  80. package/lib/processor/ColorInfoProvider.d.ts +87 -0
  81. package/lib/processor/ColorInfoProvider.js +141 -0
  82. package/lib/processor/InlayHintProvider.d.ts +8 -0
  83. package/lib/processor/InlayHintProvider.js +3 -0
  84. package/lib/processor/SignatureHelpProvider.d.ts +18 -0
  85. package/lib/processor/SignatureHelpProvider.js +3 -0
  86. package/lib/processor/checker/Checker.d.ts +7 -0
  87. package/lib/processor/checker/Checker.js +7 -0
  88. package/lib/processor/checker/builtin.d.ts +23 -0
  89. package/lib/processor/checker/builtin.js +83 -0
  90. package/lib/processor/checker/index.d.ts +3 -0
  91. package/lib/processor/checker/index.js +28 -0
  92. package/lib/processor/colorizer/Colorizer.d.ts +23 -0
  93. package/lib/processor/colorizer/Colorizer.js +70 -0
  94. package/lib/processor/colorizer/builtin.d.ts +17 -0
  95. package/lib/processor/colorizer/builtin.js +84 -0
  96. package/lib/processor/colorizer/index.d.ts +3 -0
  97. package/lib/processor/colorizer/index.js +28 -0
  98. package/lib/processor/completer/Completer.d.ts +75 -0
  99. package/lib/processor/completer/Completer.js +92 -0
  100. package/lib/processor/completer/builtin.d.ts +30 -0
  101. package/lib/processor/completer/builtin.js +172 -0
  102. package/lib/processor/completer/index.d.ts +3 -0
  103. package/lib/processor/completer/index.js +28 -0
  104. package/lib/processor/formatter/Formatter.d.ts +6 -0
  105. package/lib/processor/formatter/Formatter.js +19 -0
  106. package/lib/processor/formatter/builtin.d.ts +15 -0
  107. package/lib/processor/formatter/builtin.js +60 -0
  108. package/lib/processor/formatter/index.d.ts +3 -0
  109. package/lib/processor/formatter/index.js +28 -0
  110. package/lib/processor/index.d.ts +10 -0
  111. package/lib/processor/index.js +22 -0
  112. package/lib/processor/linter/Linter.d.ts +4 -0
  113. package/lib/processor/linter/Linter.js +3 -0
  114. package/lib/processor/linter/builtin/undeclaredSymbol.d.ts +4 -0
  115. package/lib/processor/linter/builtin/undeclaredSymbol.js +73 -0
  116. package/lib/processor/linter/builtin.d.ts +15 -0
  117. package/lib/processor/linter/builtin.js +120 -0
  118. package/lib/processor/linter/index.d.ts +3 -0
  119. package/lib/processor/linter/index.js +28 -0
  120. package/lib/processor/util.d.ts +17 -0
  121. package/lib/processor/util.js +32 -0
  122. package/lib/service/CacheService.d.ts +54 -0
  123. package/lib/service/CacheService.js +195 -0
  124. package/lib/service/CommandExecutor.d.ts +3 -0
  125. package/lib/service/CommandExecutor.js +7 -0
  126. package/lib/service/Config.d.ts +218 -0
  127. package/lib/service/Config.js +264 -0
  128. package/lib/service/Context.d.ts +143 -0
  129. package/lib/service/Context.js +143 -0
  130. package/lib/service/Dependency.d.ts +10 -0
  131. package/lib/service/Dependency.js +11 -0
  132. package/lib/service/Downloader.d.ts +67 -0
  133. package/lib/service/Downloader.js +185 -0
  134. package/lib/service/ErrorReporter.d.ts +27 -0
  135. package/lib/service/ErrorReporter.js +49 -0
  136. package/lib/service/FileService.d.ts +96 -0
  137. package/lib/service/FileService.js +224 -0
  138. package/lib/service/Hover.d.ts +10 -0
  139. package/lib/service/Hover.js +16 -0
  140. package/lib/service/Logger.d.ts +31 -0
  141. package/lib/service/Logger.js +30 -0
  142. package/lib/service/MetaRegistry.d.ts +106 -0
  143. package/lib/service/MetaRegistry.js +192 -0
  144. package/lib/service/Operations.d.ts +8 -0
  145. package/lib/service/Operations.js +26 -0
  146. package/lib/service/Profiler.d.ts +33 -0
  147. package/lib/service/Profiler.js +76 -0
  148. package/lib/service/Project.d.ts +173 -0
  149. package/lib/service/Project.js +593 -0
  150. package/lib/service/Service.d.ts +55 -0
  151. package/lib/service/Service.js +207 -0
  152. package/lib/service/SymbolLocations.d.ts +17 -0
  153. package/lib/service/SymbolLocations.js +16 -0
  154. package/lib/service/SymbolRegistrar.d.ts +5 -0
  155. package/lib/service/SymbolRegistrar.js +3 -0
  156. package/lib/service/fileUtil.d.ts +121 -0
  157. package/lib/service/fileUtil.js +268 -0
  158. package/lib/service/index.d.ts +18 -0
  159. package/lib/service/index.js +33 -0
  160. package/lib/source/IndexMap.d.ts +16 -0
  161. package/lib/source/IndexMap.js +46 -0
  162. package/lib/source/LanguageError.d.ts +27 -0
  163. package/lib/source/LanguageError.js +15 -0
  164. package/lib/source/Location.d.ts +19 -0
  165. package/lib/source/Location.js +25 -0
  166. package/lib/source/Offset.d.ts +13 -0
  167. package/lib/source/Offset.js +25 -0
  168. package/lib/source/Position.d.ts +23 -0
  169. package/lib/source/Position.js +43 -0
  170. package/lib/source/PositionRange.d.ts +38 -0
  171. package/lib/source/PositionRange.js +83 -0
  172. package/lib/source/Range.d.ts +68 -0
  173. package/lib/source/Range.js +155 -0
  174. package/lib/source/Source.d.ts +110 -0
  175. package/lib/source/Source.js +222 -0
  176. package/lib/source/index.d.ts +9 -0
  177. package/lib/source/index.js +21 -0
  178. package/lib/symbol/Symbol.d.ts +219 -0
  179. package/lib/symbol/Symbol.js +324 -0
  180. package/lib/symbol/SymbolUtil.d.ts +407 -0
  181. package/lib/symbol/SymbolUtil.js +880 -0
  182. package/lib/symbol/UriBinder.d.ts +3 -0
  183. package/lib/symbol/UriBinder.js +3 -0
  184. package/lib/symbol/index.d.ts +4 -0
  185. package/lib/symbol/index.js +16 -0
  186. package/package.json +41 -0
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ColorTokenModifiers = exports.ColorTokenTypes = exports.ColorToken = void 0;
4
+ const source_1 = require("../../source");
5
+ var ColorToken;
6
+ (function (ColorToken) {
7
+ /* istanbul ignore next */
8
+ function create(range, type, modifiers) {
9
+ return {
10
+ range: source_1.Range.get(range),
11
+ type,
12
+ modifiers,
13
+ };
14
+ }
15
+ ColorToken.create = create;
16
+ /**
17
+ * @returns An array of color tokens that cover the whole range of `targetRange`, with gaps in `tokens` filled
18
+ * with tokens created from the specified `type` and `modifiers`.
19
+ */
20
+ function fillGap(tokens, targetRange, type, modifiers) {
21
+ const ans = [];
22
+ let nextStart = Math.min(targetRange.start, tokens[0]?.range.start ?? Infinity);
23
+ for (const t of tokens) {
24
+ if (t.range.start > nextStart) {
25
+ ans.push(ColorToken.create(source_1.Range.create(nextStart, t.range.start), type, modifiers));
26
+ }
27
+ ans.push(t);
28
+ nextStart = t.range.end;
29
+ }
30
+ if (nextStart < targetRange.end) {
31
+ ans.push(ColorToken.create(source_1.Range.create(nextStart, targetRange.end), type, modifiers));
32
+ }
33
+ return ans;
34
+ }
35
+ ColorToken.fillGap = fillGap;
36
+ })(ColorToken = exports.ColorToken || (exports.ColorToken = {}));
37
+ // Built-in LSP semantic tokens: https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocument_semanticTokens
38
+ exports.ColorTokenTypes = Object.freeze([
39
+ 'comment',
40
+ 'enum',
41
+ 'enumMember',
42
+ 'function',
43
+ 'keyword',
44
+ 'modifier',
45
+ 'number',
46
+ 'operator',
47
+ 'property',
48
+ 'string',
49
+ 'struct',
50
+ 'type',
51
+ 'type',
52
+ 'variable',
53
+ // Below are custom types.
54
+ 'error',
55
+ 'literal',
56
+ 'operator',
57
+ 'resourceLocation',
58
+ 'vector',
59
+ ]);
60
+ exports.ColorTokenModifiers = Object.freeze([
61
+ 'declaration',
62
+ 'defaultLibrary',
63
+ 'definition',
64
+ 'deprecated',
65
+ 'documentation',
66
+ 'modification',
67
+ 'readonly',
68
+ // Below are custom modifiers.
69
+ ]);
70
+ //# sourceMappingURL=Colorizer.js.map
@@ -0,0 +1,17 @@
1
+ import type { LiteralBaseNode, ResourceLocationBaseNode, StringBaseNode, SymbolBaseNode } from '../../node';
2
+ import type { MetaRegistry } from '../../service';
3
+ import type { Colorizer } from './Colorizer';
4
+ /**
5
+ * Use the shallowest children that have their own colorizers to provide the color tokens.
6
+ */
7
+ export declare const fallback: Colorizer;
8
+ export declare const boolean: Colorizer;
9
+ export declare const comment: Colorizer;
10
+ export declare const error: Colorizer;
11
+ export declare const literal: Colorizer<LiteralBaseNode>;
12
+ export declare const number: Colorizer;
13
+ export declare const resourceLocation: Colorizer<ResourceLocationBaseNode>;
14
+ export declare const string: Colorizer<StringBaseNode>;
15
+ export declare const symbol: Colorizer<SymbolBaseNode>;
16
+ export declare function registerColorizers(meta: MetaRegistry): void;
17
+ //# sourceMappingURL=builtin.d.ts.map
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerColorizers = exports.symbol = exports.string = exports.resourceLocation = exports.number = exports.literal = exports.error = exports.comment = exports.boolean = exports.fallback = void 0;
4
+ const source_1 = require("../../source");
5
+ const util_1 = require("../util");
6
+ const Colorizer_1 = require("./Colorizer");
7
+ /**
8
+ * Use the shallowest children that have their own colorizers to provide the color tokens.
9
+ */
10
+ const fallback = (node, ctx) => {
11
+ const ans = [];
12
+ (0, util_1.traversePreOrder)(node, node => !ctx.meta.hasColorizer(node.type) && (!ctx.range || source_1.Range.intersects(node.range, ctx.range)), node => ctx.meta.hasColorizer(node.type), node => {
13
+ const colorizer = ctx.meta.getColorizer(node.type);
14
+ const result = colorizer(node, ctx);
15
+ ans.push(...result);
16
+ });
17
+ return Object.freeze(ans);
18
+ };
19
+ exports.fallback = fallback;
20
+ const boolean = node => {
21
+ return [Colorizer_1.ColorToken.create(node, 'literal')];
22
+ };
23
+ exports.boolean = boolean;
24
+ const comment = node => {
25
+ return [Colorizer_1.ColorToken.create(node, 'comment')];
26
+ };
27
+ exports.comment = comment;
28
+ const error = node => {
29
+ return [Colorizer_1.ColorToken.create(node, 'error')];
30
+ };
31
+ exports.error = error;
32
+ const literal = node => {
33
+ return [Colorizer_1.ColorToken.create(node, node.options.colorTokenType ?? 'literal')];
34
+ };
35
+ exports.literal = literal;
36
+ const number = node => {
37
+ return [Colorizer_1.ColorToken.create(node, 'number')];
38
+ };
39
+ exports.number = number;
40
+ const resourceLocation = (node, _ctx) => {
41
+ let type;
42
+ switch (node.options.category) {
43
+ case 'function':
44
+ case 'tag/function':
45
+ type = 'function';
46
+ break;
47
+ default:
48
+ type = 'resourceLocation';
49
+ break;
50
+ }
51
+ return [Colorizer_1.ColorToken.create(node, type)];
52
+ };
53
+ exports.resourceLocation = resourceLocation;
54
+ const string = (node, ctx) => {
55
+ if (node.children) {
56
+ const colorizer = ctx.meta.getColorizer(node.children[0].type);
57
+ const result = colorizer(node.children[0], ctx);
58
+ // TODO: Fill the gap between the last token and the ending quote with errors.
59
+ return Colorizer_1.ColorToken.fillGap(result, node.range, node.options.colorTokenType ?? 'string');
60
+ }
61
+ else {
62
+ return [Colorizer_1.ColorToken.create(node, node.options.colorTokenType ?? 'string')];
63
+ }
64
+ };
65
+ exports.string = string;
66
+ const symbol = node => {
67
+ // TODO: Set the modifiers according to `node.symbol`.
68
+ return [Colorizer_1.ColorToken.create(node, 'variable')];
69
+ };
70
+ exports.symbol = symbol;
71
+ function registerColorizers(meta) {
72
+ meta.registerColorizer('boolean', exports.boolean);
73
+ meta.registerColorizer('comment', exports.comment);
74
+ meta.registerColorizer('error', exports.error);
75
+ meta.registerColorizer('float', exports.number);
76
+ meta.registerColorizer('integer', exports.number);
77
+ meta.registerColorizer('long', exports.number);
78
+ meta.registerColorizer('literal', exports.literal);
79
+ meta.registerColorizer('resource_location', exports.resourceLocation);
80
+ meta.registerColorizer('string', exports.string);
81
+ meta.registerColorizer('symbol', exports.symbol);
82
+ }
83
+ exports.registerColorizers = registerColorizers;
84
+ //# sourceMappingURL=builtin.js.map
@@ -0,0 +1,3 @@
1
+ export * as colorizer from './builtin';
2
+ export * from './Colorizer';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
22
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.colorizer = void 0;
26
+ exports.colorizer = __importStar(require("./builtin"));
27
+ __exportStar(require("./Colorizer"), exports);
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,75 @@
1
+ import type { AstNode } from '../../node';
2
+ import type { CompleterContext } from '../../service';
3
+ import type { RangeLike } from '../../source';
4
+ import { Range } from '../../source';
5
+ export declare type Completer<N = AstNode> = (node: N, ctx: CompleterContext) => CompletionItem[];
6
+ export declare const enum CompletionKind {
7
+ Text = 1,
8
+ Method = 2,
9
+ Function = 3,
10
+ Constructor = 4,
11
+ Field = 5,
12
+ Variable = 6,
13
+ Class = 7,
14
+ Interface = 8,
15
+ Module = 9,
16
+ Property = 10,
17
+ Unit = 11,
18
+ Value = 12,
19
+ Enum = 13,
20
+ Keyword = 14,
21
+ Snippet = 15,
22
+ Color = 16,
23
+ File = 17,
24
+ Reference = 18,
25
+ Folder = 19,
26
+ EnumMember = 20,
27
+ Constant = 21,
28
+ Struct = 22,
29
+ Event = 23,
30
+ Operator = 24,
31
+ TypeParameter = 25
32
+ }
33
+ export interface CompletionItem {
34
+ label: string;
35
+ range: Range;
36
+ kind?: CompletionKind;
37
+ detail?: string;
38
+ documentation?: string;
39
+ deprecated?: boolean;
40
+ /**
41
+ * `$`, `\`, and `}` needs to be escaped if they are not used for TextMate snippet purposes.
42
+ */
43
+ insertText?: string;
44
+ sortText?: string;
45
+ filterText?: string;
46
+ }
47
+ export declare namespace CompletionItem {
48
+ /**
49
+ * If no `insertText` is provided in `other`, the value of `label` will be escaped for TextMate purposes
50
+ * (@see {@link escape}) and used as the insert text.
51
+ *
52
+ * @example
53
+ * create('foo', range) // insertText = 'foo'
54
+ * create('\\ $ }', range) // insertText = '\\\\ \\$ \\}'
55
+ * create('foo', range, { insertText: '\\ $ }' }) // insertText = '\\ $ }'
56
+ */
57
+ function create(label: string, range: RangeLike, other?: Partial<CompletionItem>): CompletionItem;
58
+ /**
59
+ * Returns if `textToInsert` contains any characters that need to be escaped for TextMate (`$`, `\`, or `}`)
60
+ */
61
+ function needsEscape(textToInsert: string): boolean;
62
+ /**
63
+ * Escape `$`, `\`, and `}` in `textToInsert`
64
+ */
65
+ function escape(textToInsert: string): string;
66
+ }
67
+ export declare class InsertTextBuilder {
68
+ #private;
69
+ literal(str: string): this;
70
+ placeholder(...defaultValues: string[]): this;
71
+ exitPlace(): this;
72
+ build(): string;
73
+ if(condition: boolean, callback: (b: this) => unknown): this;
74
+ }
75
+ //# sourceMappingURL=Completer.d.ts.map
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
+ if (kind === "m") throw new TypeError("Private method is not writable");
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
+ };
13
+ var _InsertTextBuilder_ans, _InsertTextBuilder_nextPlaceholder;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.InsertTextBuilder = exports.CompletionItem = void 0;
16
+ const source_1 = require("../../source");
17
+ var CompletionItem;
18
+ (function (CompletionItem) {
19
+ /* istanbul ignore next */
20
+ /**
21
+ * If no `insertText` is provided in `other`, the value of `label` will be escaped for TextMate purposes
22
+ * (@see {@link escape}) and used as the insert text.
23
+ *
24
+ * @example
25
+ * create('foo', range) // insertText = 'foo'
26
+ * create('\\ $ }', range) // insertText = '\\\\ \\$ \\}'
27
+ * create('foo', range, { insertText: '\\ $ }' }) // insertText = '\\ $ }'
28
+ */
29
+ function create(label, range, other) {
30
+ const shouldEscape = other?.insertText === undefined && needsEscape(label);
31
+ return {
32
+ ...other,
33
+ label,
34
+ range: source_1.Range.get(range),
35
+ ...shouldEscape ? { insertText: escape(label) } : {},
36
+ };
37
+ }
38
+ CompletionItem.create = create;
39
+ /**
40
+ * Returns if `textToInsert` contains any characters that need to be escaped for TextMate (`$`, `\`, or `}`)
41
+ */
42
+ function needsEscape(textToInsert) {
43
+ return /[\\$}]/.test(textToInsert);
44
+ }
45
+ CompletionItem.needsEscape = needsEscape;
46
+ /**
47
+ * Escape `$`, `\`, and `}` in `textToInsert`
48
+ */
49
+ function escape(textToInsert) {
50
+ return textToInsert.replace(/([\\$}])/g, '\\$1');
51
+ }
52
+ CompletionItem.escape = escape;
53
+ })(CompletionItem = exports.CompletionItem || (exports.CompletionItem = {}));
54
+ class InsertTextBuilder {
55
+ constructor() {
56
+ _InsertTextBuilder_ans.set(this, '');
57
+ _InsertTextBuilder_nextPlaceholder.set(this, 1);
58
+ }
59
+ literal(str) {
60
+ __classPrivateFieldSet(this, _InsertTextBuilder_ans, __classPrivateFieldGet(this, _InsertTextBuilder_ans, "f") + CompletionItem.escape(str), "f");
61
+ return this;
62
+ }
63
+ placeholder(...defaultValues) {
64
+ if (defaultValues.length === 0) {
65
+ __classPrivateFieldSet(this, _InsertTextBuilder_ans, __classPrivateFieldGet(this, _InsertTextBuilder_ans, "f") + `$\{${__classPrivateFieldGet(this, _InsertTextBuilder_nextPlaceholder, "f")}}`, "f");
66
+ }
67
+ else if (defaultValues.length === 1) {
68
+ __classPrivateFieldSet(this, _InsertTextBuilder_ans, __classPrivateFieldGet(this, _InsertTextBuilder_ans, "f") + `$\{${__classPrivateFieldGet(this, _InsertTextBuilder_nextPlaceholder, "f")}:${CompletionItem.escape(defaultValues[0])}}`, "f");
69
+ }
70
+ else {
71
+ __classPrivateFieldSet(this, _InsertTextBuilder_ans, __classPrivateFieldGet(this, _InsertTextBuilder_ans, "f") + `$\{${__classPrivateFieldGet(this, _InsertTextBuilder_nextPlaceholder, "f")}|${defaultValues.map(v => v.replace(/([\\$},|])/g, '\\$1')).join(',')}|}`, "f");
72
+ }
73
+ __classPrivateFieldSet(this, _InsertTextBuilder_nextPlaceholder, __classPrivateFieldGet(this, _InsertTextBuilder_nextPlaceholder, "f") + 1, "f");
74
+ return this;
75
+ }
76
+ exitPlace() {
77
+ __classPrivateFieldSet(this, _InsertTextBuilder_ans, __classPrivateFieldGet(this, _InsertTextBuilder_ans, "f") + '$0', "f");
78
+ return this;
79
+ }
80
+ build() {
81
+ return __classPrivateFieldGet(this, _InsertTextBuilder_ans, "f");
82
+ }
83
+ if(condition, callback) {
84
+ if (condition) {
85
+ callback(this);
86
+ }
87
+ return this;
88
+ }
89
+ }
90
+ exports.InsertTextBuilder = InsertTextBuilder;
91
+ _InsertTextBuilder_ans = new WeakMap(), _InsertTextBuilder_nextPlaceholder = new WeakMap();
92
+ //# sourceMappingURL=Completer.js.map
@@ -0,0 +1,30 @@
1
+ import type { FileNode, LiteralBaseNode, PairNode, RecordBaseNode, ResourceLocationNode, StringBaseNode, SymbolBaseNode } from '../../node';
2
+ import { AstNode } from '../../node';
3
+ import type { BooleanBaseNode } from '../../node/BooleanNode';
4
+ import type { CompleterContext, MetaRegistry } from '../../service';
5
+ import type { RangeLike } from '../../source';
6
+ import type { Completer } from './Completer';
7
+ import { CompletionItem } from './Completer';
8
+ /**
9
+ * Uses the shallowest selected node that has its own completer to provide the completion items.
10
+ */
11
+ export declare const dispatch: Completer<AstNode>;
12
+ export declare const fallback: Completer<AstNode>;
13
+ export declare const boolean: Completer<BooleanBaseNode>;
14
+ /**
15
+ * Dispatches to the corresponding file for the language.
16
+ */
17
+ export declare const file: Completer<FileNode<AstNode>>;
18
+ export declare const literal: Completer<LiteralBaseNode>;
19
+ export declare const noop: Completer<any>;
20
+ interface RecordOptions<K extends AstNode, V extends AstNode, N extends RecordBaseNode<K, V>> {
21
+ key: (record: N, pair: PairNode<K, V> | undefined, ctx: CompleterContext, range: RangeLike, insertValue: boolean, insertPairEnd: boolean, existingKeys: K[]) => CompletionItem[];
22
+ value: (record: N, pair: PairNode<K, V>, ctx: CompleterContext) => CompletionItem[];
23
+ }
24
+ export declare function record<K extends AstNode, V extends AstNode, N extends RecordBaseNode<K, V>>(o: RecordOptions<K, V, N>): Completer<N>;
25
+ export declare const resourceLocation: Completer<ResourceLocationNode>;
26
+ export declare const string: Completer<StringBaseNode>;
27
+ export declare const symbol: Completer<SymbolBaseNode>;
28
+ export declare function registerCompleters(meta: MetaRegistry): void;
29
+ export {};
30
+ //# sourceMappingURL=builtin.d.ts.map
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerCompleters = exports.symbol = exports.string = exports.resourceLocation = exports.record = exports.noop = exports.literal = exports.file = exports.boolean = exports.fallback = exports.dispatch = void 0;
7
+ const binary_search_1 = __importDefault(require("binary-search"));
8
+ const common_1 = require("../../common");
9
+ const node_1 = require("../../node");
10
+ const service_1 = require("../../service");
11
+ const source_1 = require("../../source");
12
+ const Completer_1 = require("./Completer");
13
+ /**
14
+ * Uses the shallowest selected node that has its own completer to provide the completion items.
15
+ */
16
+ const dispatch = (node, ctx) => {
17
+ const child = node_1.AstNode.findShallowestChild({
18
+ node,
19
+ needle: ctx.offset,
20
+ endInclusive: true,
21
+ predicate: n => ctx.meta.hasCompleter(n.type),
22
+ });
23
+ return child
24
+ ? ctx.meta.getCompleter(child.type)(child, ctx)
25
+ : [];
26
+ };
27
+ exports.dispatch = dispatch;
28
+ exports.fallback = exports.dispatch;
29
+ const boolean = (node, ctx) => {
30
+ return [
31
+ Completer_1.CompletionItem.create('false', node, { kind: 21 /* Constant */ }),
32
+ Completer_1.CompletionItem.create('true', node, { kind: 21 /* Constant */ }),
33
+ ];
34
+ };
35
+ exports.boolean = boolean;
36
+ /**
37
+ * Dispatches to the corresponding file for the language.
38
+ */
39
+ const file = (node, ctx) => {
40
+ const completer = ctx.meta.getCompleterForLanguageID(ctx.doc.languageId);
41
+ return completer(node.children[0], ctx);
42
+ };
43
+ exports.file = file;
44
+ const literal = node => {
45
+ const kind = new Map([
46
+ ['enum', 13 /* Enum */],
47
+ ['enumMember', 20 /* EnumMember */],
48
+ ['function', 3 /* Function */],
49
+ ['keyword', 14 /* Keyword */],
50
+ ['literal', 14 /* Keyword */],
51
+ ['number', 21 /* Constant */],
52
+ ['operator', 24 /* Operator */],
53
+ ['property', 10 /* Property */],
54
+ ['resourceLocation', 17 /* File */],
55
+ ['variable', 6 /* Variable */],
56
+ ]).get(node.options.colorTokenType ?? 'keyword') ?? 14 /* Keyword */;
57
+ return node.options.pool.map(v => Completer_1.CompletionItem.create(v, node, { kind })) ?? [];
58
+ };
59
+ exports.literal = literal;
60
+ const noop = () => [];
61
+ exports.noop = noop;
62
+ function record(o) {
63
+ return (node, ctx) => {
64
+ if (!source_1.Range.contains(source_1.Range.translate(node, 1, -1), ctx.offset, true)) {
65
+ return [];
66
+ }
67
+ const completeKeys = (pair) => o.key(node, pair, ctx, pair?.key ?? ctx.offset, false, false, existingKeys);
68
+ const completePairs = (pair) => o.key(node, pair, ctx, pair ?? ctx.offset, true, hasNextPair || !!pair?.end, existingKeys);
69
+ const existingKeys = node.children
70
+ .filter((n) => !!n.key)
71
+ .map(n => n.key);
72
+ const index = (0, binary_search_1.default)(node.children, ctx.offset, (n, o) => n.end
73
+ ? source_1.Range.compareOffset(source_1.Range.translate(n, 0, -1), o, true)
74
+ : source_1.Range.compareOffset(n.range, o, true));
75
+ const pair = index >= 0 ? node.children[index] : undefined;
76
+ const hasNextPair = !!node.children.find(n => n.range.start > ctx.offset);
77
+ if (!pair) {
78
+ return completePairs(undefined);
79
+ }
80
+ const { key, sep, value } = pair;
81
+ if (!key && !sep && !value) {
82
+ return completePairs(undefined);
83
+ }
84
+ if ((key && source_1.Range.contains(key, ctx.offset, true)) || (sep && ctx.offset <= sep.start) || (value && ctx.offset < value.range.start)) {
85
+ // Selected key.
86
+ if (!value || source_1.Range.isEmpty(value.range)) {
87
+ return completePairs(pair);
88
+ }
89
+ return completeKeys(pair);
90
+ }
91
+ if ((value && source_1.Range.contains(value, ctx.offset, true)) || (sep && ctx.offset >= sep.end) || (key && ctx.offset > key.range.end)) {
92
+ // Selected value.
93
+ return o.value(node, pair, ctx);
94
+ }
95
+ return [];
96
+ };
97
+ }
98
+ exports.record = record;
99
+ const resourceLocation = (node, ctx) => {
100
+ const config = service_1.LinterConfigValue.destruct(ctx.config.lint.idOmitDefaultNamespace);
101
+ const includeEmptyNamespace = !node.options.isPredicate && node.namespace === '';
102
+ const includeDefaultNamespace = node.options.isPredicate || config?.ruleValue !== true;
103
+ const excludeDefaultNamespace = !node.options.isPredicate && config?.ruleValue !== false;
104
+ const getPool = (category) => optimizePool(Object.keys(ctx.symbols.getVisibleSymbols(category, ctx.doc.uri)));
105
+ const optimizePool = (pool) => {
106
+ const defaultNsPrefix = `${common_1.ResourceLocation.DefaultNamespace}${common_1.ResourceLocation.NamespacePathSep}`;
107
+ const defaultNsIds = [];
108
+ const otherIds = [];
109
+ for (const id of pool) {
110
+ if (id.startsWith(defaultNsPrefix)) {
111
+ defaultNsIds.push(id);
112
+ }
113
+ else {
114
+ otherIds.push(id);
115
+ }
116
+ }
117
+ const ans = [
118
+ ...otherIds,
119
+ ...includeDefaultNamespace ? defaultNsIds : [],
120
+ ...excludeDefaultNamespace ? defaultNsIds.map(id => id.slice(defaultNsPrefix.length)) : [],
121
+ ...includeEmptyNamespace ? defaultNsIds.map(id => id.slice(common_1.ResourceLocation.DefaultNamespace.length)) : [],
122
+ ];
123
+ if (node.options.namespacePathSep === '.') {
124
+ return ans.map(v => v.replace(common_1.ResourceLocation.NamespacePathSep, '.'));
125
+ }
126
+ return ans;
127
+ };
128
+ const pool = node.options.pool
129
+ ? optimizePool(node.options.pool)
130
+ : [
131
+ ...getPool(node.options.category),
132
+ ...node.options.allowTag
133
+ ? getPool(`tag/${node.options.category}`)
134
+ .map(v => `${common_1.ResourceLocation.TagPrefix}${v}`)
135
+ : [],
136
+ ];
137
+ return pool.map(v => Completer_1.CompletionItem.create(v, node, { kind: 3 /* Function */ }));
138
+ };
139
+ exports.resourceLocation = resourceLocation;
140
+ const string = (node, ctx) => {
141
+ if (node.children?.length) {
142
+ // FIXME: Escape quotes/slashes in the result. Note that `\`, `$`, and `}` have to be escaped due to TextMate syntax.
143
+ return (0, exports.dispatch)(node.children[0], ctx);
144
+ }
145
+ if (node.options.quotes && node.value === '') {
146
+ return node.options.quotes.map(q => Completer_1.CompletionItem.create(`${q}${q}`, node, {
147
+ insertText: `${q}$1${q}`,
148
+ kind: 12 /* Value */,
149
+ }));
150
+ }
151
+ return [];
152
+ };
153
+ exports.string = string;
154
+ const symbol = (node, ctx) => {
155
+ return Object
156
+ .keys(ctx.symbols.query(ctx.doc, node.options.category, ...node.options.parentPath ?? []).visibleMembers)
157
+ .map(v => Completer_1.CompletionItem.create(v, node, { kind: 6 /* Variable */ }));
158
+ };
159
+ exports.symbol = symbol;
160
+ function registerCompleters(meta) {
161
+ meta.registerCompleter('boolean', exports.boolean);
162
+ meta.registerCompleter('comment', exports.noop);
163
+ meta.registerCompleter('float', exports.noop);
164
+ meta.registerCompleter('integer', exports.noop);
165
+ meta.registerCompleter('long', exports.noop);
166
+ meta.registerCompleter('literal', exports.literal);
167
+ meta.registerCompleter('resource_location', exports.resourceLocation);
168
+ meta.registerCompleter('string', exports.string);
169
+ meta.registerCompleter('symbol', exports.symbol);
170
+ }
171
+ exports.registerCompleters = registerCompleters;
172
+ //# sourceMappingURL=builtin.js.map
@@ -0,0 +1,3 @@
1
+ export * as completer from './builtin';
2
+ export * from './Completer';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
22
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.completer = void 0;
26
+ exports.completer = __importStar(require("./builtin"));
27
+ __exportStar(require("./Completer"), exports);
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,6 @@
1
+ import type { AstNode } from '../../node';
2
+ import type { FormatterContext } from '../../service';
3
+ export declare type Formatter<N = AstNode> = (node: N, ctx: FormatterContext) => string;
4
+ export declare function formatterContextIndentation(ctx: FormatterContext, additionalLevels?: number): string;
5
+ export declare function indentFormatter(ctx: FormatterContext, additionalLevels?: number): FormatterContext;
6
+ //# sourceMappingURL=Formatter.d.ts.map
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.indentFormatter = exports.formatterContextIndentation = void 0;
4
+ function formatterContextIndentation(ctx, additionalLevels = 0) {
5
+ const total = ctx.indentLevel + additionalLevels;
6
+ return ctx.insertSpaces ? ' '.repeat(total * ctx.tabSize) : '\t'.repeat(total);
7
+ }
8
+ exports.formatterContextIndentation = formatterContextIndentation;
9
+ function indentFormatter(ctx, additionalLevels = 1) {
10
+ return {
11
+ ...ctx,
12
+ indentLevel: ctx.indentLevel + additionalLevels,
13
+ indent(additionalLevels) {
14
+ return formatterContextIndentation(this, additionalLevels);
15
+ },
16
+ };
17
+ }
18
+ exports.indentFormatter = indentFormatter;
19
+ //# sourceMappingURL=Formatter.js.map
@@ -0,0 +1,15 @@
1
+ import type { AstNode, BooleanBaseNode, CommentNode, FileNode, FloatBaseNode, IntegerNode, LiteralBaseNode, LongNode, ResourceLocationBaseNode, StringBaseNode } from '../../node';
2
+ import type { MetaRegistry } from '../../service';
3
+ import type { Formatter } from './Formatter';
4
+ export declare const fallback: Formatter;
5
+ export declare const file: Formatter<FileNode<AstNode>>;
6
+ export declare const boolean: Formatter<BooleanBaseNode>;
7
+ export declare const comment: Formatter<CommentNode>;
8
+ export declare const float: Formatter<FloatBaseNode>;
9
+ export declare const integer: Formatter<IntegerNode>;
10
+ export declare const literal: Formatter<LiteralBaseNode>;
11
+ export declare const long: Formatter<LongNode>;
12
+ export declare const resourceLocation: Formatter<ResourceLocationBaseNode>;
13
+ export declare const string: Formatter<StringBaseNode>;
14
+ export declare function registerFormatters(meta: MetaRegistry): void;
15
+ //# sourceMappingURL=builtin.d.ts.map