UNPKG

@lcap/nasl

Version:

NetEase Application Specific Language

94 lines 3.13 kB
"use strict"; 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