@maniascript/mslint
Version:
ManiaScript linter
55 lines (54 loc) • 2.22 kB
JavaScript
import { Node, TextLiteral, IntegerLiteral, RealLiteral, BooleanLiteral, ManiaScriptLexer, isLiteral, Kind, EnumLiteral, UnaryExpression } from '@maniascript/parser';
import { CommonTokenStream, Token } from 'antlr4ng';
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 };