11import { Autowired , Injectable } from '@ali/common-di' ;
2- import { Disposable , Deferred , Emitter , Event , URI } from '@ali/ide-core-common' ;
2+ import { MonacoContribution , ClientAppContribution } from '@ali/ide-core-browser' ;
3+ import { Disposable , Deferred , Emitter , Event , URI , Domain } from '@ali/ide-core-common' ;
34import { TextmateService } from '@ali/ide-monaco/lib/browser/textmate.service' ;
45import { LanguagesContribution , GrammarsContribution } from '@ali/ide-monaco' ;
56
@@ -12,11 +13,17 @@ class SingleEventEmitter<T> extends Emitter<T> {
1213 }
1314}
1415
15- @Injectable ( )
16- export class LanguageGrammarRegistrationService extends Disposable {
16+ @Domain ( ClientAppContribution , MonacoContribution )
17+ export class LanguageGrammarRegistrationService
18+ extends Disposable
19+ implements ClientAppContribution , MonacoContribution {
1720 static languageEmitter = new SingleEventEmitter < LanguagesContribution > ( ) ;
1821 static grammarEmitter = new SingleEventEmitter < GrammarsContribution > ( ) ;
1922
23+ private _monacoLoaded = new Deferred < void > ( ) ;
24+
25+ private _ModesRegistry : { _languages : any [ ] } | null = null ;
26+
2027 @Autowired ( TextmateService )
2128 private readonly textMateService : TextmateService ;
2229
@@ -25,6 +32,21 @@ export class LanguageGrammarRegistrationService extends Disposable {
2532 return this . languageDidRegisterDeferred . promise ;
2633 }
2734
35+ async initialize ( ) {
36+ await this . _monacoLoaded . promise ;
37+ const vsRequire : any = ( window as any ) . amdLoader . require ;
38+ return new Promise < void > ( ( resolve ) => {
39+ vsRequire ( [ 'vs/editor/common/modes/modesRegistry' ] , ( { ModesRegistry } ) => {
40+ this . _ModesRegistry = ModesRegistry ;
41+ resolve ( ) ;
42+ } ) ;
43+ } ) ;
44+ }
45+
46+ onMonacoLoaded ( ) {
47+ this . _monacoLoaded . resolve ( ) ;
48+ }
49+
2850 async initRegisterLanguageAndGrammar ( ) {
2951 // 没啥作用,只是确保传参类型正确
3052 const uri = new URI ( ) ;
@@ -51,6 +73,10 @@ export class LanguageGrammarRegistrationService extends Disposable {
5173
5274 dispose ( ) {
5375 this . clear ( ) ;
76+ // 清除缓存的语言,减少 monaco 内部的遍历
77+ if ( this . _ModesRegistry ) {
78+ this . _ModesRegistry . _languages = [ ] ;
79+ }
5480 }
5581}
5682
0 commit comments