tsMode.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. 'use strict';
  6. import {Language, createTokenizationSupport} from './tokenization';
  7. import {WorkerManager} from './workerManager';
  8. import {TypeScriptWorker} from './tsWorker';
  9. import {LanguageServiceDefaultsImpl} from './monaco.contribution';
  10. import * as languageFeatures from './languageFeatures';
  11. import Promise = monaco.Promise;
  12. import Uri = monaco.Uri;
  13. let javaScriptWorker: (first: Uri, ...more: Uri[]) => Promise<TypeScriptWorker>;
  14. let typeScriptWorker: (first: Uri, ...more: Uri[]) => Promise<TypeScriptWorker>;
  15. export function setupTypeScript(defaults:LanguageServiceDefaultsImpl): void {
  16. typeScriptWorker = setupMode(
  17. defaults,
  18. 'typescript',
  19. Language.TypeScript
  20. );
  21. }
  22. export function setupJavaScript(defaults:LanguageServiceDefaultsImpl): void {
  23. javaScriptWorker = setupMode(
  24. defaults,
  25. 'javascript',
  26. Language.EcmaScript5
  27. );
  28. }
  29. export function getJavaScriptWorker(): Promise<(first: Uri, ...more: Uri[]) => Promise<TypeScriptWorker>> {
  30. return new monaco.Promise((resolve, reject) => {
  31. if (!javaScriptWorker) {
  32. return reject("JavaScript not registered!");
  33. }
  34. resolve(javaScriptWorker);
  35. });
  36. }
  37. export function getTypeScriptWorker(): Promise<(first: Uri, ...more: Uri[]) => Promise<TypeScriptWorker>> {
  38. return new monaco.Promise((resolve, reject) => {
  39. if (!typeScriptWorker) {
  40. return reject("TypeScript not registered!");
  41. }
  42. resolve(typeScriptWorker);
  43. });
  44. }
  45. function setupMode(defaults:LanguageServiceDefaultsImpl, modeId:string, language:Language): (first: Uri, ...more: Uri[]) => Promise<TypeScriptWorker> {
  46. const client = new WorkerManager(modeId, defaults);
  47. const worker = (first: Uri, ...more: Uri[]): Promise<TypeScriptWorker> => {
  48. return client.getLanguageServiceWorker(...[first].concat(more));
  49. };
  50. monaco.languages.registerCompletionItemProvider(modeId, new languageFeatures.SuggestAdapter(worker));
  51. monaco.languages.registerSignatureHelpProvider(modeId, new languageFeatures.SignatureHelpAdapter(worker));
  52. monaco.languages.registerHoverProvider(modeId, new languageFeatures.QuickInfoAdapter(worker));
  53. monaco.languages.registerDocumentHighlightProvider(modeId, new languageFeatures.OccurrencesAdapter(worker));
  54. monaco.languages.registerDefinitionProvider(modeId, new languageFeatures.DefinitionAdapter(worker));
  55. monaco.languages.registerReferenceProvider(modeId, new languageFeatures.ReferenceAdapter(worker));
  56. monaco.languages.registerDocumentSymbolProvider(modeId, new languageFeatures.OutlineAdapter(worker));
  57. monaco.languages.registerDocumentRangeFormattingEditProvider(modeId, new languageFeatures.FormatAdapter(worker));
  58. monaco.languages.registerOnTypeFormattingEditProvider(modeId, new languageFeatures.FormatOnTypeAdapter(worker));
  59. new languageFeatures.DiagnostcsAdapter(defaults, modeId, worker);
  60. monaco.languages.setLanguageConfiguration(modeId, richEditConfiguration);
  61. monaco.languages.setTokensProvider(modeId, createTokenizationSupport(language));
  62. return worker;
  63. }
  64. const richEditConfiguration:monaco.languages.LanguageConfiguration = {
  65. wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,
  66. comments: {
  67. lineComment: '//',
  68. blockComment: ['/*', '*/']
  69. },
  70. brackets: [
  71. ['{', '}'],
  72. ['[', ']'],
  73. ['(', ')']
  74. ],
  75. onEnterRules: [
  76. {
  77. // e.g. /** | */
  78. beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,
  79. afterText: /^\s*\*\/$/,
  80. action: { indentAction: monaco.languages.IndentAction.IndentOutdent, appendText: ' * ' }
  81. },
  82. {
  83. // e.g. /** ...|
  84. beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,
  85. action: { indentAction: monaco.languages.IndentAction.None, appendText: ' * ' }
  86. },
  87. {
  88. // e.g. * ...|
  89. beforeText: /^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,
  90. action: { indentAction: monaco.languages.IndentAction.None, appendText: '* ' }
  91. },
  92. {
  93. // e.g. */|
  94. beforeText: /^(\t|(\ \ ))*\ \*\/\s*$/,
  95. action: { indentAction: monaco.languages.IndentAction.None, removeText: 1 }
  96. }
  97. ],
  98. autoClosingPairs: [
  99. { open: '{', close: '}' },
  100. { open: '[', close: ']' },
  101. { open: '(', close: ')' },
  102. { open: '"', close: '"', notIn: ['string'] },
  103. { open: '\'', close: '\'', notIn: ['string', 'comment'] },
  104. { open: '`', close: '`', notIn: ['string', 'comment'] },
  105. { open: "/**", close: " */", notIn: ["string"] }
  106. ],
  107. folding: {
  108. markers: {
  109. start: new RegExp("^\\s*//\\s*#?region\\b"),
  110. end: new RegExp("^\\s*//\\s*#?endregion\\b")
  111. }
  112. }
  113. };