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

6
import * as modes from 'vs/editor/common/modes';
7
import * as types from './extHostTypes';
8
import * as search from 'vs/workbench/contrib/search/common/search';
9
import { ITextEditorOptions } from 'vs/platform/editor/common/editor';
10
import { EditorViewColumn } from 'vs/workbench/api/common/shared/editor';
A
Alex Dima 已提交
11 12
import { IDecorationOptions, IThemeDecorationRenderOptions, IDecorationRenderOptions, IContentDecorationRenderOptions } from 'vs/editor/common/editorCommon';
import { EndOfLineSequence, TrackedRangeStickiness } from 'vs/editor/common/model';
13
import type * as vscode from 'vscode';
J
Johannes Rieken 已提交
14
import { URI, UriComponents } from 'vs/base/common/uri';
15
import { ProgressLocation as MainProgressLocation } from 'vs/platform/progress/common/progress';
16
import { SaveReason } from 'vs/workbench/common/editor';
17
import { IPosition } from 'vs/editor/common/core/position';
J
Johannes Rieken 已提交
18
import * as editorRange from 'vs/editor/common/core/range';
19
import { ISelection } from 'vs/editor/common/core/selection';
20
import * as htmlContent from 'vs/base/common/htmlContent';
21
import * as languageSelector from 'vs/editor/common/modes/languageSelector';
22
import * as extHostProtocol from 'vs/workbench/api/common/extHost.protocol';
23
import { MarkerSeverity, IRelatedInformation, IMarkerData, MarkerTag } from 'vs/platform/markers/common/markers';
24
import { ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService';
J
Johannes Rieken 已提交
25
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
S
Sandeep Somavarapu 已提交
26
import { isString, isNumber } from 'vs/base/common/types';
J
Johannes Rieken 已提交
27
import * as marked from 'vs/base/common/marked/marked';
J
Johannes Rieken 已提交
28 29
import { parse } from 'vs/base/common/marshalling';
import { cloneAndChange } from 'vs/base/common/objects';
30
import { LogLevel as _MainLogLevel } from 'vs/platform/log/common/log';
31
import { coalesce, isNonEmptyArray } from 'vs/base/common/arrays';
32
import { RenderLineNumbersType } from 'vs/editor/common/config/editorOptions';
33
import { CommandsConverter } from 'vs/workbench/api/common/extHostCommands';
E
Erich Gamma 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

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

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

export interface SelectionLike extends RangeLike {
	anchor: PositionLike;
	active: PositionLike;
}
49
export namespace Selection {
E
Erich Gamma 已提交
50

51
	export function to(selection: ISelection): types.Selection {
M
Matt Bierner 已提交
52 53 54
		const { selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn } = selection;
		const start = new types.Position(selectionStartLineNumber - 1, selectionStartColumn - 1);
		const end = new types.Position(positionLineNumber - 1, positionColumn - 1);
55 56
		return new types.Selection(start, end);
	}
E
Erich Gamma 已提交
57

58
	export function from(selection: SelectionLike): ISelection {
M
Matt Bierner 已提交
59
		const { anchor, active } = selection;
60 61 62 63 64 65 66
		return {
			selectionStartLineNumber: anchor.line + 1,
			selectionStartColumn: anchor.character + 1,
			positionLineNumber: active.line + 1,
			positionColumn: active.character + 1
		};
	}
E
Erich Gamma 已提交
67
}
68
export namespace Range {
E
Erich Gamma 已提交
69

70
	export function from(range: undefined): undefined;
J
Johannes Rieken 已提交
71 72 73
	export function from(range: RangeLike): editorRange.IRange;
	export function from(range: RangeLike | undefined): editorRange.IRange | undefined;
	export function from(range: RangeLike | undefined): editorRange.IRange | undefined {
74 75 76
		if (!range) {
			return undefined;
		}
M
Matt Bierner 已提交
77
		const { start, end } = range;
78 79 80 81 82 83
		return {
			startLineNumber: start.line + 1,
			startColumn: start.character + 1,
			endLineNumber: end.line + 1,
			endColumn: end.character + 1
		};
J
Johannes Rieken 已提交
84
	}
E
Erich Gamma 已提交
85

86
	export function to(range: undefined): types.Range;
J
Johannes Rieken 已提交
87 88 89
	export function to(range: editorRange.IRange): types.Range;
	export function to(range: editorRange.IRange | undefined): types.Range | undefined;
	export function to(range: editorRange.IRange | undefined): types.Range | undefined {
90 91 92
		if (!range) {
			return undefined;
		}
M
Matt Bierner 已提交
93
		const { startLineNumber, startColumn, endLineNumber, endColumn } = range;
94
		return new types.Range(startLineNumber - 1, startColumn - 1, endLineNumber - 1, endColumn - 1);
J
Johannes Rieken 已提交
95
	}
E
Erich Gamma 已提交
96 97
}

98 99 100 101 102 103 104
export namespace Position {
	export function to(position: IPosition): types.Position {
		return new types.Position(position.lineNumber - 1, position.column - 1);
	}
	export function from(position: types.Position): IPosition {
		return { lineNumber: position.line + 1, column: position.character + 1 };
	}
105 106
}

107
export namespace DiagnosticTag {
108
	export function from(value: vscode.DiagnosticTag): MarkerTag | undefined {
109 110 111
		switch (value) {
			case types.DiagnosticTag.Unnecessary:
				return MarkerTag.Unnecessary;
112 113
			case types.DiagnosticTag.Deprecated:
				return MarkerTag.Deprecated;
114 115 116
		}
		return undefined;
	}
J
Johannes Rieken 已提交
117 118 119 120 121 122 123 124 125
	export function to(value: MarkerTag): vscode.DiagnosticTag | undefined {
		switch (value) {
			case MarkerTag.Unnecessary:
				return types.DiagnosticTag.Unnecessary;
			case MarkerTag.Deprecated:
				return types.DiagnosticTag.Deprecated;
		}
		return undefined;
	}
126 127
}

128 129
export namespace Diagnostic {
	export function from(value: vscode.Diagnostic): IMarkerData {
P
Pine Wu 已提交
130 131 132 133 134 135 136 137 138 139 140
		let code: string | { value: string; target: URI } | undefined;

		if (value.code) {
			if (isString(value.code) || isNumber(value.code)) {
				code = String(value.code);
			} else {
				code = {
					value: String(value.code.value),
					target: value.code.target,
				};
			}
141 142
		}

143 144 145 146
		return {
			...Range.from(value.range),
			message: value.message,
			source: value.source,
147
			code,
148
			severity: DiagnosticSeverity.from(value.severity),
149
			relatedInformation: value.relatedInformation && value.relatedInformation.map(DiagnosticRelatedInformation.from),
150
			tags: Array.isArray(value.tags) ? coalesce(value.tags.map(DiagnosticTag.from)) : undefined,
151 152
		};
	}
J
Johannes Rieken 已提交
153 154 155 156

	export function to(value: IMarkerData): vscode.Diagnostic {
		const res = new types.Diagnostic(Range.to(value), value.message, DiagnosticSeverity.to(value.severity));
		res.source = value.source;
157
		res.code = isString(value.code) ? value.code : value.code?.value;
J
Johannes Rieken 已提交
158 159 160 161
		res.relatedInformation = value.relatedInformation && value.relatedInformation.map(DiagnosticRelatedInformation.to);
		res.tags = value.tags && coalesce(value.tags.map(DiagnosticTag.to));
		return res;
	}
162 163
}

164
export namespace DiagnosticRelatedInformation {
165
	export function from(value: vscode.DiagnosticRelatedInformation): IRelatedInformation {
166 167 168 169 170 171 172 173
		return {
			...Range.from(value.location.range),
			message: value.message,
			resource: value.location.uri
		};
	}
	export function to(value: IRelatedInformation): types.DiagnosticRelatedInformation {
		return new types.DiagnosticRelatedInformation(new types.Location(value.resource, Range.to(value)), value.message);
E
Erich Gamma 已提交
174 175
	}
}
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
export namespace DiagnosticSeverity {

	export function from(value: number): MarkerSeverity {
		switch (value) {
			case types.DiagnosticSeverity.Error:
				return MarkerSeverity.Error;
			case types.DiagnosticSeverity.Warning:
				return MarkerSeverity.Warning;
			case types.DiagnosticSeverity.Information:
				return MarkerSeverity.Info;
			case types.DiagnosticSeverity.Hint:
				return MarkerSeverity.Hint;
		}
		return MarkerSeverity.Error;
	}
E
Erich Gamma 已提交
191

192 193 194 195 196 197 198 199 200 201 202 203
	export function to(value: MarkerSeverity): types.DiagnosticSeverity {
		switch (value) {
			case MarkerSeverity.Info:
				return types.DiagnosticSeverity.Information;
			case MarkerSeverity.Warning:
				return types.DiagnosticSeverity.Warning;
			case MarkerSeverity.Error:
				return types.DiagnosticSeverity.Error;
			case MarkerSeverity.Hint:
				return types.DiagnosticSeverity.Hint;
		}
		return types.DiagnosticSeverity.Error;
E
Erich Gamma 已提交
204 205 206
	}
}

207
export namespace ViewColumn {
208
	export function from(column?: vscode.ViewColumn): EditorViewColumn {
209 210
		if (typeof column === 'number' && column >= types.ViewColumn.One) {
			return column - 1; // adjust zero index (ViewColumn.ONE => 0)
211
		}
212 213 214 215 216 217

		if (column === types.ViewColumn.Beside) {
			return SIDE_GROUP;
		}

		return ACTIVE_GROUP; // default is always the active group
E
Erich Gamma 已提交
218 219
	}

M
Matt Bierner 已提交
220
	export function to(position: EditorViewColumn): vscode.ViewColumn {
221 222
		if (typeof position === 'number' && position >= 0) {
			return position + 1; // adjust to index (ViewColumn.ONE => 1)
223
		}
224

M
Matt Bierner 已提交
225
		throw new Error(`invalid 'EditorViewColumn'`);
226 227
	}
}
E
Erich Gamma 已提交
228

M
Martin Aeschlimann 已提交
229
function isDecorationOptions(something: any): something is vscode.DecorationOptions {
230
	return (typeof something.range !== 'undefined');
E
Erich Gamma 已提交
231 232
}

233
export function isDecorationOptionsArr(something: vscode.Range[] | vscode.DecorationOptions[]): something is vscode.DecorationOptions[] {
E
Erich Gamma 已提交
234 235 236
	if (something.length === 0) {
		return true;
	}
M
Martin Aeschlimann 已提交
237
	return isDecorationOptions(something[0]) ? true : false;
E
Erich Gamma 已提交
238 239
}

240 241 242 243 244 245
export namespace MarkdownString {

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

J
Johannes Rieken 已提交
246 247 248 249 250 251
	interface Codeblock {
		language: string;
		value: string;
	}

	function isCodeblock(thing: any): thing is Codeblock {
J
Johannes Rieken 已提交
252
		return thing && typeof thing === 'object'
J
Johannes Rieken 已提交
253 254 255 256
			&& typeof (<Codeblock>thing).language === 'string'
			&& typeof (<Codeblock>thing).value === 'string';
	}

257
	export function from(markup: vscode.MarkdownString | vscode.MarkedString): htmlContent.IMarkdownString {
258
		let res: htmlContent.IMarkdownString;
J
Johannes Rieken 已提交
259 260
		if (isCodeblock(markup)) {
			const { language, value } = markup;
261
			res = { value: '```' + language + '\n' + value + '\n```\n' };
J
Johannes Rieken 已提交
262
		} else if (htmlContent.isMarkdownString(markup)) {
263
			res = markup;
J
Johannes Rieken 已提交
264
		} else if (typeof markup === 'string') {
M
Matt Bierner 已提交
265
			res = { value: markup };
266
		} else {
267
			res = { value: '' };
268
		}
J
Johannes Rieken 已提交
269

270
		// extract uris into a separate object
271
		const resUris: { [href: string]: UriComponents; } = Object.create(null);
272 273
		res.uris = resUris;

274
		const collectUri = (href: string): string => {
J
Johannes Rieken 已提交
275
			try {
276
				let uri = URI.parse(href, true);
277 278
				uri = uri.with({ query: _uriMassage(uri.query, resUris) });
				resUris[href] = uri;
J
Johannes Rieken 已提交
279 280 281 282 283
			} catch (e) {
				// ignore
			}
			return '';
		};
284 285 286 287
		const renderer = new marked.Renderer();
		renderer.link = collectUri;
		renderer.image = href => collectUri(htmlContent.parseHrefAndDimensions(href).href);

288 289 290
		marked(res.value, { renderer });

		return res;
J
Johannes Rieken 已提交
291 292
	}

293
	function _uriMassage(part: string, bucket: { [n: string]: UriComponents; }): string {
J
Johannes Rieken 已提交
294 295 296 297 298
		if (!part) {
			return part;
		}
		let data: any;
		try {
J
Johannes Rieken 已提交
299
			data = parse(part);
J
Johannes Rieken 已提交
300 301 302 303 304 305
		} catch (e) {
			// ignore
		}
		if (!data) {
			return part;
		}
306
		let changed = false;
J
Johannes Rieken 已提交
307
		data = cloneAndChange(data, value => {
308
			if (URI.isUri(value)) {
309
				const key = `__uri_${Math.random().toString(16).slice(2, 8)}`;
J
Johannes Rieken 已提交
310
				bucket[key] = value;
311
				changed = true;
J
Johannes Rieken 已提交
312 313 314 315 316
				return key;
			} else {
				return undefined;
			}
		});
317 318 319 320 321 322

		if (!changed) {
			return part;
		}

		return JSON.stringify(data);
J
Johannes Rieken 已提交
323 324
	}

325
	export function to(value: htmlContent.IMarkdownString): vscode.MarkdownString {
E
Eric Amodio 已提交
326
		return new htmlContent.MarkdownString(value.value, { isTrusted: value.isTrusted, supportThemeIcons: value.supportThemeIcons });
327
	}
328 329 330 331 332 333 334

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

337
export function fromRangeOrRangeWithMessage(ranges: vscode.Range[] | vscode.DecorationOptions[]): IDecorationOptions[] {
M
Martin Aeschlimann 已提交
338
	if (isDecorationOptionsArr(ranges)) {
339
		return ranges.map((r): IDecorationOptions => {
E
Erich Gamma 已提交
340
			return {
341
				range: Range.from(r.range),
342 343 344
				hoverMessage: Array.isArray(r.hoverMessage)
					? MarkdownString.fromMany(r.hoverMessage)
					: (r.hoverMessage ? MarkdownString.from(r.hoverMessage) : undefined),
345
				renderOptions: <any> /* URI vs Uri */r.renderOptions
E
Erich Gamma 已提交
346 347 348
			};
		});
	} else {
M
Martin Aeschlimann 已提交
349
		return ranges.map((r): IDecorationOptions => {
E
Erich Gamma 已提交
350
			return {
351
				range: Range.from(r)
B
Benjamin Pasero 已提交
352
			};
E
Erich Gamma 已提交
353 354 355
		});
	}
}
356

P
Peng Lyu 已提交
357
export function pathOrURIToURI(value: string | URI): URI {
A
Alex Dima 已提交
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
	if (typeof value === 'undefined') {
		return value;
	}
	if (typeof value === 'string') {
		return URI.file(value);
	} else {
		return value;
	}
}

export namespace ThemableDecorationAttachmentRenderOptions {
	export function from(options: vscode.ThemableDecorationAttachmentRenderOptions): IContentDecorationRenderOptions {
		if (typeof options === 'undefined') {
			return options;
		}
		return {
			contentText: options.contentText,
375
			contentIconPath: options.contentIconPath ? pathOrURIToURI(options.contentIconPath) : undefined,
A
Alex Dima 已提交
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
			border: options.border,
			borderColor: <string | types.ThemeColor>options.borderColor,
			fontStyle: options.fontStyle,
			fontWeight: options.fontWeight,
			textDecoration: options.textDecoration,
			color: <string | types.ThemeColor>options.color,
			backgroundColor: <string | types.ThemeColor>options.backgroundColor,
			margin: options.margin,
			width: options.width,
			height: options.height,
		};
	}
}

export namespace ThemableDecorationRenderOptions {
	export function from(options: vscode.ThemableDecorationRenderOptions): IThemeDecorationRenderOptions {
		if (typeof options === 'undefined') {
			return options;
		}
		return {
			backgroundColor: <string | types.ThemeColor>options.backgroundColor,
			outline: options.outline,
			outlineColor: <string | types.ThemeColor>options.outlineColor,
			outlineStyle: options.outlineStyle,
			outlineWidth: options.outlineWidth,
			border: options.border,
			borderColor: <string | types.ThemeColor>options.borderColor,
			borderRadius: options.borderRadius,
			borderSpacing: options.borderSpacing,
			borderStyle: options.borderStyle,
			borderWidth: options.borderWidth,
			fontStyle: options.fontStyle,
			fontWeight: options.fontWeight,
			textDecoration: options.textDecoration,
			cursor: options.cursor,
			color: <string | types.ThemeColor>options.color,
			opacity: options.opacity,
			letterSpacing: options.letterSpacing,
414
			gutterIconPath: options.gutterIconPath ? pathOrURIToURI(options.gutterIconPath) : undefined,
A
Alex Dima 已提交
415 416
			gutterIconSize: options.gutterIconSize,
			overviewRulerColor: <string | types.ThemeColor>options.overviewRulerColor,
417 418
			before: options.before ? ThemableDecorationAttachmentRenderOptions.from(options.before) : undefined,
			after: options.after ? ThemableDecorationAttachmentRenderOptions.from(options.after) : undefined,
A
Alex Dima 已提交
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444
		};
	}
}

export namespace DecorationRangeBehavior {
	export function from(value: types.DecorationRangeBehavior): TrackedRangeStickiness {
		if (typeof value === 'undefined') {
			return value;
		}
		switch (value) {
			case types.DecorationRangeBehavior.OpenOpen:
				return TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges;
			case types.DecorationRangeBehavior.ClosedClosed:
				return TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges;
			case types.DecorationRangeBehavior.OpenClosed:
				return TrackedRangeStickiness.GrowsOnlyWhenTypingBefore;
			case types.DecorationRangeBehavior.ClosedOpen:
				return TrackedRangeStickiness.GrowsOnlyWhenTypingAfter;
		}
	}
}

export namespace DecorationRenderOptions {
	export function from(options: vscode.DecorationRenderOptions): IDecorationRenderOptions {
		return {
			isWholeLine: options.isWholeLine,
445
			rangeBehavior: options.rangeBehavior ? DecorationRangeBehavior.from(options.rangeBehavior) : undefined,
A
Alex Dima 已提交
446
			overviewRulerLane: options.overviewRulerLane,
447 448
			light: options.light ? ThemableDecorationRenderOptions.from(options.light) : undefined,
			dark: options.dark ? ThemableDecorationRenderOptions.from(options.dark) : undefined,
A
Alex Dima 已提交
449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467

			backgroundColor: <string | types.ThemeColor>options.backgroundColor,
			outline: options.outline,
			outlineColor: <string | types.ThemeColor>options.outlineColor,
			outlineStyle: options.outlineStyle,
			outlineWidth: options.outlineWidth,
			border: options.border,
			borderColor: <string | types.ThemeColor>options.borderColor,
			borderRadius: options.borderRadius,
			borderSpacing: options.borderSpacing,
			borderStyle: options.borderStyle,
			borderWidth: options.borderWidth,
			fontStyle: options.fontStyle,
			fontWeight: options.fontWeight,
			textDecoration: options.textDecoration,
			cursor: options.cursor,
			color: <string | types.ThemeColor>options.color,
			opacity: options.opacity,
			letterSpacing: options.letterSpacing,
468
			gutterIconPath: options.gutterIconPath ? pathOrURIToURI(options.gutterIconPath) : undefined,
A
Alex Dima 已提交
469 470
			gutterIconSize: options.gutterIconSize,
			overviewRulerColor: <string | types.ThemeColor>options.overviewRulerColor,
471 472
			before: options.before ? ThemableDecorationAttachmentRenderOptions.from(options.before) : undefined,
			after: options.after ? ThemableDecorationAttachmentRenderOptions.from(options.after) : undefined,
A
Alex Dima 已提交
473 474 475 476
		};
	}
}

M
Matt Bierner 已提交
477
export namespace TextEdit {
478

M
Matt Bierner 已提交
479
	export function from(edit: vscode.TextEdit): modes.TextEdit {
J
Johannes Rieken 已提交
480
		return <modes.TextEdit>{
481
			text: edit.newText,
J
Johannes Rieken 已提交
482
			eol: edit.newEol && EndOfLine.from(edit.newEol),
483
			range: Range.from(edit.range)
B
Benjamin Pasero 已提交
484
		};
M
Matt Bierner 已提交
485 486 487
	}

	export function to(edit: modes.TextEdit): types.TextEdit {
M
Matt Bierner 已提交
488
		const result = new types.TextEdit(Range.to(edit.range), edit.text);
M
Matt Bierner 已提交
489
		result.newEol = (typeof edit.eol === 'undefined' ? undefined : EndOfLine.to(edit.eol))!;
J
Johannes Rieken 已提交
490
		return result;
491
	}
M
Matt Bierner 已提交
492
}
493

494
export namespace WorkspaceEdit {
495 496
	export function from(value: vscode.WorkspaceEdit, documents?: ExtHostDocumentsAndEditors): extHostProtocol.IWorkspaceEditDto {
		const result: extHostProtocol.IWorkspaceEditDto = {
497
			edits: []
498
		};
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521

		if (value instanceof types.WorkspaceEdit) {
			for (let entry of value.allEntries()) {

				if (entry._type === 1) {
					// file operation
					result.edits.push(<extHostProtocol.IWorkspaceFileEditDto>{
						oldUri: entry.from,
						newUri: entry.to,
						options: entry.options,
						metadata: entry.metadata
					});

				} else {
					// text edits
					const doc = documents?.getDocument(entry.uri);
					result.edits.push(<extHostProtocol.IWorkspaceTextEditDto>{
						resource: entry.uri,
						edit: TextEdit.from(entry.edit),
						modelVersionId: doc?.version,
						metadata: entry.metadata
					});
				}
522 523 524 525 526
			}
		}
		return result;
	}

527
	export function to(value: extHostProtocol.IWorkspaceEditDto) {
528 529
		const result = new types.WorkspaceEdit();
		for (const edit of value.edits) {
530 531 532 533 534
			if ((<extHostProtocol.IWorkspaceTextEditDto>edit).edit) {
				result.replace(
					URI.revive((<extHostProtocol.IWorkspaceTextEditDto>edit).resource),
					Range.to((<extHostProtocol.IWorkspaceTextEditDto>edit).edit.range),
					(<extHostProtocol.IWorkspaceTextEditDto>edit).edit.text
535
				);
J
Johannes Rieken 已提交
536 537
			} else {
				result.renameFile(
538 539 540
					URI.revive((<extHostProtocol.IWorkspaceFileEditDto>edit).oldUri!),
					URI.revive((<extHostProtocol.IWorkspaceFileEditDto>edit).newUri!),
					(<extHostProtocol.IWorkspaceFileEditDto>edit).options
J
Johannes Rieken 已提交
541
				);
542
			}
543 544 545
		}
		return result;
	}
546 547
}

548

549 550
export namespace SymbolKind {

551
	const _fromMapping: { [kind: number]: modes.SymbolKind; } = Object.create(null);
552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
	_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;
575 576
	_fromMapping[types.SymbolKind.Event] = modes.SymbolKind.Event;
	_fromMapping[types.SymbolKind.Operator] = modes.SymbolKind.Operator;
577
	_fromMapping[types.SymbolKind.TypeParameter] = modes.SymbolKind.TypeParameter;
578 579

	export function from(kind: vscode.SymbolKind): modes.SymbolKind {
J
Johannes Rieken 已提交
580
		return typeof _fromMapping[kind] === 'number' ? _fromMapping[kind] : modes.SymbolKind.Property;
581 582
	}

583
	export function to(kind: modes.SymbolKind): vscode.SymbolKind {
M
Matt Bierner 已提交
584
		for (const k in _fromMapping) {
585 586
			if (_fromMapping[k] === kind) {
				return Number(k);
587
			}
588 589
		}
		return types.SymbolKind.Property;
590 591 592
	}
}

593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
export namespace SymbolTag {

	export function from(kind: types.SymbolTag): modes.SymbolTag {
		switch (kind) {
			case types.SymbolTag.Deprecated: return modes.SymbolTag.Deprecated;
		}
	}

	export function to(kind: modes.SymbolTag): types.SymbolTag {
		switch (kind) {
			case modes.SymbolTag.Deprecated: return types.SymbolTag.Deprecated;
		}
	}
}

608 609 610
export namespace WorkspaceSymbol {
	export function from(info: vscode.SymbolInformation): search.IWorkspaceSymbol {
		return <search.IWorkspaceSymbol>{
611 612
			name: info.name,
			kind: SymbolKind.from(info.kind),
613
			tags: info.tags && info.tags.map(SymbolTag.from),
614 615 616 617
			containerName: info.containerName,
			location: location.from(info.location)
		};
	}
618
	export function to(info: search.IWorkspaceSymbol): types.SymbolInformation {
619
		const result = new types.SymbolInformation(
620 621 622 623 624
			info.name,
			SymbolKind.to(info.kind),
			info.containerName,
			location.to(info.location)
		);
625 626
		result.tags = info.tags && info.tags.map(SymbolTag.to);
		return result;
627
	}
628 629
}

630
export namespace DocumentSymbol {
631
	export function from(info: vscode.DocumentSymbol): modes.DocumentSymbol {
M
Matt Bierner 已提交
632
		const result: modes.DocumentSymbol = {
633
			name: info.name || '!!MISSING: name!!',
634
			detail: info.detail,
635 636
			range: Range.from(info.range),
			selectionRange: Range.from(info.selectionRange),
637
			kind: SymbolKind.from(info.kind),
638
			tags: info.tags ? info.tags.map(SymbolTag.from) : []
639 640 641 642 643 644
		};
		if (info.children) {
			result.children = info.children.map(from);
		}
		return result;
	}
645
	export function to(info: modes.DocumentSymbol): vscode.DocumentSymbol {
M
Matt Bierner 已提交
646
		const result = new types.DocumentSymbol(
647
			info.name,
648
			info.detail,
J
Johannes Rieken 已提交
649
			SymbolKind.to(info.kind),
650 651
			Range.to(info.range),
			Range.to(info.selectionRange),
652
		);
653 654 655
		if (isNonEmptyArray(info.tags)) {
			result.tags = info.tags.map(SymbolTag.to);
		}
656
		if (info.children) {
657
			result.children = info.children.map(to) as any;
658 659 660
		}
		return result;
	}
661 662
}

663 664
export namespace CallHierarchyItem {

665 666
	export function to(item: extHostProtocol.ICallHierarchyItemDto): types.CallHierarchyItem {
		const result = new types.CallHierarchyItem(
667 668 669 670 671 672 673
			SymbolKind.to(item.kind),
			item.name,
			item.detail || '',
			URI.revive(item.uri),
			Range.to(item.range),
			Range.to(item.selectionRange)
		);
674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698

		result._sessionId = item._sessionId;
		result._itemId = item._itemId;

		return result;
	}
}

export namespace CallHierarchyIncomingCall {

	export function to(item: extHostProtocol.IIncomingCallDto): types.CallHierarchyIncomingCall {
		return new types.CallHierarchyIncomingCall(
			CallHierarchyItem.to(item.from),
			item.fromRanges.map(r => Range.to(r))
		);
	}
}

export namespace CallHierarchyOutgoingCall {

	export function to(item: extHostProtocol.IOutgoingCallDto): types.CallHierarchyOutgoingCall {
		return new types.CallHierarchyOutgoingCall(
			CallHierarchyItem.to(item.to),
			item.fromRanges.map(r => Range.to(r))
		);
699 700 701 702
	}
}


M
Matt Bierner 已提交
703 704
export namespace location {
	export function from(value: vscode.Location): modes.Location {
705
		return {
706
			range: value.range && Range.from(value.range),
J
Johannes Rieken 已提交
707
			uri: value.uri
J
Johannes Rieken 已提交
708
		};
M
Matt Bierner 已提交
709 710 711
	}

	export function to(value: modes.Location): types.Location {
712
		return new types.Location(value.uri, Range.to(value.range));
713
	}
M
Matt Bierner 已提交
714
}
715

M
Matt Bierner 已提交
716
export namespace DefinitionLink {
J
Johannes Rieken 已提交
717
	export function from(value: vscode.Location | vscode.DefinitionLink): modes.LocationLink {
M
Matt Bierner 已提交
718 719 720
		const definitionLink = <vscode.DefinitionLink>value;
		const location = <vscode.Location>value;
		return {
J
Johannes Rieken 已提交
721
			originSelectionRange: definitionLink.originSelectionRange
M
Matt Bierner 已提交
722 723 724 725
				? Range.from(definitionLink.originSelectionRange)
				: undefined,
			uri: definitionLink.targetUri ? definitionLink.targetUri : location.uri,
			range: Range.from(definitionLink.targetRange ? definitionLink.targetRange : location.range),
J
Johannes Rieken 已提交
726
			targetSelectionRange: definitionLink.targetSelectionRange
M
Matt Bierner 已提交
727 728 729 730 731 732
				? Range.from(definitionLink.targetSelectionRange)
				: undefined,
		};
	}
}

733 734 735 736 737 738 739
export namespace Hover {
	export function from(hover: vscode.Hover): modes.Hover {
		return <modes.Hover>{
			range: Range.from(hover.range),
			contents: MarkdownString.fromMany(hover.contents)
		};
	}
740

741 742 743
	export function to(info: modes.Hover): types.Hover {
		return new types.Hover(info.contents.map(MarkdownString.to), Range.to(info.range));
	}
744
}
745 746 747 748 749 750 751 752 753 754 755 756 757 758

export namespace EvaluatableExpression {
	export function from(expression: vscode.EvaluatableExpression): modes.EvaluatableExpression {
		return <modes.EvaluatableExpression>{
			range: Range.from(expression.range),
			expression: expression.expression
		};
	}

	export function to(info: modes.EvaluatableExpression): types.EvaluatableExpression {
		return new types.EvaluatableExpression(Range.to(info.range), info.expression);
	}
}

759 760 761 762 763 764 765 766 767 768
export namespace DocumentHighlight {
	export function from(documentHighlight: vscode.DocumentHighlight): modes.DocumentHighlight {
		return {
			range: Range.from(documentHighlight.range),
			kind: documentHighlight.kind
		};
	}
	export function to(occurrence: modes.DocumentHighlight): types.DocumentHighlight {
		return new types.DocumentHighlight(Range.to(occurrence.range), occurrence.kind);
	}
769 770
}

M
Matt Bierner 已提交
771
export namespace CompletionTriggerKind {
772
	export function to(kind: modes.CompletionTriggerKind) {
M
Matt Bierner 已提交
773
		switch (kind) {
774
			case modes.CompletionTriggerKind.TriggerCharacter:
M
Matt Bierner 已提交
775
				return types.CompletionTriggerKind.TriggerCharacter;
776
			case modes.CompletionTriggerKind.TriggerForIncompleteCompletions:
777
				return types.CompletionTriggerKind.TriggerForIncompleteCompletions;
778
			case modes.CompletionTriggerKind.Invoke:
M
Matt Bierner 已提交
779 780 781 782 783 784 785
			default:
				return types.CompletionTriggerKind.Invoke;
		}
	}
}

export namespace CompletionContext {
786
	export function to(context: modes.CompletionContext): types.CompletionContext {
M
Matt Bierner 已提交
787
		return {
788
			triggerKind: CompletionTriggerKind.to(context.triggerKind),
M
Matt Bierner 已提交
789 790 791 792 793
			triggerCharacter: context.triggerCharacter
		};
	}
}

794
export namespace CompletionItemTag {
795

796
	export function from(kind: types.CompletionItemTag): modes.CompletionItemTag {
797
		switch (kind) {
798
			case types.CompletionItemTag.Deprecated: return modes.CompletionItemTag.Deprecated;
799 800 801
		}
	}

802
	export function to(kind: modes.CompletionItemTag): types.CompletionItemTag {
803
		switch (kind) {
804
			case modes.CompletionItemTag.Deprecated: return types.CompletionItemTag.Deprecated;
805 806 807 808
		}
	}
}

M
Matt Bierner 已提交
809
export namespace CompletionItemKind {
J
Johannes Rieken 已提交
810

811
	export function from(kind: types.CompletionItemKind | undefined): modes.CompletionItemKind {
J
Johannes Rieken 已提交
812
		switch (kind) {
813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837
			case types.CompletionItemKind.Method: return modes.CompletionItemKind.Method;
			case types.CompletionItemKind.Function: return modes.CompletionItemKind.Function;
			case types.CompletionItemKind.Constructor: return modes.CompletionItemKind.Constructor;
			case types.CompletionItemKind.Field: return modes.CompletionItemKind.Field;
			case types.CompletionItemKind.Variable: return modes.CompletionItemKind.Variable;
			case types.CompletionItemKind.Class: return modes.CompletionItemKind.Class;
			case types.CompletionItemKind.Interface: return modes.CompletionItemKind.Interface;
			case types.CompletionItemKind.Struct: return modes.CompletionItemKind.Struct;
			case types.CompletionItemKind.Module: return modes.CompletionItemKind.Module;
			case types.CompletionItemKind.Property: return modes.CompletionItemKind.Property;
			case types.CompletionItemKind.Unit: return modes.CompletionItemKind.Unit;
			case types.CompletionItemKind.Value: return modes.CompletionItemKind.Value;
			case types.CompletionItemKind.Constant: return modes.CompletionItemKind.Constant;
			case types.CompletionItemKind.Enum: return modes.CompletionItemKind.Enum;
			case types.CompletionItemKind.EnumMember: return modes.CompletionItemKind.EnumMember;
			case types.CompletionItemKind.Keyword: return modes.CompletionItemKind.Keyword;
			case types.CompletionItemKind.Snippet: return modes.CompletionItemKind.Snippet;
			case types.CompletionItemKind.Text: return modes.CompletionItemKind.Text;
			case types.CompletionItemKind.Color: return modes.CompletionItemKind.Color;
			case types.CompletionItemKind.File: return modes.CompletionItemKind.File;
			case types.CompletionItemKind.Reference: return modes.CompletionItemKind.Reference;
			case types.CompletionItemKind.Folder: return modes.CompletionItemKind.Folder;
			case types.CompletionItemKind.Event: return modes.CompletionItemKind.Event;
			case types.CompletionItemKind.Operator: return modes.CompletionItemKind.Operator;
			case types.CompletionItemKind.TypeParameter: return modes.CompletionItemKind.TypeParameter;
838 839
			case types.CompletionItemKind.Issue: return modes.CompletionItemKind.Issue;
			case types.CompletionItemKind.User: return modes.CompletionItemKind.User;
J
Johannes Rieken 已提交
840
		}
841
		return modes.CompletionItemKind.Property;
M
Matt Bierner 已提交
842
	}
J
Johannes Rieken 已提交
843

M
Matt Bierner 已提交
844
	export function to(kind: modes.CompletionItemKind): types.CompletionItemKind {
845
		switch (kind) {
846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870
			case modes.CompletionItemKind.Method: return types.CompletionItemKind.Method;
			case modes.CompletionItemKind.Function: return types.CompletionItemKind.Function;
			case modes.CompletionItemKind.Constructor: return types.CompletionItemKind.Constructor;
			case modes.CompletionItemKind.Field: return types.CompletionItemKind.Field;
			case modes.CompletionItemKind.Variable: return types.CompletionItemKind.Variable;
			case modes.CompletionItemKind.Class: return types.CompletionItemKind.Class;
			case modes.CompletionItemKind.Interface: return types.CompletionItemKind.Interface;
			case modes.CompletionItemKind.Struct: return types.CompletionItemKind.Struct;
			case modes.CompletionItemKind.Module: return types.CompletionItemKind.Module;
			case modes.CompletionItemKind.Property: return types.CompletionItemKind.Property;
			case modes.CompletionItemKind.Unit: return types.CompletionItemKind.Unit;
			case modes.CompletionItemKind.Value: return types.CompletionItemKind.Value;
			case modes.CompletionItemKind.Constant: return types.CompletionItemKind.Constant;
			case modes.CompletionItemKind.Enum: return types.CompletionItemKind.Enum;
			case modes.CompletionItemKind.EnumMember: return types.CompletionItemKind.EnumMember;
			case modes.CompletionItemKind.Keyword: return types.CompletionItemKind.Keyword;
			case modes.CompletionItemKind.Snippet: return types.CompletionItemKind.Snippet;
			case modes.CompletionItemKind.Text: return types.CompletionItemKind.Text;
			case modes.CompletionItemKind.Color: return types.CompletionItemKind.Color;
			case modes.CompletionItemKind.File: return types.CompletionItemKind.File;
			case modes.CompletionItemKind.Reference: return types.CompletionItemKind.Reference;
			case modes.CompletionItemKind.Folder: return types.CompletionItemKind.Folder;
			case modes.CompletionItemKind.Event: return types.CompletionItemKind.Event;
			case modes.CompletionItemKind.Operator: return types.CompletionItemKind.Operator;
			case modes.CompletionItemKind.TypeParameter: return types.CompletionItemKind.TypeParameter;
871 872
			case modes.CompletionItemKind.User: return types.CompletionItemKind.User;
			case modes.CompletionItemKind.Issue: return types.CompletionItemKind.Issue;
J
Johannes Rieken 已提交
873
		}
874
		return types.CompletionItemKind.Property;
J
Johannes Rieken 已提交
875
	}
M
Matt Bierner 已提交
876
}
J
Johannes Rieken 已提交
877

878
export namespace CompletionItem {
879

880
	export function to(suggestion: modes.CompletionItem, converter?: CommandsConverter): types.CompletionItem {
P
label2  
Pine Wu 已提交
881 882

		const result = new types.CompletionItem(typeof suggestion.label === 'string' ? suggestion.label : suggestion.label.name);
P
Pine Wu 已提交
883 884 885 886
		if (typeof suggestion.label !== 'string') {
			result.label2 = suggestion.label;
		}

887
		result.insertText = suggestion.insertText;
888
		result.kind = CompletionItemKind.to(suggestion.kind);
889
		result.tags = suggestion.tags && suggestion.tags.map(CompletionItemTag.to);
890
		result.detail = suggestion.detail;
891
		result.documentation = htmlContent.isMarkdownString(suggestion.documentation) ? MarkdownString.to(suggestion.documentation) : suggestion.documentation;
892 893
		result.sortText = suggestion.sortText;
		result.filterText = suggestion.filterText;
J
Johannes Rieken 已提交
894
		result.preselect = suggestion.preselect;
J
Johannes Rieken 已提交
895
		result.commitCharacters = suggestion.commitCharacters;
896 897 898 899 900 901 902 903

		// range
		if (editorRange.Range.isIRange(suggestion.range)) {
			result.range = Range.to(suggestion.range);
		} else if (typeof suggestion.range === 'object') {
			result.range = { inserting: Range.to(suggestion.range.insert), replacing: Range.to(suggestion.range.replace) };
		}

904
		result.keepWhitespace = typeof suggestion.insertTextRules === 'undefined' ? false : Boolean(suggestion.insertTextRules & modes.CompletionItemInsertTextRule.KeepWhitespace);
905
		// 'insertText'-logic
906
		if (typeof suggestion.insertTextRules !== 'undefined' && suggestion.insertTextRules & modes.CompletionItemInsertTextRule.InsertAsSnippet) {
907 908 909
			result.insertText = new types.SnippetString(suggestion.insertText);
		} else {
			result.insertText = suggestion.insertText;
J
Johannes Rieken 已提交
910
			result.textEdit = result.range instanceof types.Range ? new types.TextEdit(result.range, result.insertText) : undefined;
911
		}
912 913 914 915
		if (suggestion.additionalTextEdits && suggestion.additionalTextEdits.length > 0) {
			result.additionalTextEdits = suggestion.additionalTextEdits.map(e => TextEdit.to(e as modes.TextEdit));
		}
		result.command = converter && suggestion.command ? converter.fromInternal(suggestion.command) : undefined;
916

917 918
		return result;
	}
919
}
920

921 922 923 924
export namespace ParameterInformation {
	export function from(info: types.ParameterInformation): modes.ParameterInformation {
		return {
			label: info.label,
925
			documentation: info.documentation ? MarkdownString.fromStrict(info.documentation) : undefined
926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
		};
	}
	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,
941
			documentation: info.documentation ? MarkdownString.fromStrict(info.documentation) : undefined,
942
			parameters: Array.isArray(info.parameters) ? info.parameters.map(ParameterInformation.from) : []
943 944 945 946 947 948 949
		};
	}

	export function to(info: modes.SignatureInformation): types.SignatureInformation {
		return {
			label: info.label,
			documentation: htmlContent.isMarkdownString(info.documentation) ? MarkdownString.to(info.documentation) : info.documentation,
950
			parameters: Array.isArray(info.parameters) ? info.parameters.map(ParameterInformation.to) : []
951 952 953
		};
	}
}
954

955 956
export namespace SignatureHelp {

957 958 959 960
	export function from(help: types.SignatureHelp): modes.SignatureHelp {
		return {
			activeSignature: help.activeSignature,
			activeParameter: help.activeParameter,
961
			signatures: Array.isArray(help.signatures) ? help.signatures.map(SignatureInformation.from) : [],
962
		};
963 964
	}

965 966 967 968
	export function to(help: modes.SignatureHelp): types.SignatureHelp {
		return {
			activeSignature: help.activeSignature,
			activeParameter: help.activeParameter,
969
			signatures: Array.isArray(help.signatures) ? help.signatures.map(SignatureInformation.to) : [],
970
		};
971
	}
J
Johannes Rieken 已提交
972 973
}

J
Johannes Rieken 已提交
974 975
export namespace DocumentLink {

976
	export function from(link: vscode.DocumentLink): modes.ILink {
J
Johannes Rieken 已提交
977
		return {
978
			range: Range.from(link.range),
979 980
			url: link.target,
			tooltip: link.tooltip
J
Johannes Rieken 已提交
981 982 983
		};
	}

984
	export function to(link: modes.ILink): vscode.DocumentLink {
M
Matt Bierner 已提交
985
		let target: URI | undefined = undefined;
M
Martin Aeschlimann 已提交
986 987
		if (link.url) {
			try {
988
				target = typeof link.url === 'string' ? URI.parse(link.url, true) : URI.revive(link.url);
M
Martin Aeschlimann 已提交
989 990 991 992 993
			} catch (err) {
				// ignore
			}
		}
		return new types.DocumentLink(Range.to(link.range), target);
J
Johannes Rieken 已提交
994 995
	}
}
996

997
export namespace ColorPresentation {
998
	export function to(colorPresentation: modes.IColorPresentation): types.ColorPresentation {
M
Matt Bierner 已提交
999
		const cp = new types.ColorPresentation(colorPresentation.label);
1000 1001 1002 1003 1004 1005 1006
		if (colorPresentation.textEdit) {
			cp.textEdit = TextEdit.to(colorPresentation.textEdit);
		}
		if (colorPresentation.additionalTextEdits) {
			cp.additionalTextEdits = colorPresentation.additionalTextEdits.map(value => TextEdit.to(value));
		}
		return cp;
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
	}

	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
		};
	}
}

1018 1019 1020 1021 1022 1023 1024 1025 1026
export namespace Color {
	export function to(c: [number, number, number, number]): types.Color {
		return new types.Color(c[0], c[1], c[2], c[3]);
	}
	export function from(color: types.Color): [number, number, number, number] {
		return [color.red, color.green, color.blue, color.alpha];
	}
}

1027 1028 1029

export namespace SelectionRange {
	export function from(obj: vscode.SelectionRange): modes.SelectionRange {
1030
		return { range: Range.from(obj.range) };
1031 1032 1033
	}

	export function to(obj: modes.SelectionRange): vscode.SelectionRange {
1034
		return new types.SelectionRange(Range.to(obj.range));
1035 1036 1037
	}
}

1038 1039 1040 1041 1042
export namespace TextDocumentSaveReason {

	export function to(reason: SaveReason): vscode.TextDocumentSaveReason {
		switch (reason) {
			case SaveReason.AUTO:
1043
				return types.TextDocumentSaveReason.AfterDelay;
1044
			case SaveReason.EXPLICIT:
1045
				return types.TextDocumentSaveReason.Manual;
1046 1047 1048 1049 1050
			case SaveReason.FOCUS_CHANGE:
			case SaveReason.WINDOW_CHANGE:
				return types.TextDocumentSaveReason.FocusOut;
		}
	}
1051
}
1052

1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
export namespace TextEditorLineNumbersStyle {
	export function from(style: vscode.TextEditorLineNumbersStyle): RenderLineNumbersType {
		switch (style) {
			case types.TextEditorLineNumbersStyle.Off:
				return RenderLineNumbersType.Off;
			case types.TextEditorLineNumbersStyle.Relative:
				return RenderLineNumbersType.Relative;
			case types.TextEditorLineNumbersStyle.On:
			default:
				return RenderLineNumbersType.On;
		}
	}
	export function to(style: RenderLineNumbersType): vscode.TextEditorLineNumbersStyle {
		switch (style) {
			case RenderLineNumbersType.Off:
				return types.TextEditorLineNumbersStyle.Off;
			case RenderLineNumbersType.Relative:
				return types.TextEditorLineNumbersStyle.Relative;
			case RenderLineNumbersType.On:
			default:
				return types.TextEditorLineNumbersStyle.On;
		}
	}
}

1078 1079
export namespace EndOfLine {

1080
	export function from(eol: vscode.EndOfLine): EndOfLineSequence | undefined {
1081 1082 1083 1084 1085 1086
		if (eol === types.EndOfLine.CRLF) {
			return EndOfLineSequence.CRLF;
		} else if (eol === types.EndOfLine.LF) {
			return EndOfLineSequence.LF;
		}
		return undefined;
1087
	}
J
Johannes Rieken 已提交
1088

1089
	export function to(eol: EndOfLineSequence): vscode.EndOfLine | undefined {
J
Johannes Rieken 已提交
1090 1091 1092 1093 1094 1095 1096
		if (eol === EndOfLineSequence.CRLF) {
			return types.EndOfLine.CRLF;
		} else if (eol === EndOfLineSequence.LF) {
			return types.EndOfLine.LF;
		}
		return undefined;
	}
1097 1098
}

J
Johannes Rieken 已提交
1099
export namespace ProgressLocation {
1100
	export function from(loc: vscode.ProgressLocation | { viewId: string }): MainProgressLocation | string {
E
Eric Amodio 已提交
1101 1102
		if (typeof loc === 'object') {
			return loc.viewId;
1103 1104
		}

J
Johannes Rieken 已提交
1105
		switch (loc) {
1106
			case types.ProgressLocation.SourceControl: return MainProgressLocation.Scm;
J
Johannes Rieken 已提交
1107
			case types.ProgressLocation.Window: return MainProgressLocation.Window;
1108
			case types.ProgressLocation.Notification: return MainProgressLocation.Notification;
J
Johannes Rieken 已提交
1109
		}
M
Matt Bierner 已提交
1110
		throw new Error(`Unknown 'ProgressLocation'`);
J
Johannes Rieken 已提交
1111 1112
	}
}
1113

1114
export namespace FoldingRange {
1115
	export function from(r: vscode.FoldingRange): modes.FoldingRange {
M
Matt Bierner 已提交
1116
		const range: modes.FoldingRange = { start: r.start + 1, end: r.end + 1 };
1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135
		if (r.kind) {
			range.kind = FoldingRangeKind.from(r.kind);
		}
		return range;
	}
}

export namespace FoldingRangeKind {
	export function from(kind: vscode.FoldingRangeKind | undefined): modes.FoldingRangeKind | undefined {
		if (kind) {
			switch (kind) {
				case types.FoldingRangeKind.Comment:
					return modes.FoldingRangeKind.Comment;
				case types.FoldingRangeKind.Imports:
					return modes.FoldingRangeKind.Imports;
				case types.FoldingRangeKind.Region:
					return modes.FoldingRangeKind.Region;
			}
		}
R
Rob Lourens 已提交
1136
		return undefined;
1137 1138 1139
	}
}

1140
export namespace TextEditorOptions {
1141

1142
	export function from(options?: vscode.TextDocumentShowOptions): ITextEditorOptions | undefined {
1143 1144 1145 1146 1147 1148 1149
		if (options) {
			return {
				pinned: typeof options.preview === 'boolean' ? !options.preview : undefined,
				preserveFocus: options.preserveFocus,
				selection: typeof options.selection === 'object' ? Range.from(options.selection) : undefined
			} as ITextEditorOptions;
		}
1150

1151
		return undefined;
1152 1153 1154 1155
	}

}

1156
export namespace GlobPattern {
1157

1158
	export function from(pattern: vscode.GlobPattern): string | types.RelativePattern;
1159
	export function from(pattern: undefined): undefined;
1160 1161 1162
	export function from(pattern: null): null;
	export function from(pattern: vscode.GlobPattern | undefined | null): string | types.RelativePattern | undefined | null;
	export function from(pattern: vscode.GlobPattern | undefined | null): string | types.RelativePattern | undefined | null {
1163 1164 1165 1166
		if (pattern instanceof types.RelativePattern) {
			return pattern;
		}

1167 1168 1169
		if (typeof pattern === 'string') {
			return pattern;
		}
1170

1171 1172 1173 1174 1175
		if (isRelativePattern(pattern)) {
			return new types.RelativePattern(pattern.base, pattern.pattern);
		}

		return pattern; // preserve `undefined` and `null`
1176 1177
	}

1178 1179 1180 1181
	function isRelativePattern(obj: any): obj is vscode.RelativePattern {
		const rp = obj as vscode.RelativePattern;
		return rp && typeof rp.base === 'string' && typeof rp.pattern === 'string';
	}
1182 1183
}

1184
export namespace LanguageSelector {
1185

M
Matt Bierner 已提交
1186 1187 1188
	export function from(selector: undefined): undefined;
	export function from(selector: vscode.DocumentSelector): languageSelector.LanguageSelector;
	export function from(selector: vscode.DocumentSelector | undefined): languageSelector.LanguageSelector | undefined;
M
Matt Bierner 已提交
1189
	export function from(selector: vscode.DocumentSelector | undefined): languageSelector.LanguageSelector | undefined {
1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
		if (!selector) {
			return undefined;
		} else if (Array.isArray(selector)) {
			return <languageSelector.LanguageSelector>selector.map(from);
		} else if (typeof selector === 'string') {
			return selector;
		} else {
			return <languageSelector.LanguageFilter>{
				language: selector.language,
				scheme: selector.scheme,
M
Matt Bierner 已提交
1200
				pattern: typeof selector.pattern === 'undefined' ? undefined : GlobPattern.from(selector.pattern),
1201 1202 1203
				exclusive: selector.exclusive
			};
		}
1204
	}
1205
}
1206 1207

export namespace LogLevel {
1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247
	export function from(extLevel: types.LogLevel): _MainLogLevel {
		switch (extLevel) {
			case types.LogLevel.Trace:
				return _MainLogLevel.Trace;
			case types.LogLevel.Debug:
				return _MainLogLevel.Debug;
			case types.LogLevel.Info:
				return _MainLogLevel.Info;
			case types.LogLevel.Warning:
				return _MainLogLevel.Warning;
			case types.LogLevel.Error:
				return _MainLogLevel.Error;
			case types.LogLevel.Critical:
				return _MainLogLevel.Critical;
			case types.LogLevel.Off:
				return _MainLogLevel.Off;
		}

		return _MainLogLevel.Info;
	}

	export function to(mainLevel: _MainLogLevel): types.LogLevel {
		switch (mainLevel) {
			case _MainLogLevel.Trace:
				return types.LogLevel.Trace;
			case _MainLogLevel.Debug:
				return types.LogLevel.Debug;
			case _MainLogLevel.Info:
				return types.LogLevel.Info;
			case _MainLogLevel.Warning:
				return types.LogLevel.Warning;
			case _MainLogLevel.Error:
				return types.LogLevel.Error;
			case _MainLogLevel.Critical:
				return types.LogLevel.Critical;
			case _MainLogLevel.Off:
				return types.LogLevel.Off;
		}

		return types.LogLevel.Info;
1248 1249
	}
}