modes.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. import { URI } from '../../base/common/uri.js';
  6. import { Range } from './core/range.js';
  7. import { LanguageFeatureRegistry } from './modes/languageFeatureRegistry.js';
  8. import { TokenizationRegistryImpl } from './modes/tokenizationRegistry.js';
  9. import { iconRegistry, Codicon } from '../../base/common/codicons.js';
  10. /**
  11. * @internal
  12. */
  13. export class TokenMetadata {
  14. static getLanguageId(metadata) {
  15. return (metadata & 255 /* LANGUAGEID_MASK */) >>> 0 /* LANGUAGEID_OFFSET */;
  16. }
  17. static getTokenType(metadata) {
  18. return (metadata & 1792 /* TOKEN_TYPE_MASK */) >>> 8 /* TOKEN_TYPE_OFFSET */;
  19. }
  20. static getFontStyle(metadata) {
  21. return (metadata & 14336 /* FONT_STYLE_MASK */) >>> 11 /* FONT_STYLE_OFFSET */;
  22. }
  23. static getForeground(metadata) {
  24. return (metadata & 8372224 /* FOREGROUND_MASK */) >>> 14 /* FOREGROUND_OFFSET */;
  25. }
  26. static getBackground(metadata) {
  27. return (metadata & 4286578688 /* BACKGROUND_MASK */) >>> 23 /* BACKGROUND_OFFSET */;
  28. }
  29. static getClassNameFromMetadata(metadata) {
  30. let foreground = this.getForeground(metadata);
  31. let className = 'mtk' + foreground;
  32. let fontStyle = this.getFontStyle(metadata);
  33. if (fontStyle & 1 /* Italic */) {
  34. className += ' mtki';
  35. }
  36. if (fontStyle & 2 /* Bold */) {
  37. className += ' mtkb';
  38. }
  39. if (fontStyle & 4 /* Underline */) {
  40. className += ' mtku';
  41. }
  42. return className;
  43. }
  44. static getInlineStyleFromMetadata(metadata, colorMap) {
  45. const foreground = this.getForeground(metadata);
  46. const fontStyle = this.getFontStyle(metadata);
  47. let result = `color: ${colorMap[foreground]};`;
  48. if (fontStyle & 1 /* Italic */) {
  49. result += 'font-style: italic;';
  50. }
  51. if (fontStyle & 2 /* Bold */) {
  52. result += 'font-weight: bold;';
  53. }
  54. if (fontStyle & 4 /* Underline */) {
  55. result += 'text-decoration: underline;';
  56. }
  57. return result;
  58. }
  59. }
  60. /**
  61. * @internal
  62. */
  63. export const completionKindToCssClass = (function () {
  64. let data = Object.create(null);
  65. data[0 /* Method */] = 'symbol-method';
  66. data[1 /* Function */] = 'symbol-function';
  67. data[2 /* Constructor */] = 'symbol-constructor';
  68. data[3 /* Field */] = 'symbol-field';
  69. data[4 /* Variable */] = 'symbol-variable';
  70. data[5 /* Class */] = 'symbol-class';
  71. data[6 /* Struct */] = 'symbol-struct';
  72. data[7 /* Interface */] = 'symbol-interface';
  73. data[8 /* Module */] = 'symbol-module';
  74. data[9 /* Property */] = 'symbol-property';
  75. data[10 /* Event */] = 'symbol-event';
  76. data[11 /* Operator */] = 'symbol-operator';
  77. data[12 /* Unit */] = 'symbol-unit';
  78. data[13 /* Value */] = 'symbol-value';
  79. data[14 /* Constant */] = 'symbol-constant';
  80. data[15 /* Enum */] = 'symbol-enum';
  81. data[16 /* EnumMember */] = 'symbol-enum-member';
  82. data[17 /* Keyword */] = 'symbol-keyword';
  83. data[27 /* Snippet */] = 'symbol-snippet';
  84. data[18 /* Text */] = 'symbol-text';
  85. data[19 /* Color */] = 'symbol-color';
  86. data[20 /* File */] = 'symbol-file';
  87. data[21 /* Reference */] = 'symbol-reference';
  88. data[22 /* Customcolor */] = 'symbol-customcolor';
  89. data[23 /* Folder */] = 'symbol-folder';
  90. data[24 /* TypeParameter */] = 'symbol-type-parameter';
  91. data[25 /* User */] = 'account';
  92. data[26 /* Issue */] = 'issues';
  93. return function (kind) {
  94. const name = data[kind];
  95. let codicon = name && iconRegistry.get(name);
  96. if (!codicon) {
  97. console.info('No codicon found for CompletionItemKind ' + kind);
  98. codicon = Codicon.symbolProperty;
  99. }
  100. return codicon.classNames;
  101. };
  102. })();
  103. /**
  104. * @internal
  105. */
  106. export let completionKindFromString = (function () {
  107. let data = Object.create(null);
  108. data['method'] = 0 /* Method */;
  109. data['function'] = 1 /* Function */;
  110. data['constructor'] = 2 /* Constructor */;
  111. data['field'] = 3 /* Field */;
  112. data['variable'] = 4 /* Variable */;
  113. data['class'] = 5 /* Class */;
  114. data['struct'] = 6 /* Struct */;
  115. data['interface'] = 7 /* Interface */;
  116. data['module'] = 8 /* Module */;
  117. data['property'] = 9 /* Property */;
  118. data['event'] = 10 /* Event */;
  119. data['operator'] = 11 /* Operator */;
  120. data['unit'] = 12 /* Unit */;
  121. data['value'] = 13 /* Value */;
  122. data['constant'] = 14 /* Constant */;
  123. data['enum'] = 15 /* Enum */;
  124. data['enum-member'] = 16 /* EnumMember */;
  125. data['enumMember'] = 16 /* EnumMember */;
  126. data['keyword'] = 17 /* Keyword */;
  127. data['snippet'] = 27 /* Snippet */;
  128. data['text'] = 18 /* Text */;
  129. data['color'] = 19 /* Color */;
  130. data['file'] = 20 /* File */;
  131. data['reference'] = 21 /* Reference */;
  132. data['customcolor'] = 22 /* Customcolor */;
  133. data['folder'] = 23 /* Folder */;
  134. data['type-parameter'] = 24 /* TypeParameter */;
  135. data['typeParameter'] = 24 /* TypeParameter */;
  136. data['account'] = 25 /* User */;
  137. data['issue'] = 26 /* Issue */;
  138. return function (value, strict) {
  139. let res = data[value];
  140. if (typeof res === 'undefined' && !strict) {
  141. res = 9 /* Property */;
  142. }
  143. return res;
  144. };
  145. })();
  146. /**
  147. * How an {@link InlineCompletionsProvider inline completion provider} was triggered.
  148. */
  149. export var InlineCompletionTriggerKind;
  150. (function (InlineCompletionTriggerKind) {
  151. /**
  152. * Completion was triggered automatically while editing.
  153. * It is sufficient to return a single completion item in this case.
  154. */
  155. InlineCompletionTriggerKind[InlineCompletionTriggerKind["Automatic"] = 0] = "Automatic";
  156. /**
  157. * Completion was triggered explicitly by a user gesture.
  158. * Return multiple completion items to enable cycling through them.
  159. */
  160. InlineCompletionTriggerKind[InlineCompletionTriggerKind["Explicit"] = 1] = "Explicit";
  161. })(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {}));
  162. export var SignatureHelpTriggerKind;
  163. (function (SignatureHelpTriggerKind) {
  164. SignatureHelpTriggerKind[SignatureHelpTriggerKind["Invoke"] = 1] = "Invoke";
  165. SignatureHelpTriggerKind[SignatureHelpTriggerKind["TriggerCharacter"] = 2] = "TriggerCharacter";
  166. SignatureHelpTriggerKind[SignatureHelpTriggerKind["ContentChange"] = 3] = "ContentChange";
  167. })(SignatureHelpTriggerKind || (SignatureHelpTriggerKind = {}));
  168. /**
  169. * A document highlight kind.
  170. */
  171. export var DocumentHighlightKind;
  172. (function (DocumentHighlightKind) {
  173. /**
  174. * A textual occurrence.
  175. */
  176. DocumentHighlightKind[DocumentHighlightKind["Text"] = 0] = "Text";
  177. /**
  178. * Read-access of a symbol, like reading a variable.
  179. */
  180. DocumentHighlightKind[DocumentHighlightKind["Read"] = 1] = "Read";
  181. /**
  182. * Write-access of a symbol, like writing to a variable.
  183. */
  184. DocumentHighlightKind[DocumentHighlightKind["Write"] = 2] = "Write";
  185. })(DocumentHighlightKind || (DocumentHighlightKind = {}));
  186. /**
  187. * @internal
  188. */
  189. export function isLocationLink(thing) {
  190. return thing
  191. && URI.isUri(thing.uri)
  192. && Range.isIRange(thing.range)
  193. && (Range.isIRange(thing.originSelectionRange) || Range.isIRange(thing.targetSelectionRange));
  194. }
  195. /**
  196. * @internal
  197. */
  198. export var SymbolKinds;
  199. (function (SymbolKinds) {
  200. const byName = new Map();
  201. byName.set('file', 0 /* File */);
  202. byName.set('module', 1 /* Module */);
  203. byName.set('namespace', 2 /* Namespace */);
  204. byName.set('package', 3 /* Package */);
  205. byName.set('class', 4 /* Class */);
  206. byName.set('method', 5 /* Method */);
  207. byName.set('property', 6 /* Property */);
  208. byName.set('field', 7 /* Field */);
  209. byName.set('constructor', 8 /* Constructor */);
  210. byName.set('enum', 9 /* Enum */);
  211. byName.set('interface', 10 /* Interface */);
  212. byName.set('function', 11 /* Function */);
  213. byName.set('variable', 12 /* Variable */);
  214. byName.set('constant', 13 /* Constant */);
  215. byName.set('string', 14 /* String */);
  216. byName.set('number', 15 /* Number */);
  217. byName.set('boolean', 16 /* Boolean */);
  218. byName.set('array', 17 /* Array */);
  219. byName.set('object', 18 /* Object */);
  220. byName.set('key', 19 /* Key */);
  221. byName.set('null', 20 /* Null */);
  222. byName.set('enum-member', 21 /* EnumMember */);
  223. byName.set('struct', 22 /* Struct */);
  224. byName.set('event', 23 /* Event */);
  225. byName.set('operator', 24 /* Operator */);
  226. byName.set('type-parameter', 25 /* TypeParameter */);
  227. const byKind = new Map();
  228. byKind.set(0 /* File */, 'file');
  229. byKind.set(1 /* Module */, 'module');
  230. byKind.set(2 /* Namespace */, 'namespace');
  231. byKind.set(3 /* Package */, 'package');
  232. byKind.set(4 /* Class */, 'class');
  233. byKind.set(5 /* Method */, 'method');
  234. byKind.set(6 /* Property */, 'property');
  235. byKind.set(7 /* Field */, 'field');
  236. byKind.set(8 /* Constructor */, 'constructor');
  237. byKind.set(9 /* Enum */, 'enum');
  238. byKind.set(10 /* Interface */, 'interface');
  239. byKind.set(11 /* Function */, 'function');
  240. byKind.set(12 /* Variable */, 'variable');
  241. byKind.set(13 /* Constant */, 'constant');
  242. byKind.set(14 /* String */, 'string');
  243. byKind.set(15 /* Number */, 'number');
  244. byKind.set(16 /* Boolean */, 'boolean');
  245. byKind.set(17 /* Array */, 'array');
  246. byKind.set(18 /* Object */, 'object');
  247. byKind.set(19 /* Key */, 'key');
  248. byKind.set(20 /* Null */, 'null');
  249. byKind.set(21 /* EnumMember */, 'enum-member');
  250. byKind.set(22 /* Struct */, 'struct');
  251. byKind.set(23 /* Event */, 'event');
  252. byKind.set(24 /* Operator */, 'operator');
  253. byKind.set(25 /* TypeParameter */, 'type-parameter');
  254. /**
  255. * @internal
  256. */
  257. function fromString(value) {
  258. return byName.get(value);
  259. }
  260. SymbolKinds.fromString = fromString;
  261. /**
  262. * @internal
  263. */
  264. function toString(kind) {
  265. return byKind.get(kind);
  266. }
  267. SymbolKinds.toString = toString;
  268. /**
  269. * @internal
  270. */
  271. function toCssClassName(kind, inline) {
  272. const symbolName = byKind.get(kind);
  273. let codicon = symbolName && iconRegistry.get('symbol-' + symbolName);
  274. if (!codicon) {
  275. console.info('No codicon found for SymbolKind ' + kind);
  276. codicon = Codicon.symbolProperty;
  277. }
  278. return `${inline ? 'inline' : 'block'} ${codicon.classNames}`;
  279. }
  280. SymbolKinds.toCssClassName = toCssClassName;
  281. })(SymbolKinds || (SymbolKinds = {}));
  282. export class FoldingRangeKind {
  283. /**
  284. * Creates a new {@link FoldingRangeKind}.
  285. *
  286. * @param value of the kind.
  287. */
  288. constructor(value) {
  289. this.value = value;
  290. }
  291. }
  292. /**
  293. * Kind for folding range representing a comment. The value of the kind is 'comment'.
  294. */
  295. FoldingRangeKind.Comment = new FoldingRangeKind('comment');
  296. /**
  297. * Kind for folding range representing a import. The value of the kind is 'imports'.
  298. */
  299. FoldingRangeKind.Imports = new FoldingRangeKind('imports');
  300. /**
  301. * Kind for folding range representing regions (for example marked by `#region`, `#endregion`).
  302. * The value of the kind is 'region'.
  303. */
  304. FoldingRangeKind.Region = new FoldingRangeKind('region');
  305. export var InlayHintKind;
  306. (function (InlayHintKind) {
  307. InlayHintKind[InlayHintKind["Other"] = 0] = "Other";
  308. InlayHintKind[InlayHintKind["Type"] = 1] = "Type";
  309. InlayHintKind[InlayHintKind["Parameter"] = 2] = "Parameter";
  310. })(InlayHintKind || (InlayHintKind = {}));
  311. // --- feature registries ------
  312. /**
  313. * @internal
  314. */
  315. export const ReferenceProviderRegistry = new LanguageFeatureRegistry();
  316. /**
  317. * @internal
  318. */
  319. export const RenameProviderRegistry = new LanguageFeatureRegistry();
  320. /**
  321. * @internal
  322. */
  323. export const CompletionProviderRegistry = new LanguageFeatureRegistry();
  324. /**
  325. * @internal
  326. */
  327. export const InlineCompletionsProviderRegistry = new LanguageFeatureRegistry();
  328. /**
  329. * @internal
  330. */
  331. export const SignatureHelpProviderRegistry = new LanguageFeatureRegistry();
  332. /**
  333. * @internal
  334. */
  335. export const HoverProviderRegistry = new LanguageFeatureRegistry();
  336. /**
  337. * @internal
  338. */
  339. export const DocumentSymbolProviderRegistry = new LanguageFeatureRegistry();
  340. /**
  341. * @internal
  342. */
  343. export const DocumentHighlightProviderRegistry = new LanguageFeatureRegistry();
  344. /**
  345. * @internal
  346. */
  347. export const LinkedEditingRangeProviderRegistry = new LanguageFeatureRegistry();
  348. /**
  349. * @internal
  350. */
  351. export const DefinitionProviderRegistry = new LanguageFeatureRegistry();
  352. /**
  353. * @internal
  354. */
  355. export const DeclarationProviderRegistry = new LanguageFeatureRegistry();
  356. /**
  357. * @internal
  358. */
  359. export const ImplementationProviderRegistry = new LanguageFeatureRegistry();
  360. /**
  361. * @internal
  362. */
  363. export const TypeDefinitionProviderRegistry = new LanguageFeatureRegistry();
  364. /**
  365. * @internal
  366. */
  367. export const CodeLensProviderRegistry = new LanguageFeatureRegistry();
  368. /**
  369. * @internal
  370. */
  371. export const InlayHintsProviderRegistry = new LanguageFeatureRegistry();
  372. /**
  373. * @internal
  374. */
  375. export const CodeActionProviderRegistry = new LanguageFeatureRegistry();
  376. /**
  377. * @internal
  378. */
  379. export const DocumentFormattingEditProviderRegistry = new LanguageFeatureRegistry();
  380. /**
  381. * @internal
  382. */
  383. export const DocumentRangeFormattingEditProviderRegistry = new LanguageFeatureRegistry();
  384. /**
  385. * @internal
  386. */
  387. export const OnTypeFormattingEditProviderRegistry = new LanguageFeatureRegistry();
  388. /**
  389. * @internal
  390. */
  391. export const LinkProviderRegistry = new LanguageFeatureRegistry();
  392. /**
  393. * @internal
  394. */
  395. export const ColorProviderRegistry = new LanguageFeatureRegistry();
  396. /**
  397. * @internal
  398. */
  399. export const SelectionRangeRegistry = new LanguageFeatureRegistry();
  400. /**
  401. * @internal
  402. */
  403. export const FoldingRangeProviderRegistry = new LanguageFeatureRegistry();
  404. /**
  405. * @internal
  406. */
  407. export const DocumentSemanticTokensProviderRegistry = new LanguageFeatureRegistry();
  408. /**
  409. * @internal
  410. */
  411. export const DocumentRangeSemanticTokensProviderRegistry = new LanguageFeatureRegistry();
  412. /**
  413. * @internal
  414. */
  415. export const TokenizationRegistry = new TokenizationRegistryImpl();