decaffeinate-parser
Version:
A better AST for CoffeeScript, inspired by CoffeeScriptRedux.
28 lines (27 loc) • 1.25 kB
JavaScript
import SourceType from 'coffee-lex/dist/SourceType';
import { firstSemanticTokenAfter, firstSemanticTokenBefore } from './getLocation';
import locationDataFromSourceRange from './locationDataFromSourceRange';
import sourceRangeFromLocationData from './sourceRangeFromLocationData';
export default function expandToIncludeParens(context, locationData) {
var sourceRange = sourceRangeFromLocationData(context, locationData);
// eslint-disable-next-line no-constant-condition
while (true) {
var tokens = getSurroundingParens(context, sourceRange);
if (tokens === null) {
break;
}
sourceRange = { start: tokens.openParen.start, end: tokens.closeParen.end };
}
return locationDataFromSourceRange(context, sourceRange);
}
function getSurroundingParens(context, sourceRange) {
var tokenBefore = firstSemanticTokenBefore(context, sourceRange.start);
var tokenAfter = firstSemanticTokenAfter(context, sourceRange.end);
if (tokenBefore === null || tokenBefore.type !== SourceType.LPAREN) {
return null;
}
if (tokenAfter === null || tokenAfter.type !== SourceType.RPAREN) {
return null;
}
return { openParen: tokenBefore, closeParen: tokenAfter };
}