123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- /**
- * Describes what to do with the indentation when pressing Enter.
- */
- export var IndentAction;
- (function (IndentAction) {
- /**
- * Insert new line and copy the previous line's indentation.
- */
- IndentAction[IndentAction["None"] = 0] = "None";
- /**
- * Insert new line and indent once (relative to the previous line's indentation).
- */
- IndentAction[IndentAction["Indent"] = 1] = "Indent";
- /**
- * Insert two new lines:
- * - the first one indented which will hold the cursor
- * - the second one at the same indentation level
- */
- IndentAction[IndentAction["IndentOutdent"] = 2] = "IndentOutdent";
- /**
- * Insert new line and outdent once (relative to the previous line's indentation).
- */
- IndentAction[IndentAction["Outdent"] = 3] = "Outdent";
- })(IndentAction || (IndentAction = {}));
- /**
- * @internal
- */
- export class StandardAutoClosingPairConditional {
- constructor(source) {
- this._neutralCharacter = null;
- this._neutralCharacterSearched = false;
- this.open = source.open;
- this.close = source.close;
- // initially allowed in all tokens
- this._standardTokenMask = 0;
- if (Array.isArray(source.notIn)) {
- for (let i = 0, len = source.notIn.length; i < len; i++) {
- const notIn = source.notIn[i];
- switch (notIn) {
- case 'string':
- this._standardTokenMask |= 2 /* String */;
- break;
- case 'comment':
- this._standardTokenMask |= 1 /* Comment */;
- break;
- case 'regex':
- this._standardTokenMask |= 4 /* RegEx */;
- break;
- }
- }
- }
- }
- isOK(standardToken) {
- return (this._standardTokenMask & standardToken) === 0;
- }
- shouldAutoClose(context, column) {
- // Always complete on empty line
- if (context.getTokenCount() === 0) {
- return true;
- }
- const tokenIndex = context.findTokenIndexAtOffset(column - 2);
- const standardTokenType = context.getStandardTokenType(tokenIndex);
- return this.isOK(standardTokenType);
- }
- _findNeutralCharacterInRange(fromCharCode, toCharCode) {
- for (let charCode = fromCharCode; charCode <= toCharCode; charCode++) {
- const character = String.fromCharCode(charCode);
- if (!this.open.includes(character) && !this.close.includes(character)) {
- return character;
- }
- }
- return null;
- }
- /**
- * Find a character in the range [0-9a-zA-Z] that does not appear in the open or close
- */
- findNeutralCharacter() {
- if (!this._neutralCharacterSearched) {
- this._neutralCharacterSearched = true;
- if (!this._neutralCharacter) {
- this._neutralCharacter = this._findNeutralCharacterInRange(48 /* Digit0 */, 57 /* Digit9 */);
- }
- if (!this._neutralCharacter) {
- this._neutralCharacter = this._findNeutralCharacterInRange(97 /* a */, 122 /* z */);
- }
- if (!this._neutralCharacter) {
- this._neutralCharacter = this._findNeutralCharacterInRange(65 /* A */, 90 /* Z */);
- }
- }
- return this._neutralCharacter;
- }
- }
- /**
- * @internal
- */
- export class AutoClosingPairs {
- constructor(autoClosingPairs) {
- this.autoClosingPairsOpenByStart = new Map();
- this.autoClosingPairsOpenByEnd = new Map();
- this.autoClosingPairsCloseByStart = new Map();
- this.autoClosingPairsCloseByEnd = new Map();
- this.autoClosingPairsCloseSingleChar = new Map();
- for (const pair of autoClosingPairs) {
- appendEntry(this.autoClosingPairsOpenByStart, pair.open.charAt(0), pair);
- appendEntry(this.autoClosingPairsOpenByEnd, pair.open.charAt(pair.open.length - 1), pair);
- appendEntry(this.autoClosingPairsCloseByStart, pair.close.charAt(0), pair);
- appendEntry(this.autoClosingPairsCloseByEnd, pair.close.charAt(pair.close.length - 1), pair);
- if (pair.close.length === 1 && pair.open.length === 1) {
- appendEntry(this.autoClosingPairsCloseSingleChar, pair.close, pair);
- }
- }
- }
- }
- function appendEntry(target, key, value) {
- if (target.has(key)) {
- target.get(key).push(value);
- }
- else {
- target.set(key, [value]);
- }
- }
|