You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
1.6 KiB

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.findMatchingBracketPosition = findMatchingBracketPosition;
const LEFT_BRACKETS = ['(', '{'];
const RIGHT_BRACKETS = [')', '}'];
function findMatchingBracketPosition(contents, bracket, offset = 0) {
// search first occurrence of `bracket`
const firstBracketPos = contents.indexOf(bracket, offset);
if (firstBracketPos < 0) {
return -1;
}
let stackCounter = 0;
const matchingBracket = getMatchingBracket(bracket);
if (isLeftBracket(bracket)) {
const contentsLength = contents.length; // search forward
for (let i = firstBracketPos + 1; i < contentsLength; ++i) {
const c = contents[i];
if (c === bracket) {
stackCounter += 1;
} else if (c === matchingBracket) {
if (stackCounter === 0) {
return i;
}
stackCounter -= 1;
}
}
} else {
// search backward
for (let i = firstBracketPos - 1; i >= 0; --i) {
const c = contents[i];
if (c === bracket) {
stackCounter += 1;
} else if (c === matchingBracket) {
if (stackCounter === 0) {
return i;
}
stackCounter -= 1;
}
}
}
return -1;
}
function isLeftBracket(bracket) {
const leftBracketList = LEFT_BRACKETS;
return leftBracketList.includes(bracket);
}
function getMatchingBracket(bracket) {
switch (bracket) {
case '(':
return ')';
case ')':
return '(';
case '{':
return '}';
case '}':
return '{';
default:
throw new Error(`Unsupported bracket - ${bracket}`);
}
}
//# sourceMappingURL=matchBrackets.js.map