@lcap/nasl
Version:
NetEase Application Specific Language
94 lines • 3.13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.check = void 0;
const utils_1 = require("./utils");
const vue_1 = require("../../utils/vue");
const asserts_1 = require("@lcap/nasl-concepts/asserts");
/** 是否在 ForEach 或者 While 节点内 */
function isAncestorHasForEachOrWhile(node) {
let parent = node.parentNode;
// 迭代到 Logic 就行了
while (parent && !(0, asserts_1.isLogic)(parent)) {
if ((0, asserts_1.isStrictForEachStatement)(parent) || (0, asserts_1.isStrictWhileStatement)(parent)) {
return true;
}
parent = parent.parentNode;
}
return false;
}
/** 是否是这条线上的最后一个节点 */
function isLastNode(node) {
const list = (0, utils_1.getBrothers)(node);
const index = list.indexOf(node);
return index === list.length - 1;
}
function isPlayground(node) {
let current = node;
while (current && current.concept !== 'Logic') {
if (current.parentKey === 'playground') {
return true;
}
else {
current = current.parentNode;
}
}
return false;
}
const listKeySet = new Set([
'body',
'logicItems',
'consequent',
'alternate',
]);
function isInStatementLine(node) {
const { parentNode, parentKey } = node;
const isInArray = Array.isArray(parentNode[parentKey]);
return (isPlayground(node) ||
(isInArray && listKeySet.has(parentKey)));
}
/** 检查节点 */
function check(input) {
const node = (0, vue_1.toRaw)(input);
if (!(0, asserts_1.isStrictEnd)(node) && !(0, asserts_1.isStrictAbort)(node) && !(0, asserts_1.isStrictBreak)(node) && !(0, asserts_1.isStrictContinue)(node)) {
return [];
}
const diagnostics = [];
const displayName = {
'End': '返回',
'Abort': '结束',
'Break': '跳出循环',
'Continue': '继续循环',
};
if (!isLastNode(node)) {
const errorDetail = {
node,
severity: 'error',
message: `${displayName[node.concept]}:不得接续其它逻辑组件,请移动位置或删除!`,
};
node.tsErrorDetail = errorDetail;
diagnostics.push(errorDetail);
}
if ((0, asserts_1.isStrictBreak)(node) || (0, asserts_1.isStrictContinue)(node)) {
if (!isAncestorHasForEachOrWhile(node)) {
const errorDetail = {
node,
severity: 'error',
message: `${displayName[node.concept]}:只能在 ForEach 和 While 内部使用。`,
};
node.tsErrorDetail = errorDetail;
diagnostics.push(errorDetail);
}
if (!isInStatementLine(node)) {
const errorDetail = {
node,
severity: 'error',
message: `${displayName[node.concept]}:只允许在逻辑线上使用。`,
};
node.tsErrorDetail = errorDetail;
diagnostics.push(errorDetail);
}
}
return diagnostics;
}
exports.check = check;
//# sourceMappingURL=continue.js.map