11import * as monaco from 'monaco-editor'
2- import { createTextMateTokensProvider } from './textMate'
2+ import { getOrCreateTextMateTokensProvider } from './textMate'
33import textMateLanguages from './extensions/languages.json'
44import { languageLoader as monarchLanguageLoader } from './monarch'
55import languageConfigurationLoader , { RawLanguageConfiguration } from './extensions/languageConfigurationLoader'
@@ -39,7 +39,7 @@ for (const languageId of languagesIds) {
3939
4040 monaco . languages . setTokenizationSupportFactory ( languageId , {
4141 createTokenizationSupport : async ( ) => {
42- return createTextMateTokensProvider ( languageId ) . catch ( err => {
42+ return getOrCreateTextMateTokensProvider ( languageId ) . catch ( err => {
4343 const monarchLoader = monarchLanguageLoader [ languageId ]
4444 if ( monarchLoader != null ) {
4545 console . warn ( `Failed to load TextMate grammar for language ${ languageId } , fallback to monarch` , err )
@@ -70,22 +70,25 @@ function parseLanguageConfiguration (config: RawLanguageConfiguration): monaco.e
7070 }
7171}
7272
73+ async function loadLanguageConfiguration ( languageId : string ) {
74+ const loader = languageConfigurationLoader [ languageId ]
75+ if ( loader != null ) {
76+ const configuration = await loader ( )
77+ monaco . extra . handleLanguageConfiguration (
78+ languageId ,
79+ addCustomFoldingMarkers ( parseLanguageConfiguration ( configuration ) )
80+ )
81+ }
82+ }
83+
7384languageService . onDidEncounterLanguage ( async ( languageId ) => {
7485 if ( languageId === 'plaintext' ) {
7586 return
7687 }
7788
78- const loader = languageConfigurationLoader [ languageId ]
79- if ( loader != null ) {
80- loader ( ) . then ( ( configuration ) => {
81- monaco . extra . handleLanguageConfiguration (
82- languageId ,
83- addCustomFoldingMarkers ( parseLanguageConfiguration ( configuration ) )
84- )
85- } ) . catch ( error => {
86- console . error ( 'Unable to load language configuration' , error )
87- } )
88- }
89+ loadLanguageConfiguration ( languageId ) . catch ( error => {
90+ console . error ( 'Unable to load language configuration' , error )
91+ } )
8992} )
9093
9194function getMonacoLanguage ( languageOrModeId : string ) : string {
@@ -103,6 +106,14 @@ function getMonacoLanguage (languageOrModeId: string): string {
103106 return 'plaintext'
104107}
105108
109+ async function loadLanguage ( languageId : string ) : Promise < void > {
110+ await Promise . all ( [
111+ loadLanguageConfiguration ( languageId ) ,
112+ getOrCreateTextMateTokensProvider ( languageId )
113+ ] )
114+ }
115+
106116export {
107- getMonacoLanguage
117+ getMonacoLanguage ,
118+ loadLanguage
108119}
0 commit comments