80 lines
4.3 KiB
JavaScript
80 lines
4.3 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.isDifferent = void 0;
|
|
const recast_1 = require("recast");
|
|
const Parser_1 = require("./Parser");
|
|
const isWrapped = (node) => {
|
|
var _a;
|
|
return ((_a = node.program.body[1]) === null || _a === void 0 ? void 0 : _a.type) === 'TryStatement';
|
|
};
|
|
const getWrapped = (node) => {
|
|
var _a;
|
|
return (_a = node.program.body[1]) === null || _a === void 0 ? void 0 : _a.block.body[0];
|
|
};
|
|
const isMultiPartExpression = (node) => {
|
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
return (((_a = node.program.body[1]) === null || _a === void 0 ? void 0 : _a.type) === 'ReturnStatement' &&
|
|
((_b = node.program.body[1].argument) === null || _b === void 0 ? void 0 : _b.type) === 'CallExpression' &&
|
|
((_d = (_c = node.program.body[1].argument) === null || _c === void 0 ? void 0 : _c.arguments[0]) === null || _d === void 0 ? void 0 : _d.type) === 'Literal' &&
|
|
((_f = (_e = node.program.body[1].argument) === null || _e === void 0 ? void 0 : _e.arguments[0]) === null || _f === void 0 ? void 0 : _f.value) === '' &&
|
|
((_g = node.program.body[1].argument) === null || _g === void 0 ? void 0 : _g.callee.type) === 'MemberExpression' &&
|
|
((_h = node.program.body[1].argument) === null || _h === void 0 ? void 0 : _h.callee.object.type) === 'ArrayExpression' &&
|
|
((_j = node.program.body[1].argument) === null || _j === void 0 ? void 0 : _j.callee.property.type) === 'Identifier' &&
|
|
((_k = node.program.body[1].argument) === null || _k === void 0 ? void 0 : _k.callee.property.name) === 'join');
|
|
};
|
|
const getMultiPartExpression = (node) => {
|
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
if (!(((_a = node.program.body[1]) === null || _a === void 0 ? void 0 : _a.type) === 'ReturnStatement' &&
|
|
((_b = node.program.body[1].argument) === null || _b === void 0 ? void 0 : _b.type) === 'CallExpression' &&
|
|
((_d = (_c = node.program.body[1].argument) === null || _c === void 0 ? void 0 : _c.arguments[0]) === null || _d === void 0 ? void 0 : _d.type) === 'Literal' &&
|
|
((_f = (_e = node.program.body[1].argument) === null || _e === void 0 ? void 0 : _e.arguments[0]) === null || _f === void 0 ? void 0 : _f.value) === '' &&
|
|
((_g = node.program.body[1].argument) === null || _g === void 0 ? void 0 : _g.callee.type) === 'MemberExpression' &&
|
|
((_h = node.program.body[1].argument) === null || _h === void 0 ? void 0 : _h.callee.object.type) === 'ArrayExpression')) {
|
|
return [];
|
|
}
|
|
return node.program.body[1].argument.callee.object.elements
|
|
.map((e) => {
|
|
if ((e === null || e === void 0 ? void 0 : e.type) !== 'CallExpression' ||
|
|
e.callee.type !== 'MemberExpression' ||
|
|
e.callee.object.type !== 'FunctionExpression') {
|
|
return null;
|
|
}
|
|
const maybeExpr = e.callee.object.body.body[0];
|
|
if (maybeExpr.type !== 'TryStatement') {
|
|
return maybeExpr;
|
|
}
|
|
return maybeExpr.block.body[0];
|
|
})
|
|
.filter((e) => e !== null);
|
|
};
|
|
const isDifferent = (tmpl, tourn) => {
|
|
const tmplParsed = (0, recast_1.parse)(tmpl, {
|
|
parser: { parse: Parser_1.parseWithEsprimaNext },
|
|
});
|
|
const tournParsed = (0, recast_1.parse)(tourn, {
|
|
parser: { parse: Parser_1.parseWithEsprimaNext },
|
|
});
|
|
const problemPaths = [];
|
|
let same = recast_1.types.astNodesAreEquivalent(tmplParsed, tournParsed, problemPaths);
|
|
if (!same) {
|
|
if (isWrapped(tournParsed) && !isWrapped(tmplParsed)) {
|
|
const tournWrapped = getWrapped(tournParsed);
|
|
same = recast_1.types.astNodesAreEquivalent(tmplParsed.program.body[1], tournWrapped);
|
|
}
|
|
else if (isMultiPartExpression(tournParsed) && isMultiPartExpression(tmplParsed)) {
|
|
const tournExprs = getMultiPartExpression(tournParsed);
|
|
const tmplExprs = getMultiPartExpression(tmplParsed);
|
|
if (tournExprs.length === tmplExprs.length) {
|
|
for (let i = 0; i < tournExprs.length; i++) {
|
|
same = recast_1.types.astNodesAreEquivalent(tmplExprs[i], tournExprs[i], problemPaths);
|
|
if (!same) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return !same;
|
|
};
|
|
exports.isDifferent = isDifferent;
|
|
//# sourceMappingURL=Differ.js.map
|