diff --git a/src/mode.ts b/src/mode.ts index bd7204a..5733cf4 100644 --- a/src/mode.ts +++ b/src/mode.ts @@ -14,8 +14,11 @@ import Promise = monaco.Promise; import Uri = monaco.Uri; import IDisposable = monaco.IDisposable; +let javaScriptClient: WorkerManager; +let typeScriptClient: WorkerManager; + export function setupTypeScript(defaults:LanguageServiceDefaultsImpl): void { - setupMode( + typeScriptClient = setupMode( defaults, 'typescript', Language.TypeScript @@ -23,14 +26,34 @@ export function setupTypeScript(defaults:LanguageServiceDefaultsImpl): void { } export function setupJavaScript(defaults:LanguageServiceDefaultsImpl): void { - setupMode( + javaScriptClient = setupMode( defaults, 'javascript', Language.EcmaScript5 ); } -function setupMode(defaults:LanguageServiceDefaultsImpl, modeId:string, language:Language): void { +export function getJavaScriptWorker(): Promise { + return new monaco.Promise((resolve, reject) => { + if (!javaScriptClient) { + return reject("JavaScript not registered!"); + } + + resolve(javaScriptClient.getLanguageServiceWorker()); + }); +} + +export function getTypeScriptWorker(): Promise { + return new monaco.Promise((resolve, reject) => { + if (!typeScriptClient) { + return reject("TypeScript not registered!"); + } + + resolve(typeScriptClient.getLanguageServiceWorker()); + }); +} + +function setupMode(defaults:LanguageServiceDefaultsImpl, modeId:string, language:Language): WorkerManager { let disposables: IDisposable[] = []; @@ -53,6 +76,8 @@ function setupMode(defaults:LanguageServiceDefaultsImpl, modeId:string, language disposables.push(new languageFeatures.DiagnostcsAdapter(defaults, modeId, worker)); disposables.push(monaco.languages.setLanguageConfiguration(modeId, richEditConfiguration)); disposables.push(monaco.languages.setTokensProvider(modeId, createTokenizationSupport(language))); + + return client; } const richEditConfiguration:monaco.languages.LanguageConfiguration = { diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index a8fd29c..2fa3762 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -121,6 +121,23 @@ const javascriptDefaults = new LanguageServiceDefaultsImpl( { allowNonTsExtensions: true, allowJs: true, target: ScriptTarget.Latest }, { noSemanticValidation: true, noSyntaxValidation: false }); +function getTypeScriptWorker(): monaco.Promise { + return new monaco.Promise((resolve, reject) => { + withMode((mode: any) => { + mode.getTypeScriptWorker() + .then(resolve, reject); + }); + }); +} + +function getJavaScriptWorker(): monaco.Promise { + return new monaco.Promise((resolve, reject) => { + withMode((mode: any) => { + mode.getJavaScriptWorker() + .then(resolve, reject); + }); + }); +} // Export API function createAPI(): typeof monaco.languages.typescript { @@ -131,7 +148,9 @@ function createAPI(): typeof monaco.languages.typescript { ScriptTarget: ScriptTarget, ModuleResolutionKind: ModuleResolutionKind, typescriptDefaults: typescriptDefaults, - javascriptDefaults: javascriptDefaults + javascriptDefaults: javascriptDefaults, + getTypeScriptWorker: getTypeScriptWorker, + getJavaScriptWorker: getJavaScriptWorker } } monaco.languages.typescript = createAPI(); diff --git a/src/monaco.d.ts b/src/monaco.d.ts index 4c72679..9f5dbb3 100644 --- a/src/monaco.d.ts +++ b/src/monaco.d.ts @@ -106,4 +106,7 @@ declare module monaco.languages.typescript { export var typescriptDefaults: LanguageServiceDefaults; export var javascriptDefaults: LanguageServiceDefaults; + + export var getTypeScriptWorker: () => monaco.Promise; + export var getJavaScriptWorker: () => monaco.Promise; }