55
66import * as nls from 'vs/nls' ;
77import { isFalsyOrEmpty } from 'vs/base/common/arrays' ;
8- import { isThenable } from 'vs/base/common/async' ;
98import { Emitter , Event } from 'vs/base/common/event' ;
109import { MarkdownString } from 'vs/base/common/htmlContent' ;
1110import { Disposable , IDisposable , dispose } from 'vs/base/common/lifecycle' ;
@@ -20,8 +19,9 @@ import { DefaultEndOfLine, EndOfLinePreference, EndOfLineSequence, IIdentifiedSi
2019import { ClassName } from 'vs/editor/common/model/intervalTree' ;
2120import { TextModel , createTextBuffer } from 'vs/editor/common/model/textModel' ;
2221import { IModelLanguageChangedEvent } from 'vs/editor/common/model/textModelEvents' ;
23- import { IMode , LanguageIdentifier } from 'vs/editor/common/modes' ;
22+ import { LanguageIdentifier } from 'vs/editor/common/modes' ;
2423import { PLAINTEXT_LANGUAGE_IDENTIFIER } from 'vs/editor/common/modes/modesRegistry' ;
24+ import { ILanguageSelection } from 'vs/editor/common/services/modeService' ;
2525import { IModelService } from 'vs/editor/common/services/modelService' ;
2626import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration' ;
2727import { overviewRulerError , overviewRulerInfo , overviewRulerWarning } from 'vs/editor/common/view/editorColorRegistry' ;
@@ -34,7 +34,10 @@ function MODEL_ID(resource: URI): string {
3434}
3535
3636class ModelData implements IDisposable {
37- model : ITextModel ;
37+ public readonly model : ITextModel ;
38+
39+ private _languageSelection : ILanguageSelection | null ;
40+ private _languageSelectionListener : IDisposable | null ;
3841
3942 private _markerDecorations : string [ ] ;
4043 private _modelEventListeners : IDisposable [ ] ;
@@ -46,21 +49,43 @@ class ModelData implements IDisposable {
4649 ) {
4750 this . model = model ;
4851
52+ this . _languageSelection = null ;
53+ this . _languageSelectionListener = null ;
54+
4955 this . _markerDecorations = [ ] ;
5056
5157 this . _modelEventListeners = [ ] ;
5258 this . _modelEventListeners . push ( model . onWillDispose ( ( ) => onWillDispose ( model ) ) ) ;
5359 this . _modelEventListeners . push ( model . onDidChangeLanguage ( ( e ) => onDidChangeLanguage ( model , e ) ) ) ;
5460 }
5561
62+ private _disposeLanguageSelection ( ) : void {
63+ if ( this . _languageSelectionListener ) {
64+ this . _languageSelectionListener . dispose ( ) ;
65+ this . _languageSelectionListener = null ;
66+ }
67+ if ( this . _languageSelection ) {
68+ this . _languageSelection . dispose ( ) ;
69+ this . _languageSelection = null ;
70+ }
71+ }
72+
5673 public dispose ( ) : void {
5774 this . _markerDecorations = this . model . deltaDecorations ( this . _markerDecorations , [ ] ) ;
5875 this . _modelEventListeners = dispose ( this . _modelEventListeners ) ;
76+ this . _disposeLanguageSelection ( ) ;
5977 }
6078
6179 public acceptMarkerDecorations ( newDecorations : IModelDeltaDecoration [ ] ) : void {
6280 this . _markerDecorations = this . model . deltaDecorations ( this . _markerDecorations , newDecorations ) ;
6381 }
82+
83+ public setLanguage ( languageSelection : ILanguageSelection ) : void {
84+ this . _disposeLanguageSelection ( ) ;
85+ this . _languageSelection = languageSelection ;
86+ this . _languageSelectionListener = this . _languageSelection . onDidChange ( ( ) => this . model . setMode ( languageSelection . languageIdentifier ) ) ;
87+ this . model . setMode ( languageSelection . languageIdentifier ) ;
88+ }
6489}
6590
6691class ModelMarkerHandler {
@@ -508,14 +533,14 @@ export class ModelServiceImpl extends Disposable implements IModelService {
508533 return [ EditOperation . replaceMove ( oldRange , textBuffer . getValueInRange ( newRange , EndOfLinePreference . TextDefined ) ) ] ;
509534 }
510535
511- public createModel ( value : string | ITextBufferFactory , modeOrPromise : Promise < IMode > | IMode , resource : URI , isForSimpleWidget : boolean = false ) : ITextModel {
536+ public createModel ( value : string | ITextBufferFactory , languageSelection : ILanguageSelection | null , resource : URI , isForSimpleWidget : boolean = false ) : ITextModel {
512537 let modelData : ModelData ;
513538
514- if ( ! modeOrPromise || isThenable ( modeOrPromise ) ) {
515- modelData = this . _createModelData ( value , PLAINTEXT_LANGUAGE_IDENTIFIER , resource , isForSimpleWidget ) ;
516- this . setMode ( modelData . model , modeOrPromise ) ;
539+ if ( languageSelection ) {
540+ modelData = this . _createModelData ( value , languageSelection . languageIdentifier , resource , isForSimpleWidget ) ;
541+ this . setMode ( modelData . model , languageSelection ) ;
517542 } else {
518- modelData = this . _createModelData ( value , modeOrPromise . getLanguageIdentifier ( ) , resource , isForSimpleWidget ) ;
543+ modelData = this . _createModelData ( value , PLAINTEXT_LANGUAGE_IDENTIFIER , resource , isForSimpleWidget ) ;
519544 }
520545
521546 // handle markers (marker service => model)
@@ -528,19 +553,15 @@ export class ModelServiceImpl extends Disposable implements IModelService {
528553 return modelData . model ;
529554 }
530555
531- public setMode ( model : ITextModel , modeOrPromise : Promise < IMode > | IMode ) : void {
532- if ( ! modeOrPromise ) {
556+ public setMode ( model : ITextModel , languageSelection : ILanguageSelection ) : void {
557+ if ( ! languageSelection ) {
533558 return ;
534559 }
535- if ( isThenable ( modeOrPromise ) ) {
536- modeOrPromise . then ( ( mode ) => {
537- if ( ! model . isDisposed ( ) ) {
538- model . setMode ( mode . getLanguageIdentifier ( ) ) ;
539- }
540- } ) ;
541- } else {
542- model . setMode ( modeOrPromise . getLanguageIdentifier ( ) ) ;
560+ let modelData = this . _models [ MODEL_ID ( model . uri ) ] ;
561+ if ( ! modelData ) {
562+ return ;
543563 }
564+ modelData . setLanguage ( languageSelection ) ;
544565 }
545566
546567 public destroyModel ( resource : URI ) : void {
0 commit comments