| 
1 | 1 | 
 
  | 
2 | 2 | import * as monaco from 'monaco-editor'  | 
3 | 3 | import {  | 
4 |  | -  Services, MonacoToProtocolConverter, ProtocolToMonacoConverter, MonacoLanguages, TextDocumentSaveReason, MonacoCommands, DisposableCollection  | 
 | 4 | +  Services, MonacoToProtocolConverter, ProtocolToMonacoConverter, MonacoLanguages, MonacoCommands  | 
5 | 5 | } from 'monaco-languageclient'  | 
6 | 6 | import { RenameFile, CreateFile, WorkspaceEdit, Disposable } from 'vscode-languageserver-protocol'  | 
7 | 7 | import WatchableConsoleWindow from './services/WatchableConsoleWindow'  | 
@@ -29,72 +29,31 @@ function installCommands (services: CgMonacoServices): Disposable {  | 
29 | 29 |   })  | 
30 | 30 | }  | 
31 | 31 | 
 
  | 
32 |  | -function autoSaveModels (services: CgMonacoServices): Disposable {  | 
33 |  | -  const disposableCollection = new DisposableCollection()  | 
34 |  | -  const timeoutMap = new Map<string, number>()  | 
35 |  | -  disposableCollection.push(services.workspace.onDidChangeTextDocument(e => {  | 
36 |  | -    const timeout = timeoutMap.get(e.textDocument.uri)  | 
37 |  | -    if (timeout != null) {  | 
38 |  | -      window.clearTimeout(timeout)  | 
39 |  | -      timeoutMap.delete(e.textDocument.uri)  | 
40 |  | -    }  | 
41 |  | -    timeoutMap.set(e.textDocument.uri, window.setTimeout(() => {  | 
42 |  | -      timeoutMap.delete(e.textDocument.uri)  | 
43 |  | -      services.workspace.saveDocument(e.textDocument, TextDocumentSaveReason.AfterDelay).catch((error: Error) => {  | 
44 |  | -        monaco.errorHandler.onUnexpectedError(new Error(`[LSP] Unable to save the document ${e.textDocument.uri.toString()}`, {  | 
45 |  | -          cause: error  | 
46 |  | -        }))  | 
47 |  | -      })  | 
48 |  | -    }, 500))  | 
49 |  | -  }))  | 
50 |  | -  disposableCollection.push(Disposable.create(() => {  | 
51 |  | -    for (const timeout of Array.from(timeoutMap.values())) {  | 
52 |  | -      window.clearTimeout(timeout)  | 
53 |  | -    }  | 
54 |  | -  }))  | 
55 |  | -  return disposableCollection  | 
 | 32 | +const m2p = new MonacoToProtocolConverter(monaco)  | 
 | 33 | +const p2m = new ProtocolToMonacoConverter(monaco)  | 
 | 34 | +const services = {  | 
 | 35 | +  commands: new MonacoCommands(monaco),  | 
 | 36 | +  languages: new MonacoLanguages(monaco, p2m, m2p),  | 
 | 37 | +  workspace: new CodinGameMonacoWorkspace(p2m, m2p, 'file:///tmp/project'),  | 
 | 38 | +  window: new WatchableConsoleWindow()  | 
56 | 39 | }  | 
57 | 40 | 
 
  | 
58 |  | -let serviceDisposable: Disposable | null = null  | 
59 |  | -let serviceReferenceCount = 0  | 
60 |  | -function installServices (infrastructure: Infrastructure): Disposable {  | 
61 |  | -  if (serviceReferenceCount === 0) {  | 
62 |  | -    const disposableCollection = new DisposableCollection()  | 
63 |  | - | 
64 |  | -    const m2p = new MonacoToProtocolConverter(monaco)  | 
65 |  | -    const p2m = new ProtocolToMonacoConverter(monaco)  | 
66 |  | -    const services = {  | 
67 |  | -      commands: new MonacoCommands(monaco),  | 
68 |  | -      languages: new MonacoLanguages(monaco, p2m, m2p),  | 
69 |  | -      workspace: new CodinGameMonacoWorkspace(p2m, m2p, infrastructure.rootUri, infrastructure.workspaceFolders),  | 
70 |  | -      window: new WatchableConsoleWindow()  | 
71 |  | -    }  | 
72 |  | - | 
73 |  | -    disposableCollection.push(services.workspace)  | 
74 |  | -    disposableCollection.push(installCommands(services))  | 
75 |  | -    disposableCollection.push(Services.install(services))  | 
 | 41 | +installCommands(services)  | 
 | 42 | +Services.install(services)  | 
76 | 43 | 
 
  | 
77 |  | -    if (!infrastructure.automaticTextDocumentUpdate) {  | 
78 |  | -      disposableCollection.push(autoSaveModels(services))  | 
79 |  | -    }  | 
80 |  | -    serviceDisposable = disposableCollection  | 
81 |  | -  }  | 
82 |  | -  serviceReferenceCount++  | 
83 |  | - | 
84 |  | -  return Disposable.create(() => {  | 
85 |  | -    serviceReferenceCount--  | 
86 |  | -    if (serviceReferenceCount <= 0) {  | 
87 |  | -      serviceDisposable?.dispose()  | 
88 |  | -      serviceDisposable = null  | 
89 |  | -    }  | 
90 |  | -  })  | 
 | 44 | +function updateServices (infrastructure: Infrastructure): void {  | 
 | 45 | +  services.workspace.initialize(  | 
 | 46 | +    infrastructure.rootUri,  | 
 | 47 | +    infrastructure.workspaceFolders,  | 
 | 48 | +    !infrastructure.automaticTextDocumentUpdate  | 
 | 49 | +  )  | 
91 | 50 | }  | 
92 | 51 | 
 
  | 
93 | 52 | function getServices (): CgMonacoServices {  | 
94 | 53 |   return Services.get()! as CgMonacoServices  | 
95 | 54 | }  | 
96 | 55 | 
 
  | 
97 | 56 | export {  | 
98 |  | -  installServices,  | 
 | 57 | +  updateServices,  | 
99 | 58 |   getServices  | 
100 | 59 | }  | 
0 commit comments