modes.js 14 KB

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