extHostTypeConverters.ts 21.4 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5 6 7
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';

import Severity from 'vs/base/common/severity';
8
import * as modes from 'vs/editor/common/modes';
9
import * as types from './extHostTypes';
10
import { Position as EditorPosition, ITextEditorOptions } from 'vs/platform/editor/common/editor';
11
import { IDecorationOptions } from 'vs/editor/common/editorCommon';
A
Alex Dima 已提交
12
import { EndOfLineSequence } from 'vs/editor/common/model';
J
Johannes Rieken 已提交
13
import * as vscode from 'vscode';
14
import URI from 'vs/base/common/uri';
J
Johannes Rieken 已提交
15
import { ProgressLocation as MainProgressLocation } from 'vs/platform/progress/common/progress';
16
import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles';
17 18 19
import { IPosition } from 'vs/editor/common/core/position';
import { IRange } from 'vs/editor/common/core/range';
import { ISelection } from 'vs/editor/common/core/selection';
20
import * as htmlContent from 'vs/base/common/htmlContent';
21
import { IRelativePattern } from 'vs/base/common/glob';
22
import { LanguageSelector, LanguageFilter } from 'vs/editor/common/modes/languageSelector';
23
import { WorkspaceEditDto, ResourceTextEditDto } from 'vs/workbench/api/node/extHost.protocol';
E
Erich Gamma 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

export interface PositionLike {
	line: number;
	character: number;
}

export interface RangeLike {
	start: PositionLike;
	end: PositionLike;
}

export interface SelectionLike extends RangeLike {
	anchor: PositionLike;
	active: PositionLike;
}

40
export function toSelection(selection: ISelection): types.Selection {
41
	let { selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn } = selection;
42 43 44
	let start = new types.Position(selectionStartLineNumber - 1, selectionStartColumn - 1);
	let end = new types.Position(positionLineNumber - 1, positionColumn - 1);
	return new types.Selection(start, end);
E
Erich Gamma 已提交
45 46 47
}

export function fromSelection(selection: SelectionLike): ISelection {
48
	let { anchor, active } = selection;
E
Erich Gamma 已提交
49 50 51 52 53 54 55 56 57
	return {
		selectionStartLineNumber: anchor.line + 1,
		selectionStartColumn: anchor.character + 1,
		positionLineNumber: active.line + 1,
		positionColumn: active.character + 1
	};
}

export function fromRange(range: RangeLike): IRange {
J
Johannes Rieken 已提交
58 59 60
	if (!range) {
		return undefined;
	}
61
	let { start, end } = range;
E
Erich Gamma 已提交
62 63 64 65 66 67 68 69
	return {
		startLineNumber: start.line + 1,
		startColumn: start.character + 1,
		endLineNumber: end.line + 1,
		endColumn: end.character + 1
	};
}

70
export function toRange(range: IRange): types.Range {
J
Johannes Rieken 已提交
71 72 73
	if (!range) {
		return undefined;
	}
74
	let { startLineNumber, startColumn, endLineNumber, endColumn } = range;
75
	return new types.Range(startLineNumber - 1, startColumn - 1, endLineNumber - 1, endColumn - 1);
E
Erich Gamma 已提交
76 77
}

78 79
export function toPosition(position: IPosition): types.Position {
	return new types.Position(position.lineNumber - 1, position.column - 1);
E
Erich Gamma 已提交
80 81
}

82 83
export function fromPosition(position: types.Position): IPosition {
	return { lineNumber: position.line + 1, column: position.character + 1 };
84 85
}

E
Erich Gamma 已提交
86 87
export function fromDiagnosticSeverity(value: number): Severity {
	switch (value) {
88
		case types.DiagnosticSeverity.Error:
E
Erich Gamma 已提交
89
			return Severity.Error;
90
		case types.DiagnosticSeverity.Warning:
E
Erich Gamma 已提交
91
			return Severity.Warning;
92
		case types.DiagnosticSeverity.Information:
E
Erich Gamma 已提交
93
			return Severity.Info;
94
		case types.DiagnosticSeverity.Hint:
E
Erich Gamma 已提交
95 96 97 98 99
			return Severity.Ignore;
	}
	return Severity.Error;
}

100
export function toDiagnosticSeverty(value: Severity): types.DiagnosticSeverity {
E
Erich Gamma 已提交
101 102
	switch (value) {
		case Severity.Info:
103
			return types.DiagnosticSeverity.Information;
E
Erich Gamma 已提交
104
		case Severity.Warning:
105
			return types.DiagnosticSeverity.Warning;
E
Erich Gamma 已提交
106
		case Severity.Error:
107
			return types.DiagnosticSeverity.Error;
E
Erich Gamma 已提交
108
		case Severity.Ignore:
109
			return types.DiagnosticSeverity.Hint;
E
Erich Gamma 已提交
110
	}
111
	return types.DiagnosticSeverity.Error;
E
Erich Gamma 已提交
112 113 114
}

export function fromViewColumn(column?: vscode.ViewColumn): EditorPosition {
B
Benjamin Pasero 已提交
115
	let editorColumn = EditorPosition.ONE;
E
Erich Gamma 已提交
116
	if (typeof column !== 'number') {
B
Benjamin Pasero 已提交
117
		// stick with ONE
118
	} else if (column === <number>types.ViewColumn.Two) {
B
Benjamin Pasero 已提交
119
		editorColumn = EditorPosition.TWO;
120
	} else if (column === <number>types.ViewColumn.Three) {
B
Benjamin Pasero 已提交
121
		editorColumn = EditorPosition.THREE;
122 123
	} else if (column === <number>types.ViewColumn.Active) {
		editorColumn = undefined;
E
Erich Gamma 已提交
124 125 126 127
	}
	return editorColumn;
}

128 129
export function toViewColumn(position?: EditorPosition): vscode.ViewColumn {
	if (typeof position !== 'number') {
M
Matt Bierner 已提交
130
		return undefined;
131
	}
B
Benjamin Pasero 已提交
132
	if (position === EditorPosition.ONE) {
133
		return <number>types.ViewColumn.One;
B
Benjamin Pasero 已提交
134
	} else if (position === EditorPosition.TWO) {
135
		return <number>types.ViewColumn.Two;
B
Benjamin Pasero 已提交
136
	} else if (position === EditorPosition.THREE) {
137
		return <number>types.ViewColumn.Three;
138
	}
M
Matt Bierner 已提交
139
	return undefined;
140
}
E
Erich Gamma 已提交
141

M
Martin Aeschlimann 已提交
142
function isDecorationOptions(something: any): something is vscode.DecorationOptions {
143
	return (typeof something.range !== 'undefined');
E
Erich Gamma 已提交
144 145
}

146
export function isDecorationOptionsArr(something: vscode.Range[] | vscode.DecorationOptions[]): something is vscode.DecorationOptions[] {
E
Erich Gamma 已提交
147 148 149
	if (something.length === 0) {
		return true;
	}
M
Martin Aeschlimann 已提交
150
	return isDecorationOptions(something[0]) ? true : false;
E
Erich Gamma 已提交
151 152
}

153 154 155 156 157 158
export namespace MarkdownString {

	export function fromMany(markup: (vscode.MarkdownString | vscode.MarkedString)[]): htmlContent.IMarkdownString[] {
		return markup.map(MarkdownString.from);
	}

J
Johannes Rieken 已提交
159 160 161 162 163 164
	interface Codeblock {
		language: string;
		value: string;
	}

	function isCodeblock(thing: any): thing is Codeblock {
J
Johannes Rieken 已提交
165
		return thing && typeof thing === 'object'
J
Johannes Rieken 已提交
166 167 168 169
			&& typeof (<Codeblock>thing).language === 'string'
			&& typeof (<Codeblock>thing).value === 'string';
	}

170
	export function from(markup: vscode.MarkdownString | vscode.MarkedString): htmlContent.IMarkdownString {
J
Johannes Rieken 已提交
171 172 173 174
		if (isCodeblock(markup)) {
			const { language, value } = markup;
			return { value: '```' + language + '\n' + value + '\n```\n' };
		} else if (htmlContent.isMarkdownString(markup)) {
175
			return markup;
J
Johannes Rieken 已提交
176
		} else if (typeof markup === 'string') {
177
			return { value: <string>markup };
178
		} else {
J
Johannes Rieken 已提交
179
			return { value: '' };
180 181
		}
	}
182 183 184 185
	export function to(value: htmlContent.IMarkdownString): vscode.MarkdownString {
		const ret = new htmlContent.MarkdownString(value.value);
		ret.isTrusted = value.isTrusted;
		return ret;
186
	}
187 188 189 190 191 192 193

	export function fromStrict(value: string | types.MarkdownString): undefined | string | htmlContent.IMarkdownString {
		if (!value) {
			return undefined;
		}
		return typeof value === 'string' ? value : MarkdownString.from(value);
	}
194 195
}

196
export function fromRangeOrRangeWithMessage(ranges: vscode.Range[] | vscode.DecorationOptions[]): IDecorationOptions[] {
M
Martin Aeschlimann 已提交
197
	if (isDecorationOptionsArr(ranges)) {
198
		return ranges.map(r => {
E
Erich Gamma 已提交
199 200
			return {
				range: fromRange(r.range),
201
				hoverMessage: Array.isArray(r.hoverMessage) ? MarkdownString.fromMany(r.hoverMessage) : r.hoverMessage && MarkdownString.from(r.hoverMessage),
202
				renderOptions: <any> /* URI vs Uri */r.renderOptions
E
Erich Gamma 已提交
203 204 205
			};
		});
	} else {
M
Martin Aeschlimann 已提交
206
		return ranges.map((r): IDecorationOptions => {
E
Erich Gamma 已提交
207 208
			return {
				range: fromRange(r)
B
Benjamin Pasero 已提交
209
			};
E
Erich Gamma 已提交
210 211 212
		});
	}
}
213

214
export const TextEdit = {
215

J
Johannes Rieken 已提交
216 217
	from(edit: vscode.TextEdit): modes.TextEdit {
		return <modes.TextEdit>{
218
			text: edit.newText,
J
Johannes Rieken 已提交
219
			eol: EndOfLine.from(edit.newEol),
220
			range: fromRange(edit.range)
B
Benjamin Pasero 已提交
221
		};
222
	},
J
Johannes Rieken 已提交
223 224 225 226
	to(edit: modes.TextEdit): vscode.TextEdit {
		let result = new types.TextEdit(toRange(edit.range), edit.text);
		result.newEol = EndOfLine.to(edit.eol);
		return result;
227
	}
B
Benjamin Pasero 已提交
228
};
229

230 231
export namespace WorkspaceEdit {
	export function from(value: vscode.WorkspaceEdit): modes.WorkspaceEdit {
232
		const result: modes.WorkspaceEdit = {
233
			edits: []
234
		};
235
		for (const entry of value.entries()) {
236 237 238 239 240 241 242
			const [uri, uriOrEdits] = entry;
			if (Array.isArray(uriOrEdits)) {
				// text edits
				result.edits.push({ resource: uri, edits: uriOrEdits.map(TextEdit.from) });
			} else {
				// resource edits
				result.edits.push({ oldUri: uri, newUri: uriOrEdits });
243 244 245 246 247
			}
		}
		return result;
	}

248
	export function to(value: WorkspaceEditDto) {
249 250
		const result = new types.WorkspaceEdit();
		for (const edit of value.edits) {
251 252 253 254 255
			if (Array.isArray((<ResourceTextEditDto>edit).edits)) {
				result.set(
					URI.revive((<ResourceTextEditDto>edit).resource),
					<types.TextEdit[]>(<ResourceTextEditDto>edit).edits.map(TextEdit.to)
				);
256 257 258 259 260
				// } else {
				// 	result.renameResource(
				// 		URI.revive((<ResourceFileEditDto>edit).oldUri),
				// 		URI.revive((<ResourceFileEditDto>edit).newUri)
				// 	);
261
			}
262 263 264
		}
		return result;
	}
265 266
}

267

268 269 270
export namespace SymbolKind {

	const _fromMapping: { [kind: number]: modes.SymbolKind } = Object.create(null);
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
	_fromMapping[types.SymbolKind.File] = modes.SymbolKind.File;
	_fromMapping[types.SymbolKind.Module] = modes.SymbolKind.Module;
	_fromMapping[types.SymbolKind.Namespace] = modes.SymbolKind.Namespace;
	_fromMapping[types.SymbolKind.Package] = modes.SymbolKind.Package;
	_fromMapping[types.SymbolKind.Class] = modes.SymbolKind.Class;
	_fromMapping[types.SymbolKind.Method] = modes.SymbolKind.Method;
	_fromMapping[types.SymbolKind.Property] = modes.SymbolKind.Property;
	_fromMapping[types.SymbolKind.Field] = modes.SymbolKind.Field;
	_fromMapping[types.SymbolKind.Constructor] = modes.SymbolKind.Constructor;
	_fromMapping[types.SymbolKind.Enum] = modes.SymbolKind.Enum;
	_fromMapping[types.SymbolKind.Interface] = modes.SymbolKind.Interface;
	_fromMapping[types.SymbolKind.Function] = modes.SymbolKind.Function;
	_fromMapping[types.SymbolKind.Variable] = modes.SymbolKind.Variable;
	_fromMapping[types.SymbolKind.Constant] = modes.SymbolKind.Constant;
	_fromMapping[types.SymbolKind.String] = modes.SymbolKind.String;
	_fromMapping[types.SymbolKind.Number] = modes.SymbolKind.Number;
	_fromMapping[types.SymbolKind.Boolean] = modes.SymbolKind.Boolean;
	_fromMapping[types.SymbolKind.Array] = modes.SymbolKind.Array;
	_fromMapping[types.SymbolKind.Object] = modes.SymbolKind.Object;
	_fromMapping[types.SymbolKind.Key] = modes.SymbolKind.Key;
	_fromMapping[types.SymbolKind.Null] = modes.SymbolKind.Null;
	_fromMapping[types.SymbolKind.EnumMember] = modes.SymbolKind.EnumMember;
	_fromMapping[types.SymbolKind.Struct] = modes.SymbolKind.Struct;
294 295
	_fromMapping[types.SymbolKind.Event] = modes.SymbolKind.Event;
	_fromMapping[types.SymbolKind.Operator] = modes.SymbolKind.Operator;
296
	_fromMapping[types.SymbolKind.TypeParameter] = modes.SymbolKind.TypeParameter;
297 298

	export function from(kind: vscode.SymbolKind): modes.SymbolKind {
299
		return _fromMapping[kind] || modes.SymbolKind.Property;
300 301
	}

302 303 304 305
	export function to(kind: modes.SymbolKind): vscode.SymbolKind {
		for (let k in _fromMapping) {
			if (_fromMapping[k] === kind) {
				return Number(k);
306
			}
307 308
		}
		return types.SymbolKind.Property;
309 310 311
	}
}

312 313
export function fromSymbolInformation(info: vscode.SymbolInformation): modes.SymbolInformation {
	return <modes.SymbolInformation>{
314
		name: info.name,
315
		kind: SymbolKind.from(info.kind),
316
		containerName: info.containerName,
317
		location: location.from(info.location)
318 319 320
	};
}

321 322 323 324
export function toSymbolInformation(bearing: modes.SymbolInformation): types.SymbolInformation {
	return new types.SymbolInformation(
		bearing.name,
		SymbolKind.to(bearing.kind),
325
		bearing.containerName,
326
		location.to(bearing.location)
327
	);
328 329 330
}


331
export const location = {
J
Johannes Rieken 已提交
332
	from(value: vscode.Location): modes.Location {
333
		return {
J
Johannes Rieken 已提交
334
			range: value.range && fromRange(value.range),
J
Johannes Rieken 已提交
335
			uri: value.uri
J
Johannes Rieken 已提交
336
		};
337
	},
338 339
	to(value: modes.Location): types.Location {
		return new types.Location(value.uri, toRange(value.range));
340
	}
J
Johannes Rieken 已提交
341
};
342

343 344
export function fromHover(hover: vscode.Hover): modes.Hover {
	return <modes.Hover>{
345
		range: fromRange(hover.range),
346
		contents: MarkdownString.fromMany(hover.contents)
B
Benjamin Pasero 已提交
347
	};
348 349
}

350
export function toHover(info: modes.Hover): types.Hover {
351
	return new types.Hover(info.contents.map(MarkdownString.to), toRange(info.range));
352 353
}

354 355
export function toDocumentHighlight(occurrence: modes.DocumentHighlight): types.DocumentHighlight {
	return new types.DocumentHighlight(toRange(occurrence.range), occurrence.kind);
356 357
}

M
Matt Bierner 已提交
358 359 360 361 362
export namespace CompletionTriggerKind {
	export function from(kind: modes.SuggestTriggerKind) {
		switch (kind) {
			case modes.SuggestTriggerKind.TriggerCharacter:
				return types.CompletionTriggerKind.TriggerCharacter;
363 364
			case modes.SuggestTriggerKind.TriggerForIncompleteCompletions:
				return types.CompletionTriggerKind.TriggerForIncompleteCompletions;
M
Matt Bierner 已提交
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
			case modes.SuggestTriggerKind.Invoke:
			default:
				return types.CompletionTriggerKind.Invoke;
		}
	}
}

export namespace CompletionContext {
	export function from(context: modes.SuggestContext): types.CompletionContext {
		return {
			triggerKind: CompletionTriggerKind.from(context.triggerKind),
			triggerCharacter: context.triggerCharacter
		};
	}
}

J
Johannes Rieken 已提交
381 382 383 384
export const CompletionItemKind = {

	from(kind: types.CompletionItemKind): modes.SuggestionType {
		switch (kind) {
385
			case types.CompletionItemKind.Method: return 'method';
J
Johannes Rieken 已提交
386 387 388 389 390 391
			case types.CompletionItemKind.Function: return 'function';
			case types.CompletionItemKind.Constructor: return 'constructor';
			case types.CompletionItemKind.Field: return 'field';
			case types.CompletionItemKind.Variable: return 'variable';
			case types.CompletionItemKind.Class: return 'class';
			case types.CompletionItemKind.Interface: return 'interface';
392
			case types.CompletionItemKind.Struct: return 'struct';
J
Johannes Rieken 已提交
393 394 395 396
			case types.CompletionItemKind.Module: return 'module';
			case types.CompletionItemKind.Property: return 'property';
			case types.CompletionItemKind.Unit: return 'unit';
			case types.CompletionItemKind.Value: return 'value';
397
			case types.CompletionItemKind.Constant: return 'constant';
J
Johannes Rieken 已提交
398
			case types.CompletionItemKind.Enum: return 'enum';
399
			case types.CompletionItemKind.EnumMember: return 'enum-member';
J
Johannes Rieken 已提交
400 401 402 403 404 405
			case types.CompletionItemKind.Keyword: return 'keyword';
			case types.CompletionItemKind.Snippet: return 'snippet';
			case types.CompletionItemKind.Text: return 'text';
			case types.CompletionItemKind.Color: return 'color';
			case types.CompletionItemKind.File: return 'file';
			case types.CompletionItemKind.Reference: return 'reference';
406
			case types.CompletionItemKind.Folder: return 'folder';
407 408
			case types.CompletionItemKind.Event: return 'event';
			case types.CompletionItemKind.Operator: return 'operator';
409
			case types.CompletionItemKind.TypeParameter: return 'type-parameter';
J
Johannes Rieken 已提交
410
		}
411
		return 'property';
J
Johannes Rieken 已提交
412 413 414 415
	},

	to(type: modes.SuggestionType): types.CompletionItemKind {
		if (!type) {
416
			return types.CompletionItemKind.Property;
J
Johannes Rieken 已提交
417 418 419 420 421 422
		} else {
			return types.CompletionItemKind[type.charAt(0).toUpperCase() + type.substr(1)];
		}
	}
};

423
export namespace Suggest {
424

425
	export function to(position: types.Position, suggestion: modes.ISuggestion): types.CompletionItem {
426
		const result = new types.CompletionItem(suggestion.label);
427
		result.insertText = suggestion.insertText;
J
Johannes Rieken 已提交
428
		result.kind = CompletionItemKind.to(suggestion.type);
429
		result.detail = suggestion.detail;
430
		result.documentation = htmlContent.isMarkdownString(suggestion.documentation) ? MarkdownString.to(suggestion.documentation) : suggestion.documentation;
431 432
		result.sortText = suggestion.sortText;
		result.filterText = suggestion.filterText;
433

434
		// 'overwrite[Before|After]'-logic
435
		let overwriteBefore = (typeof suggestion.overwriteBefore === 'number') ? suggestion.overwriteBefore : 0;
M
Martin Aeschlimann 已提交
436 437 438
		let startPosition = new types.Position(position.line, Math.max(0, position.character - overwriteBefore));
		let endPosition = position;
		if (typeof suggestion.overwriteAfter === 'number') {
439 440
			endPosition = new types.Position(position.line, position.character + suggestion.overwriteAfter);
		}
441 442 443 444 445 446 447 448 449 450 451
		result.range = new types.Range(startPosition, endPosition);

		// 'inserText'-logic
		if (suggestion.snippetType === 'textmate') {
			result.insertText = new types.SnippetString(suggestion.insertText);
		} else {
			result.insertText = suggestion.insertText;
			result.textEdit = new types.TextEdit(result.range, result.insertText);
		}

		// TODO additionalEdits, command
452

453 454
		return result;
	}
455
}
456

457 458 459 460
export namespace ParameterInformation {
	export function from(info: types.ParameterInformation): modes.ParameterInformation {
		return {
			label: info.label,
461
			documentation: MarkdownString.fromStrict(info.documentation)
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
		};
	}
	export function to(info: modes.ParameterInformation): types.ParameterInformation {
		return {
			label: info.label,
			documentation: htmlContent.isMarkdownString(info.documentation) ? MarkdownString.to(info.documentation) : info.documentation
		};
	}
}

export namespace SignatureInformation {

	export function from(info: types.SignatureInformation): modes.SignatureInformation {
		return {
			label: info.label,
477
			documentation: MarkdownString.fromStrict(info.documentation),
478 479 480 481 482 483 484 485 486 487 488 489
			parameters: info.parameters && info.parameters.map(ParameterInformation.from)
		};
	}

	export function to(info: modes.SignatureInformation): types.SignatureInformation {
		return {
			label: info.label,
			documentation: htmlContent.isMarkdownString(info.documentation) ? MarkdownString.to(info.documentation) : info.documentation,
			parameters: info.parameters && info.parameters.map(ParameterInformation.to)
		};
	}
}
490

491 492
export namespace SignatureHelp {

493 494 495 496 497 498
	export function from(help: types.SignatureHelp): modes.SignatureHelp {
		return {
			activeSignature: help.activeSignature,
			activeParameter: help.activeParameter,
			signatures: help.signatures && help.signatures.map(SignatureInformation.from)
		};
499 500
	}

501 502 503 504 505 506
	export function to(help: modes.SignatureHelp): types.SignatureHelp {
		return {
			activeSignature: help.activeSignature,
			activeParameter: help.activeParameter,
			signatures: help.signatures && help.signatures.map(SignatureInformation.to)
		};
507
	}
J
Johannes Rieken 已提交
508 509
}

J
Johannes Rieken 已提交
510 511
export namespace DocumentLink {

512
	export function from(link: vscode.DocumentLink): modes.ILink {
J
Johannes Rieken 已提交
513 514
		return {
			range: fromRange(link.range),
515
			url: link.target && link.target.toString()
J
Johannes Rieken 已提交
516 517 518
		};
	}

519
	export function to(link: modes.ILink): vscode.DocumentLink {
520
		return new types.DocumentLink(toRange(link.range), link.url && URI.parse(link.url));
J
Johannes Rieken 已提交
521 522
	}
}
523

524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
export namespace ColorPresentation {
	export function to(colorPresentation: modes.IColorPresentation): vscode.ColorPresentation {
		return {
			label: colorPresentation.label,
			textEdit: colorPresentation.textEdit ? TextEdit.to(colorPresentation.textEdit) : undefined,
			additionalTextEdits: colorPresentation.additionalTextEdits ? colorPresentation.additionalTextEdits.map(value => TextEdit.to(value)) : undefined
		};
	}

	export function from(colorPresentation: vscode.ColorPresentation): modes.IColorPresentation {
		return {
			label: colorPresentation.label,
			textEdit: colorPresentation.textEdit ? TextEdit.from(colorPresentation.textEdit) : undefined,
			additionalTextEdits: colorPresentation.additionalTextEdits ? colorPresentation.additionalTextEdits.map(value => TextEdit.from(value)) : undefined
		};
	}
}

542 543 544 545 546
export namespace TextDocumentSaveReason {

	export function to(reason: SaveReason): vscode.TextDocumentSaveReason {
		switch (reason) {
			case SaveReason.AUTO:
547
				return types.TextDocumentSaveReason.AfterDelay;
548
			case SaveReason.EXPLICIT:
549
				return types.TextDocumentSaveReason.Manual;
550 551 552 553 554
			case SaveReason.FOCUS_CHANGE:
			case SaveReason.WINDOW_CHANGE:
				return types.TextDocumentSaveReason.FocusOut;
		}
	}
555
}
556 557


558 559 560 561 562 563 564 565 566
export namespace EndOfLine {

	export function from(eol: vscode.EndOfLine): EndOfLineSequence {
		if (eol === types.EndOfLine.CRLF) {
			return EndOfLineSequence.CRLF;
		} else if (eol === types.EndOfLine.LF) {
			return EndOfLineSequence.LF;
		}
		return undefined;
567
	}
J
Johannes Rieken 已提交
568 569 570 571 572 573 574 575 576

	export function to(eol: EndOfLineSequence): vscode.EndOfLine {
		if (eol === EndOfLineSequence.CRLF) {
			return types.EndOfLine.CRLF;
		} else if (eol === EndOfLineSequence.LF) {
			return types.EndOfLine.LF;
		}
		return undefined;
	}
577 578
}

J
Johannes Rieken 已提交
579 580 581
export namespace ProgressLocation {
	export function from(loc: vscode.ProgressLocation): MainProgressLocation {
		switch (loc) {
582
			case types.ProgressLocation.SourceControl: return MainProgressLocation.Scm;
J
Johannes Rieken 已提交
583 584 585 586 587
			case types.ProgressLocation.Window: return MainProgressLocation.Window;
		}
		return undefined;
	}
}
588

589 590 591
export namespace FoldingRangeList {
	export function from(rangeList: vscode.FoldingRangeList): modes.IFoldingRangeList {
		return {
592
			ranges: rangeList.ranges.map(r => ({ startLineNumber: r.startLine + 1, endLineNumber: r.endLine + 1, type: r.type }))
593 594 595 596
		};
	}
}

597 598 599 600 601 602 603 604 605 606
export function toTextEditorOptions(options?: vscode.TextDocumentShowOptions): ITextEditorOptions {
	if (options) {
		return {
			pinned: typeof options.preview === 'boolean' ? !options.preview : undefined,
			preserveFocus: options.preserveFocus,
			selection: typeof options.selection === 'object' ? fromRange(options.selection) : undefined
		} as ITextEditorOptions;
	}

	return undefined;
607 608 609 610 611 612 613
}

export function toGlobPattern(pattern: vscode.GlobPattern): string | IRelativePattern {
	if (typeof pattern === 'string') {
		return pattern;
	}

J
Johannes Rieken 已提交
614 615
	if (isRelativePattern(pattern)) {
		return new types.RelativePattern(pattern.base, pattern.pattern);
616 617
	}

J
Johannes Rieken 已提交
618
	return pattern; // preserve `undefined` and `null`
619 620
}

621 622 623 624 625 626
function isRelativePattern(obj: any): obj is vscode.RelativePattern {
	const rp = obj as vscode.RelativePattern;

	return rp && typeof rp.base === 'string' && typeof rp.pattern === 'string';
}

627 628 629 630 631 632 633 634 635 636 637 638 639
export function toLanguageSelector(selector: vscode.DocumentSelector): LanguageSelector {
	if (Array.isArray(selector)) {
		return selector.map(sel => doToLanguageSelector(sel));
	}

	return doToLanguageSelector(selector);
}

function doToLanguageSelector(selector: string | vscode.DocumentFilter): string | LanguageFilter {
	if (typeof selector === 'string') {
		return selector;
	}

640 641 642 643 644 645 646 647 648
	if (selector) {
		return {
			language: selector.language,
			scheme: selector.scheme,
			pattern: toGlobPattern(selector.pattern)
		};
	}

	return undefined;
649
}