angular-estree-parser
Version:
A parser that converts Angular source code into an ESTree-compatible form
87 lines (86 loc) • 3.02 kB
JavaScript
function stripSurroundingSpaces({ start: startIndex, end: endIndex }, text) {
let start = startIndex;
let end = endIndex;
while (end !== start && /\s/.test(text[end - 1])) {
end--;
}
while (start !== end && /\s/.test(text[start])) {
start++;
}
return { start, end };
}
function expandSurroundingSpaces({ start: startIndex, end: endIndex }, text) {
let start = startIndex;
let end = endIndex;
while (end !== text.length && /\s/.test(text[end])) {
end++;
}
while (start !== 0 && /\s/.test(text[start - 1])) {
start--;
}
return { start, end };
}
function expandSurroundingParens(span, text) {
return text[span.start - 1] === '(' && text[span.end] === ')'
? { start: span.start - 1, end: span.end + 1 }
: span;
}
export function fitSpans(span, text, hasParentParens) {
let parensCount = 0;
const outerSpan = { start: span.start, end: span.end };
while (true) {
const spacesExpandedSpan = expandSurroundingSpaces(outerSpan, text);
const parensExpandedSpan = expandSurroundingParens(spacesExpandedSpan, text);
if (spacesExpandedSpan.start === parensExpandedSpan.start &&
spacesExpandedSpan.end === parensExpandedSpan.end) {
break;
}
outerSpan.start = parensExpandedSpan.start;
outerSpan.end = parensExpandedSpan.end;
parensCount++;
}
return {
hasParens: (hasParentParens ? parensCount - 1 : parensCount) !== 0,
outerSpan: stripSurroundingSpaces(hasParentParens
? { start: outerSpan.start + 1, end: outerSpan.end - 1 }
: outerSpan, text),
innerSpan: stripSurroundingSpaces(span, text),
};
}
function getCharacterSearchTestFunction(pattern) {
if (typeof pattern === 'string') {
return (character) => character === pattern;
}
return (character) => pattern.test(character);
}
export function getCharacterLastIndex(text, pattern, fromIndex) {
const test = getCharacterSearchTestFunction(pattern);
for (let index = fromIndex; index >= 0; index--) {
const character = text[index];
if (test(character)) {
return index;
}
}
throw new Error(`Cannot find front char ${pattern} from index ${fromIndex} in ${JSON.stringify(text)}`);
}
export function getCharacterIndex(text, pattern, fromIndex) {
const test = getCharacterSearchTestFunction(pattern);
for (let index = fromIndex; index < text.length; index++) {
const character = text[index];
if (test(character)) {
return index;
}
}
throw new Error(`Cannot find character ${pattern} from index ${fromIndex} in ${JSON.stringify(text)}`);
}
export function lowercaseFirst(str) {
return str.slice(0, 1).toLowerCase() + str.slice(1);
}
export function sourceSpanToLocationInformation(span) {
const { start, end } = span;
return {
start,
end,
range: [start, end],
};
}