@@ -166,8 +166,11 @@ function topNodeAt(state: EditorState, pos: number, side: -1 | 0 | 1) {
166166/// [LR parsers](https://lezer.codemirror.net/docs/ref#lr.LRParser)
167167/// parsers.
168168export class LRLanguage extends Language {
169- private constructor ( data : Facet < { [ name : string ] : any } > , readonly parser : LRParser , name ?: string ) {
170- super ( data , parser , [ ] , name )
169+ private constructor ( data : Facet < { [ name : string ] : any } > ,
170+ readonly parser : LRParser ,
171+ private languageData : { [ name : string ] : any } | null ,
172+ name ?: string ) {
173+ super ( data , parser , languageData ? [ data . of ( languageData ) ] : [ ] , name )
171174 }
172175
173176 /// Define a language from a parser.
@@ -182,16 +185,29 @@ export class LRLanguage extends Language {
182185 /// to register for this language.
183186 languageData ?: { [ name : string ] : any }
184187 } ) {
185- let data = defineLanguageFacet ( spec . languageData )
188+ let data = defineLanguageFacet ( )
186189 return new LRLanguage ( data , spec . parser . configure ( {
187190 props : [ languageDataProp . add ( type => type . isTop ? data : undefined ) ]
188- } ) , spec . name )
191+ } ) , spec . languageData || null , spec . name )
189192 }
190193
191194 /// Create a new instance of this language with a reconfigured
192- /// version of its parser and optionally a new name.
193- configure ( options : ParserConfig , name ?: string ) : LRLanguage {
194- return new LRLanguage ( this . data , this . parser . configure ( options ) , name || this . name )
195+ /// version of its parser, language data, and name.
196+ ///
197+ /// When `languageData` is given, any property set to `undefined`
198+ /// in it will be removed from the language's
199+ /// [data](#state.EditorState.languageDataAt), any other property
200+ /// is added.
201+ configure ( options : ParserConfig & { languageData ?: { [ name : string ] : any } } , name ?: string ) : LRLanguage {
202+ let { languageData} = this
203+ if ( options . languageData ) {
204+ languageData = { }
205+ for ( let prop in options . languageData )
206+ if ( options . languageData [ prop ] !== undefined ) languageData [ prop ] = options . languageData [ prop ]
207+ for ( let prop in this . languageData )
208+ if ( ! ( prop in options . languageData ) ) languageData [ prop ] = this . languageData [ prop ]
209+ }
210+ return new LRLanguage ( this . data , this . parser . configure ( options ) , languageData , name || this . name )
195211 }
196212
197213 get allowsNesting ( ) { return this . parser . hasWrappers ( ) }
0 commit comments