extHostTypeConverters.ts 38.2 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/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';
J
Johannes Rieken 已提交
13
import * 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/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 * as languageSelector from 'vs/editor/common/modes/languageSelector';
22
import { WorkspaceEditDto, ResourceTextEditDto, ResourceFileEditDto } from 'vs/workbench/api/node/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';
25
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/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 } from 'vs/base/common/arrays';
32
import { RenderLineNumbersType } from 'vs/editor/common/config/editorOptions';
E
Erich Gamma 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

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

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

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

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

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

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

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

97 98 99 100 101 102 103
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 };
	}
104 105
}

106
export namespace DiagnosticTag {
107
	export function from(value: vscode.DiagnosticTag): MarkerTag | undefined {
108 109 110 111 112 113 114 115
		switch (value) {
			case types.DiagnosticTag.Unnecessary:
				return MarkerTag.Unnecessary;
		}
		return undefined;
	}
}

116 117 118 119 120 121
export namespace Diagnostic {
	export function from(value: vscode.Diagnostic): IMarkerData {
		return {
			...Range.from(value.range),
			message: value.message,
			source: value.source,
R
Rob Lourens 已提交
122
			code: isString(value.code) || isNumber(value.code) ? String(value.code) : undefined,
123
			severity: DiagnosticSeverity.from(value.severity),
124
			relatedInformation: value.relatedInformation && value.relatedInformation.map(DiagnosticRelatedInformation.from),
125
			tags: Array.isArray(value.tags) ? coalesce(value.tags.map(DiagnosticTag.from)) : undefined,
126 127
		};
	}
128 129
}

130 131 132 133 134 135 136 137 138 139
export namespace DiagnosticRelatedInformation {
	export function from(value: types.DiagnosticRelatedInformation): IRelatedInformation {
		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 已提交
140 141
	}
}
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
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 已提交
157

158 159 160 161 162 163 164 165 166 167 168 169
	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 已提交
170 171 172
	}
}

173
export namespace ViewColumn {
174
	export function from(column?: vscode.ViewColumn): EditorViewColumn {
175 176
		if (typeof column === 'number' && column >= types.ViewColumn.One) {
			return column - 1; // adjust zero index (ViewColumn.ONE => 0)
177
		}
178 179 180 181 182 183

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

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

M
Matt Bierner 已提交
186
	export function to(position: EditorViewColumn): vscode.ViewColumn {
187 188
		if (typeof position === 'number' && position >= 0) {
			return position + 1; // adjust to index (ViewColumn.ONE => 1)
189
		}
190

M
Matt Bierner 已提交
191
		throw new Error(`invalid 'EditorViewColumn'`);
192 193
	}
}
E
Erich Gamma 已提交
194

M
Martin Aeschlimann 已提交
195
function isDecorationOptions(something: any): something is vscode.DecorationOptions {
196
	return (typeof something.range !== 'undefined');
E
Erich Gamma 已提交
197 198
}

199
export function isDecorationOptionsArr(something: vscode.Range[] | vscode.DecorationOptions[]): something is vscode.DecorationOptions[] {
E
Erich Gamma 已提交
200 201 202
	if (something.length === 0) {
		return true;
	}
M
Martin Aeschlimann 已提交
203
	return isDecorationOptions(something[0]) ? true : false;
E
Erich Gamma 已提交
204 205
}

206 207 208 209 210 211
export namespace MarkdownString {

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

J
Johannes Rieken 已提交
212 213 214 215 216 217
	interface Codeblock {
		language: string;
		value: string;
	}

	function isCodeblock(thing: any): thing is Codeblock {
J
Johannes Rieken 已提交
218
		return thing && typeof thing === 'object'
J
Johannes Rieken 已提交
219 220 221 222
			&& typeof (<Codeblock>thing).language === 'string'
			&& typeof (<Codeblock>thing).value === 'string';
	}

223
	export function from(markup: vscode.MarkdownString | vscode.MarkedString): htmlContent.IMarkdownString {
224
		let res: htmlContent.IMarkdownString;
J
Johannes Rieken 已提交
225 226
		if (isCodeblock(markup)) {
			const { language, value } = markup;
227
			res = { value: '```' + language + '\n' + value + '\n```\n' };
J
Johannes Rieken 已提交
228
		} else if (htmlContent.isMarkdownString(markup)) {
229
			res = markup;
J
Johannes Rieken 已提交
230
		} else if (typeof markup === 'string') {
231
			res = { value: <string>markup };
232
		} else {
233
			res = { value: '' };
234
		}
J
Johannes Rieken 已提交
235

236
		// extract uris into a separate object
237 238 239
		const resUris: { [href: string]: UriComponents } = Object.create(null);
		res.uris = resUris;

240
		const renderer = new marked.Renderer();
J
Johannes Rieken 已提交
241 242
		renderer.image = renderer.link = (href: string): string => {
			try {
J
Johannes Rieken 已提交
243
				let uri = URI.parse(href, true);
244 245
				uri = uri.with({ query: _uriMassage(uri.query, resUris) });
				resUris[href] = uri;
J
Johannes Rieken 已提交
246 247 248 249 250
			} catch (e) {
				// ignore
			}
			return '';
		};
251 252 253
		marked(res.value, { renderer });

		return res;
J
Johannes Rieken 已提交
254 255
	}

J
Johannes Rieken 已提交
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
	function _uriMassage(part: string, bucket: { [n: string]: UriComponents }): string {
		if (!part) {
			return part;
		}
		let data: any;
		try {
			data = parse(decodeURIComponent(part));
		} catch (e) {
			// ignore
		}
		if (!data) {
			return part;
		}
		data = cloneAndChange(data, value => {
			if (value instanceof URI) {
271
				const key = `__uri_${Math.random().toString(16).slice(2, 8)}`;
J
Johannes Rieken 已提交
272 273 274 275 276 277 278 279 280
				bucket[key] = value;
				return key;
			} else {
				return undefined;
			}
		});
		return encodeURIComponent(JSON.stringify(data));
	}

281 282 283 284
	export function to(value: htmlContent.IMarkdownString): vscode.MarkdownString {
		const ret = new htmlContent.MarkdownString(value.value);
		ret.isTrusted = value.isTrusted;
		return ret;
285
	}
286 287 288 289 290 291 292

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

295
export function fromRangeOrRangeWithMessage(ranges: vscode.Range[] | vscode.DecorationOptions[]): IDecorationOptions[] {
M
Martin Aeschlimann 已提交
296
	if (isDecorationOptionsArr(ranges)) {
297
		return ranges.map((r): IDecorationOptions => {
E
Erich Gamma 已提交
298
			return {
299
				range: Range.from(r.range),
300 301 302
				hoverMessage: Array.isArray(r.hoverMessage)
					? MarkdownString.fromMany(r.hoverMessage)
					: (r.hoverMessage ? MarkdownString.from(r.hoverMessage) : undefined),
303
				renderOptions: <any> /* URI vs Uri */r.renderOptions
E
Erich Gamma 已提交
304 305 306
			};
		});
	} else {
M
Martin Aeschlimann 已提交
307
		return ranges.map((r): IDecorationOptions => {
E
Erich Gamma 已提交
308
			return {
309
				range: Range.from(r)
B
Benjamin Pasero 已提交
310
			};
E
Erich Gamma 已提交
311 312 313
		});
	}
}
314

P
Peng Lyu 已提交
315
export function pathOrURIToURI(value: string | URI): URI {
A
Alex Dima 已提交
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
	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,
333
			contentIconPath: options.contentIconPath ? pathOrURIToURI(options.contentIconPath) : undefined,
A
Alex Dima 已提交
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
			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,
372
			gutterIconPath: options.gutterIconPath ? pathOrURIToURI(options.gutterIconPath) : undefined,
A
Alex Dima 已提交
373 374
			gutterIconSize: options.gutterIconSize,
			overviewRulerColor: <string | types.ThemeColor>options.overviewRulerColor,
375 376
			before: options.before ? ThemableDecorationAttachmentRenderOptions.from(options.before) : undefined,
			after: options.after ? ThemableDecorationAttachmentRenderOptions.from(options.after) : undefined,
A
Alex Dima 已提交
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
		};
	}
}

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,
403
			rangeBehavior: options.rangeBehavior ? DecorationRangeBehavior.from(options.rangeBehavior) : undefined,
A
Alex Dima 已提交
404
			overviewRulerLane: options.overviewRulerLane,
405 406
			light: options.light ? ThemableDecorationRenderOptions.from(options.light) : undefined,
			dark: options.dark ? ThemableDecorationRenderOptions.from(options.dark) : undefined,
A
Alex Dima 已提交
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425

			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,
426
			gutterIconPath: options.gutterIconPath ? pathOrURIToURI(options.gutterIconPath) : undefined,
A
Alex Dima 已提交
427 428
			gutterIconSize: options.gutterIconSize,
			overviewRulerColor: <string | types.ThemeColor>options.overviewRulerColor,
429 430
			before: options.before ? ThemableDecorationAttachmentRenderOptions.from(options.before) : undefined,
			after: options.after ? ThemableDecorationAttachmentRenderOptions.from(options.after) : undefined,
A
Alex Dima 已提交
431 432 433 434
		};
	}
}

M
Matt Bierner 已提交
435
export namespace TextEdit {
436

M
Matt Bierner 已提交
437
	export function from(edit: vscode.TextEdit): modes.TextEdit {
J
Johannes Rieken 已提交
438
		return <modes.TextEdit>{
439
			text: edit.newText,
J
Johannes Rieken 已提交
440
			eol: EndOfLine.from(edit.newEol),
441
			range: Range.from(edit.range)
B
Benjamin Pasero 已提交
442
		};
M
Matt Bierner 已提交
443 444 445
	}

	export function to(edit: modes.TextEdit): types.TextEdit {
M
Matt Bierner 已提交
446
		const result = new types.TextEdit(Range.to(edit.range), edit.text);
M
Matt Bierner 已提交
447
		result.newEol = (typeof edit.eol === 'undefined' ? undefined : EndOfLine.to(edit.eol))!;
J
Johannes Rieken 已提交
448
		return result;
449
	}
M
Matt Bierner 已提交
450
}
451

452
export namespace WorkspaceEdit {
453
	export function from(value: vscode.WorkspaceEdit, documents?: ExtHostDocumentsAndEditors): WorkspaceEditDto {
454
		const result: WorkspaceEditDto = {
455
			edits: []
456
		};
J
Johannes Rieken 已提交
457
		for (const entry of (value as types.WorkspaceEdit)._allEntries()) {
458 459 460
			const [uri, uriOrEdits] = entry;
			if (Array.isArray(uriOrEdits)) {
				// text edits
461
				const doc = documents && uri ? documents.getDocument(uri) : undefined;
462
				result.edits.push(<ResourceTextEditDto>{ resource: uri, modelVersionId: doc && doc.version, edits: uriOrEdits.map(TextEdit.from) });
463 464
			} else {
				// resource edits
465
				result.edits.push(<ResourceFileEditDto>{ oldUri: uri, newUri: uriOrEdits, options: entry[2] });
466 467 468 469 470
			}
		}
		return result;
	}

471
	export function to(value: WorkspaceEditDto) {
472 473
		const result = new types.WorkspaceEdit();
		for (const edit of value.edits) {
474 475 476 477 478
			if (Array.isArray((<ResourceTextEditDto>edit).edits)) {
				result.set(
					URI.revive((<ResourceTextEditDto>edit).resource),
					<types.TextEdit[]>(<ResourceTextEditDto>edit).edits.map(TextEdit.to)
				);
J
Johannes Rieken 已提交
479 480 481
			} else {
				result.renameFile(
					URI.revive((<ResourceFileEditDto>edit).oldUri),
482 483
					URI.revive((<ResourceFileEditDto>edit).newUri),
					(<ResourceFileEditDto>edit).options
J
Johannes Rieken 已提交
484
				);
485
			}
486 487 488
		}
		return result;
	}
489 490
}

491

492 493 494
export namespace SymbolKind {

	const _fromMapping: { [kind: number]: modes.SymbolKind } = Object.create(null);
495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517
	_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;
518 519
	_fromMapping[types.SymbolKind.Event] = modes.SymbolKind.Event;
	_fromMapping[types.SymbolKind.Operator] = modes.SymbolKind.Operator;
520
	_fromMapping[types.SymbolKind.TypeParameter] = modes.SymbolKind.TypeParameter;
521 522

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

526
	export function to(kind: modes.SymbolKind): vscode.SymbolKind {
M
Matt Bierner 已提交
527
		for (const k in _fromMapping) {
528 529
			if (_fromMapping[k] === kind) {
				return Number(k);
530
			}
531 532
		}
		return types.SymbolKind.Property;
533 534 535
	}
}

536 537 538
export namespace WorkspaceSymbol {
	export function from(info: vscode.SymbolInformation): search.IWorkspaceSymbol {
		return <search.IWorkspaceSymbol>{
539 540 541 542 543 544
			name: info.name,
			kind: SymbolKind.from(info.kind),
			containerName: info.containerName,
			location: location.from(info.location)
		};
	}
545
	export function to(info: search.IWorkspaceSymbol): types.SymbolInformation {
546 547 548 549 550 551 552
		return new types.SymbolInformation(
			info.name,
			SymbolKind.to(info.kind),
			info.containerName,
			location.to(info.location)
		);
	}
553 554
}

555
export namespace DocumentSymbol {
556
	export function from(info: vscode.DocumentSymbol): modes.DocumentSymbol {
M
Matt Bierner 已提交
557
		const result: modes.DocumentSymbol = {
558
			name: info.name || '!!MISSING: name!!',
559
			detail: info.detail,
560 561
			range: Range.from(info.range),
			selectionRange: Range.from(info.selectionRange),
562
			kind: SymbolKind.from(info.kind)
563 564 565 566 567 568
		};
		if (info.children) {
			result.children = info.children.map(from);
		}
		return result;
	}
569
	export function to(info: modes.DocumentSymbol): vscode.DocumentSymbol {
M
Matt Bierner 已提交
570
		const result = new types.DocumentSymbol(
571
			info.name,
572
			info.detail,
J
Johannes Rieken 已提交
573
			SymbolKind.to(info.kind),
574 575
			Range.to(info.range),
			Range.to(info.selectionRange),
576
		);
577
		if (info.children) {
578
			result.children = info.children.map(to) as any;
579 580 581
		}
		return result;
	}
582 583
}

M
Matt Bierner 已提交
584 585
export namespace location {
	export function from(value: vscode.Location): modes.Location {
586
		return {
587
			range: value.range && Range.from(value.range),
J
Johannes Rieken 已提交
588
			uri: value.uri
J
Johannes Rieken 已提交
589
		};
M
Matt Bierner 已提交
590 591 592
	}

	export function to(value: modes.Location): types.Location {
593
		return new types.Location(value.uri, Range.to(value.range));
594
	}
M
Matt Bierner 已提交
595
}
596

M
Matt Bierner 已提交
597
export namespace DefinitionLink {
J
Johannes Rieken 已提交
598
	export function from(value: vscode.Location | vscode.DefinitionLink): modes.LocationLink {
M
Matt Bierner 已提交
599 600 601
		const definitionLink = <vscode.DefinitionLink>value;
		const location = <vscode.Location>value;
		return {
J
Johannes Rieken 已提交
602
			originSelectionRange: definitionLink.originSelectionRange
M
Matt Bierner 已提交
603 604 605 606
				? Range.from(definitionLink.originSelectionRange)
				: undefined,
			uri: definitionLink.targetUri ? definitionLink.targetUri : location.uri,
			range: Range.from(definitionLink.targetRange ? definitionLink.targetRange : location.range),
J
Johannes Rieken 已提交
607
			targetSelectionRange: definitionLink.targetSelectionRange
M
Matt Bierner 已提交
608 609 610 611 612 613
				? Range.from(definitionLink.targetSelectionRange)
				: undefined,
		};
	}
}

614 615 616 617 618 619 620
export namespace Hover {
	export function from(hover: vscode.Hover): modes.Hover {
		return <modes.Hover>{
			range: Range.from(hover.range),
			contents: MarkdownString.fromMany(hover.contents)
		};
	}
621

622 623 624
	export function to(info: modes.Hover): types.Hover {
		return new types.Hover(info.contents.map(MarkdownString.to), Range.to(info.range));
	}
625
}
626 627 628 629 630 631 632 633 634 635
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);
	}
636 637
}

M
Matt Bierner 已提交
638
export namespace CompletionTriggerKind {
639
	export function to(kind: modes.CompletionTriggerKind) {
M
Matt Bierner 已提交
640
		switch (kind) {
641
			case modes.CompletionTriggerKind.TriggerCharacter:
M
Matt Bierner 已提交
642
				return types.CompletionTriggerKind.TriggerCharacter;
643
			case modes.CompletionTriggerKind.TriggerForIncompleteCompletions:
644
				return types.CompletionTriggerKind.TriggerForIncompleteCompletions;
645
			case modes.CompletionTriggerKind.Invoke:
M
Matt Bierner 已提交
646 647 648 649 650 651 652
			default:
				return types.CompletionTriggerKind.Invoke;
		}
	}
}

export namespace CompletionContext {
653
	export function to(context: modes.CompletionContext): types.CompletionContext {
M
Matt Bierner 已提交
654
		return {
655
			triggerKind: CompletionTriggerKind.to(context.triggerKind),
M
Matt Bierner 已提交
656 657 658 659 660
			triggerCharacter: context.triggerCharacter
		};
	}
}

M
Matt Bierner 已提交
661
export namespace CompletionItemKind {
J
Johannes Rieken 已提交
662

663
	export function from(kind: types.CompletionItemKind | undefined): modes.CompletionItemKind {
J
Johannes Rieken 已提交
664
		switch (kind) {
665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689
			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;
J
Johannes Rieken 已提交
690
		}
691
		return modes.CompletionItemKind.Property;
M
Matt Bierner 已提交
692
	}
J
Johannes Rieken 已提交
693

M
Matt Bierner 已提交
694
	export function to(kind: modes.CompletionItemKind): types.CompletionItemKind {
695
		switch (kind) {
696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
			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;
J
Johannes Rieken 已提交
721
		}
722
		return types.CompletionItemKind.Property;
J
Johannes Rieken 已提交
723
	}
M
Matt Bierner 已提交
724
}
J
Johannes Rieken 已提交
725

726
export namespace CompletionItem {
727

728
	export function to(suggestion: modes.CompletionItem): types.CompletionItem {
729
		const result = new types.CompletionItem(suggestion.label);
730
		result.insertText = suggestion.insertText;
731
		result.kind = CompletionItemKind.to(suggestion.kind);
732
		result.detail = suggestion.detail;
733
		result.documentation = htmlContent.isMarkdownString(suggestion.documentation) ? MarkdownString.to(suggestion.documentation) : suggestion.documentation;
734 735
		result.sortText = suggestion.sortText;
		result.filterText = suggestion.filterText;
J
Johannes Rieken 已提交
736
		result.preselect = suggestion.preselect;
J
Johannes Rieken 已提交
737
		result.commitCharacters = suggestion.commitCharacters;
738
		result.range = Range.to(suggestion.range);
739
		result.keepWhitespace = typeof suggestion.insertTextRules === 'undefined' ? false : Boolean(suggestion.insertTextRules & modes.CompletionItemInsertTextRule.KeepWhitespace);
740
		// 'inserText'-logic
741
		if (typeof suggestion.insertTextRules !== 'undefined' && suggestion.insertTextRules & modes.CompletionItemInsertTextRule.InsertAsSnippet) {
742 743 744 745 746 747
			result.insertText = new types.SnippetString(suggestion.insertText);
		} else {
			result.insertText = suggestion.insertText;
			result.textEdit = new types.TextEdit(result.range, result.insertText);
		}
		// TODO additionalEdits, command
748

749 750
		return result;
	}
751
}
752

753 754 755 756
export namespace ParameterInformation {
	export function from(info: types.ParameterInformation): modes.ParameterInformation {
		return {
			label: info.label,
757
			documentation: info.documentation ? MarkdownString.fromStrict(info.documentation) : undefined
758 759 760 761 762 763 764 765 766 767 768 769 770 771 772
		};
	}
	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,
773
			documentation: info.documentation ? MarkdownString.fromStrict(info.documentation) : undefined,
774 775 776 777 778 779 780 781 782 783 784 785
			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)
		};
	}
}
786

787 788
export namespace SignatureHelp {

789 790 791 792 793 794
	export function from(help: types.SignatureHelp): modes.SignatureHelp {
		return {
			activeSignature: help.activeSignature,
			activeParameter: help.activeParameter,
			signatures: help.signatures && help.signatures.map(SignatureInformation.from)
		};
795 796
	}

797 798 799 800 801 802
	export function to(help: modes.SignatureHelp): types.SignatureHelp {
		return {
			activeSignature: help.activeSignature,
			activeParameter: help.activeParameter,
			signatures: help.signatures && help.signatures.map(SignatureInformation.to)
		};
803
	}
J
Johannes Rieken 已提交
804 805
}

J
Johannes Rieken 已提交
806 807
export namespace DocumentLink {

808
	export function from(link: vscode.DocumentLink): modes.ILink {
J
Johannes Rieken 已提交
809
		return {
810
			range: Range.from(link.range),
M
Martin Aeschlimann 已提交
811
			url: link.target
J
Johannes Rieken 已提交
812 813 814
		};
	}

815
	export function to(link: modes.ILink): vscode.DocumentLink {
M
Matt Bierner 已提交
816
		let target: URI | undefined = undefined;
M
Martin Aeschlimann 已提交
817 818 819 820 821 822 823 824
		if (link.url) {
			try {
				target = typeof link.url === 'string' ? URI.parse(link.url, true) : URI.revive(link.url);
			} catch (err) {
				// ignore
			}
		}
		return new types.DocumentLink(Range.to(link.range), target);
J
Johannes Rieken 已提交
825 826
	}
}
827

828
export namespace ColorPresentation {
829
	export function to(colorPresentation: modes.IColorPresentation): types.ColorPresentation {
M
Matt Bierner 已提交
830
		const cp = new types.ColorPresentation(colorPresentation.label);
831 832 833 834 835 836 837
		if (colorPresentation.textEdit) {
			cp.textEdit = TextEdit.to(colorPresentation.textEdit);
		}
		if (colorPresentation.additionalTextEdits) {
			cp.additionalTextEdits = colorPresentation.additionalTextEdits.map(value => TextEdit.to(value));
		}
		return cp;
838 839 840 841 842 843 844 845 846 847 848
	}

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

849 850 851 852 853 854 855 856 857
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];
	}
}

858 859 860 861

export namespace SelectionRange {
	export function from(obj: vscode.SelectionRange): modes.SelectionRange {
		return {
862
			kind: '',
863 864 865 866 867
			range: Range.from(obj.range)
		};
	}

	export function to(obj: modes.SelectionRange): vscode.SelectionRange {
868
		return new types.SelectionRange(Range.to(obj.range));
869 870 871
	}
}

872 873 874 875 876
export namespace TextDocumentSaveReason {

	export function to(reason: SaveReason): vscode.TextDocumentSaveReason {
		switch (reason) {
			case SaveReason.AUTO:
877
				return types.TextDocumentSaveReason.AfterDelay;
878
			case SaveReason.EXPLICIT:
879
				return types.TextDocumentSaveReason.Manual;
880 881 882 883 884
			case SaveReason.FOCUS_CHANGE:
			case SaveReason.WINDOW_CHANGE:
				return types.TextDocumentSaveReason.FocusOut;
		}
	}
885
}
886

887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911
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;
		}
	}
}

912 913
export namespace EndOfLine {

914
	export function from(eol: vscode.EndOfLine): EndOfLineSequence | undefined {
915 916 917 918 919 920
		if (eol === types.EndOfLine.CRLF) {
			return EndOfLineSequence.CRLF;
		} else if (eol === types.EndOfLine.LF) {
			return EndOfLineSequence.LF;
		}
		return undefined;
921
	}
J
Johannes Rieken 已提交
922

923
	export function to(eol: EndOfLineSequence): vscode.EndOfLine | undefined {
J
Johannes Rieken 已提交
924 925 926 927 928 929 930
		if (eol === EndOfLineSequence.CRLF) {
			return types.EndOfLine.CRLF;
		} else if (eol === EndOfLineSequence.LF) {
			return types.EndOfLine.LF;
		}
		return undefined;
	}
931 932
}

J
Johannes Rieken 已提交
933
export namespace ProgressLocation {
M
Matt Bierner 已提交
934
	export function from(loc: vscode.ProgressLocation): MainProgressLocation {
J
Johannes Rieken 已提交
935
		switch (loc) {
936
			case types.ProgressLocation.SourceControl: return MainProgressLocation.Scm;
J
Johannes Rieken 已提交
937
			case types.ProgressLocation.Window: return MainProgressLocation.Window;
938
			case types.ProgressLocation.Notification: return MainProgressLocation.Notification;
J
Johannes Rieken 已提交
939
		}
M
Matt Bierner 已提交
940
		throw new Error(`Unknown 'ProgressLocation'`);
J
Johannes Rieken 已提交
941 942
	}
}
943

944
export namespace FoldingRange {
945
	export function from(r: vscode.FoldingRange): modes.FoldingRange {
M
Matt Bierner 已提交
946
		const range: modes.FoldingRange = { start: r.start + 1, end: r.end + 1 };
947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965
		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 已提交
966
		return undefined;
967 968 969
	}
}

970
export namespace TextEditorOptions {
971

972
	export function from(options?: vscode.TextDocumentShowOptions): ITextEditorOptions | undefined {
973 974 975 976 977 978 979
		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;
		}
980

981
		return undefined;
982 983 984 985
	}

}

986
export namespace GlobPattern {
987

988 989 990 991
	export function from(pattern: vscode.GlobPattern): string | types.RelativePattern;
	export function from(pattern: undefined | null): undefined | 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 {
992 993 994 995
		if (pattern instanceof types.RelativePattern) {
			return pattern;
		}

996 997 998
		if (typeof pattern === 'string') {
			return pattern;
		}
999

1000 1001 1002 1003 1004
		if (isRelativePattern(pattern)) {
			return new types.RelativePattern(pattern.base, pattern.pattern);
		}

		return pattern; // preserve `undefined` and `null`
1005 1006
	}

1007 1008 1009 1010
	function isRelativePattern(obj: any): obj is vscode.RelativePattern {
		const rp = obj as vscode.RelativePattern;
		return rp && typeof rp.base === 'string' && typeof rp.pattern === 'string';
	}
1011 1012
}

1013
export namespace LanguageSelector {
1014

M
Matt Bierner 已提交
1015 1016 1017
	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 已提交
1018
	export function from(selector: vscode.DocumentSelector | undefined): languageSelector.LanguageSelector | undefined {
1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
		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 已提交
1029
				pattern: typeof selector.pattern === 'undefined' ? undefined : GlobPattern.from(selector.pattern),
1030 1031 1032
				exclusive: selector.exclusive
			};
		}
1033
	}
1034
}
1035 1036

export namespace LogLevel {
1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 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
	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;
1077 1078
	}
}