UNPKG

angular-estree-parser

Version:

A parser that converts Angular source code into an ESTree-compatible form

87 lines (86 loc) 3.02 kB
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], }; }