@@ -54,29 +54,49 @@ function autoSaveModels (services: CgMonacoServices): Disposable {
5454}
5555
5656let services : CgMonacoServices | null = null
57- function installServices ( infrastructure : Infrastructure ) : CgMonacoServices {
58- const m2p = new MonacoToProtocolConverter ( monaco )
59- const p2m = new ProtocolToMonacoConverter ( monaco )
60-
57+ let serviceDisposable : Disposable | null = null
58+ let serviceReferenceCount = 0
59+ function installServices ( infrastructure : Infrastructure ) : Disposable {
6160 if ( services == null ) {
61+ // FIXME: we can't recreate services because MonacoWorkspace can't be disposed without memory leaks
62+ // fix me as soon as https://github.com/TypeFox/monaco-languageclient/pull/330/files is released
63+ const m2p = new MonacoToProtocolConverter ( monaco )
64+ const p2m = new ProtocolToMonacoConverter ( monaco )
6265 services = {
6366 commands : new MonacoCommands ( monaco ) ,
6467 languages : new MonacoLanguages ( monaco , p2m , m2p ) ,
6568 workspace : new CodinGameMonacoWorkspace ( p2m , m2p , infrastructure . rootUri , infrastructure . workspaceFolders ) ,
6669 window : new WatchableConsoleWindow ( )
6770 }
71+ }
6872
69- Services . install ( services )
73+ if ( serviceReferenceCount === 0 ) {
74+ const disposableCollection = new DisposableCollection ( )
7075
71- installCommands ( services )
76+ disposableCollection . push ( installCommands ( services ) )
77+ disposableCollection . push ( Services . install ( services ) )
7278
7379 if ( ! infrastructure . automaticTextDocumentUpdate ) {
74- autoSaveModels ( services )
80+ disposableCollection . push ( autoSaveModels ( services ) )
7581 }
82+ serviceDisposable = disposableCollection
7683 }
77- return services
84+ serviceReferenceCount ++
85+
86+ return Disposable . create ( ( ) => {
87+ serviceReferenceCount --
88+ if ( serviceReferenceCount <= 0 ) {
89+ serviceDisposable ?. dispose ( )
90+ serviceDisposable = null
91+ }
92+ } )
93+ }
94+
95+ function getServices ( ) : CgMonacoServices {
96+ return Services . get ( ) ! as CgMonacoServices
7897}
7998
8099export {
81- installServices
100+ installServices ,
101+ getServices
82102}
0 commit comments