UNPKG

@maniascript/mslint

Version:
54 lines (53 loc) 2.09 kB
import { ManiaScriptLexer, isLiteral, Kind, UnaryExpression } from '@maniascript/parser'; function onDefaultChannel(token) { return token.channel === ManiaScriptLexer.DEFAULT_TOKEN_CHANNEL; } function sameTokens(left, right, tokens) { const leftTokens = tokens.getTokens(left.source.token.start, left.source.token.end).filter(onDefaultChannel); const rightTokens = tokens.getTokens(right.source.token.start, right.source.token.end).filter(onDefaultChannel); if (leftTokens.length !== rightTokens.length) { return false; } let i = 0; for (const leftToken of leftTokens) { if (leftToken.type !== rightTokens[i].type || leftToken.text !== rightTokens[i].text) { return false; } i++; } return true; } function equalEnums(left, right) { return (left.class?.name === right.class?.name && left.name.name === right.name.name && left.value.name === right.value.name); } function equalLiterals(left, right) { if (left.kind !== right.kind) return false; if (left instanceof UnaryExpression && right instanceof UnaryExpression) { if (left.operator === right.operator) { return equalLiterals(left.argument, right.argument); } else { return false; } } if (!isLiteral(left) || !isLiteral(right)) return false; switch (left.kind) { case Kind.TextLiteral: return (left.value === right.value); case Kind.IntegerLiteral: return (left.value === right.value); case Kind.RealLiteral: return (left.value === right.value); case Kind.BooleanLiteral: return (left.value === right.value); case Kind.NullLiteral: return true; case Kind.NullIdLiteral: return true; case Kind.EnumLiteral: return equalEnums(left, right); } return false; } function getNodeText(node, tokens) { return tokens.getTextFromRange(tokens.get(node.source.token.start), tokens.get(node.source.token.end)); } export { sameTokens, equalEnums, equalLiterals, getNodeText };