提交 2eabbee4 编写于 作者: M mechatroner

Add two alternative language-changing interface functions

上级 2582f425
......@@ -211,6 +211,10 @@ export class LanguagesRegistry {
return Object.keys(this._nameMap);
}
public isRegisteredModeExact(modeId: string): boolean {
return hasOwnProperty.call(this._languages, modeId);
}
public getLanguageName(modeId: string): string {
if (!hasOwnProperty.call(this._languages, modeId)) {
return null;
......
......@@ -46,5 +46,6 @@ export interface IModeService {
getMode(commaSeparatedMimetypesOrCommaSeparatedIds: string): IMode;
getOrCreateMode(commaSeparatedMimetypesOrCommaSeparatedIds: string): TPromise<IMode>;
getOrCreateModeByLanguageName(languageName: string): TPromise<IMode>;
getOrCreateModeByLanguageId(modeId: string): TPromise<IMode>;
getOrCreateModeByFilenameOrFirstLine(filename: string, firstLine?: string): TPromise<IMode>;
}
......@@ -132,6 +132,15 @@ export class ModeServiceImpl implements IModeService {
});
}
public getOrCreateModeByLanguageId(modeId: string): TPromise<IMode> {
return this._onReady().then(() => {
if (!this._registry.isRegisteredModeExact(modeId)) {
modeId = 'plaintext';
}
return this._getOrCreateMode(modeId);
});
}
private _getModeIdByLanguageName(languageName: string): string {
const modeIds = this._registry.getModeIdsFromLanguageName(languageName);
......
......@@ -1119,6 +1119,21 @@ declare module 'vscode' {
*/
edit(callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable<boolean>;
/**
* Change document language by Id
*
* @param languageId new language identifier
*/
setLanguageById(languageId: string): void;
/**
* Change document language by Name
*
* @param languageName new language name
*/
setLanguageByName(languageName: string): void;
/**
* Insert a [snippet](#SnippetString) and put the editor into snippet mode. "Snippet mode"
* means the editor adds placeholders and additional cursors so that the user can complete
......@@ -1141,6 +1156,7 @@ declare module 'vscode' {
* @param decorationType A decoration type.
* @param rangesOrOptions Either [ranges](#Range) or more detailed [options](#DecorationOptions).
*/
setDecorations(decorationType: TextEditorDecorationType, rangesOrOptions: Range[] | DecorationOptions[]): void;
/**
......@@ -7375,6 +7391,8 @@ declare module 'vscode' {
*/
export namespace languages {
export function setLanguageById(documentUri: Uri, languageId: string): Thenable<void>;
/**
* Return the identifiers of all known languages.
* @return Promise resolving to an array of identifier strings.
......
......@@ -179,14 +179,18 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape {
if (!mainThreadEditor) {
return TPromise.wrapError(disposed(`TextEditor(${id})`));
}
let textModel = mainThreadEditor.getModel();
let modelService = this._modelService;
let modeService = this._modeService;
if (!modelService || !modeService) {
return TPromise.wrapError(new Error('modeService is null for some unit tests'));
let mode = this._modeService.getOrCreateModeByLanguageId(languageId);
this._modelService.setMode(mainThreadEditor.getModel(), mode);
return TPromise.as(null);
}
$trySetLanguageByName(id: string, languageName: string): TPromise<void> {
let mainThreadEditor = this._documentsAndEditors.getEditor(id);
if (!mainThreadEditor) {
return TPromise.wrapError(disposed(`TextEditor(${id})`));
}
let mode = modeService.getOrCreateModeByLanguageName(languageId);
modelService.setMode(textModel, mode);
let mode = this._modeService.getOrCreateModeByLanguageName(languageName);
this._modelService.setMode(mainThreadEditor.getModel(), mode);
return TPromise.as(null);
}
......
......@@ -5,7 +5,9 @@
'use strict';
import { TPromise } from 'vs/base/common/winjs.base';
import URI, { UriComponents } from 'vs/base/common/uri';
import { IModeService } from 'vs/editor/common/services/modeService';
import { IModelService } from 'vs/editor/common/services/modelService';
import { MainThreadLanguagesShape, MainContext, IExtHostContext } from '../node/extHost.protocol';
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
......@@ -13,12 +15,15 @@ import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostC
export class MainThreadLanguages implements MainThreadLanguagesShape {
private _modeService: IModeService;
private _modelService: IModelService;
constructor(
extHostContext: IExtHostContext,
@IModeService modeService: IModeService
@IModeService modeService: IModeService,
@IModelService modelService: IModelService
) {
this._modeService = modeService;
this._modelService = modelService;
}
public dispose(): void {
......@@ -27,4 +32,15 @@ export class MainThreadLanguages implements MainThreadLanguagesShape {
$getLanguages(): TPromise<string[]> {
return TPromise.as(this._modeService.getRegisteredModes());
}
$setLanguageById(resource: UriComponents, languageId: string): TPromise<void> {
const uri = URI.revive(resource);
let model = this._modelService.getModel(uri);
if (!model) {
return TPromise.wrapError(new Error('Invalid uri'));
}
let mode = this._modeService.getOrCreateModeByLanguageId(languageId);
this._modelService.setMode(model, mode);
return TPromise.as(null);
}
}
......@@ -258,6 +258,9 @@ export function createApiFactory(
getLanguages(): TPromise<string[]> {
return extHostLanguages.getLanguages();
},
setLanguageById(documentUri: vscode.Uri, languageId: string): TPromise<void> {
return extHostLanguages.setLanguageById(documentUri, languageId);
},
match(selector: vscode.DocumentSelector, document: vscode.TextDocument): number {
return score(typeConverters.LanguageSelector.from(selector), document.uri, document.languageId, true);
},
......
......@@ -194,6 +194,7 @@ export interface MainThreadTextEditorsShape extends IDisposable {
$tryHideEditor(id: string): TPromise<void>;
$trySetOptions(id: string, options: ITextEditorConfigurationUpdate): TPromise<void>;
$trySetLanguageById(id: string, languageId: string): TPromise<void>;
$trySetLanguageByName(id: string, languageName: string): TPromise<void>;
$trySetDecorations(id: string, key: string, ranges: editorCommon.IDecorationOptions[]): TPromise<void>;
$trySetDecorationsFast(id: string, key: string, ranges: number[]): TPromise<void>;
$tryRevealRange(id: string, range: IRange, revealType: TextEditorRevealType): TPromise<void>;
......@@ -288,6 +289,7 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable {
export interface MainThreadLanguagesShape extends IDisposable {
$getLanguages(): TPromise<string[]>;
$setLanguageById(resource: UriComponents, languageId: string): TPromise<void>;
}
export interface MainThreadMessageOptions {
......
......@@ -6,6 +6,7 @@
import { TPromise } from 'vs/base/common/winjs.base';
import { MainContext, MainThreadLanguagesShape, IMainContext } from './extHost.protocol';
import * as vscode from 'vscode';
export class ExtHostLanguages {
......@@ -20,4 +21,7 @@ export class ExtHostLanguages {
getLanguages(): TPromise<string[]> {
return this._proxy.$getLanguages();
}
setLanguageById(documentUri: vscode.Uri, languageId: string): TPromise<void> {
return this._proxy.$setLanguageById(documentUri, languageId);
}
}
......@@ -435,8 +435,12 @@ export class ExtHostTextEditor implements vscode.TextEditor {
this._trySetSelection();
}
setLanguageById(language_id: string): void {
this._runOnProxy(() => this._proxy.$trySetLanguageById(this._id, language_id));
setLanguageById(languageId: string): void {
this._runOnProxy(() => this._proxy.$trySetLanguageById(this._id, languageId));
}
setLanguageByName(languageName: string): void {
this._runOnProxy(() => this._proxy.$trySetLanguageByName(this._id, languageName));
}
setDecorations(decorationType: vscode.TextEditorDecorationType, ranges: Range[] | vscode.DecorationOptions[]): void {
......
......@@ -61,6 +61,7 @@ suite('ExtHostTextEditorOptions', () => {
$tryShowEditor: undefined,
$tryHideEditor: undefined,
$trySetLanguageById: undefined,
$trySetLanguageByName: undefined,
$trySetDecorations: undefined,
$trySetDecorationsFast: undefined,
$tryRevealRange: undefined,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册