UNPKG

pddl-workspace

Version:
189 lines 10.8 kB
/* -------------------------------------------------------------------------------------------- * Copyright (c) Jan Dolejsi 2019. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. * ------------------------------------------------------------------------------------------ */ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.VariableReferenceKind = exports.UnrecognizedVariableReferenceInfo = exports.VariableEffectReferenceInfo = exports.VariableReferenceInfo = exports.ReferenceInfo = exports.ModelHierarchy = void 0; const DomainInfo_1 = require("./DomainInfo"); const PddlTokenizer_1 = require("./parser/PddlTokenizer"); const ActionEffectParser_1 = require("./parser/ActionEffectParser"); class ModelHierarchy { constructor(domainInfo) { this.domainInfo = domainInfo; } rangeIncludesOffset(range, offset) { return this.domainInfo.getDocumentPositionResolver() .rangeIncludesOffset(range, offset); } getReferenceInfo(variableInfo, startOffset) { var _a, _b, _c, _d, _e; const referenceNode = this.domainInfo.syntaxTree.getNodeAt(startOffset); const domainActionFound = this.domainInfo.getStructures() .find(domainAction => this.rangeIncludesOffset(domainAction.getLocation(), startOffset)); // todo: support constraints // let constraintFound = this.domainInfo.getConstraints() // .find(c => c.node.includesIndex(startOffset)); if (domainActionFound) { if (domainActionFound instanceof DomainInfo_1.DurativeAction) { const durativeAction = domainActionFound; // is it referenced by the duration? if ((_a = durativeAction.duration) === null || _a === void 0 ? void 0 : _a.includesIndex(startOffset)) { return this.getReadOnlyReferenceInfo(referenceNode, variableInfo, durativeAction, "duration"); } // read by a condition? else if ((_b = durativeAction.condition) === null || _b === void 0 ? void 0 : _b.includesIndex(startOffset)) { const timeQualifierNode = ModelHierarchy.findConditionTimeQualifier(referenceNode); return this.getConditionReferenceInfo(referenceNode, variableInfo, durativeAction, timeQualifierNode); } // accessed by an effect? else if ((_c = durativeAction.effect) === null || _c === void 0 ? void 0 : _c.includesIndex(startOffset)) { const timeQualifierNode = ModelHierarchy.findConditionTimeQualifier(referenceNode); return this.getEffectReferenceInfo(referenceNode, variableInfo, durativeAction, timeQualifierNode); } else { return new VariableReferenceInfo(durativeAction, undefined, "", VariableReferenceKind.UNRECOGNIZED, referenceNode, referenceNode.expand().getText()); } } else if (domainActionFound instanceof DomainInfo_1.InstantAction) { const instantAction = domainActionFound; // read by a condition? if ((_d = instantAction.preCondition) === null || _d === void 0 ? void 0 : _d.includesIndex(startOffset)) { return this.getConditionReferenceInfo(referenceNode, variableInfo, instantAction, undefined); } // accessed by an effect? else if ((_e = instantAction.effect) === null || _e === void 0 ? void 0 : _e.includesIndex(startOffset)) { return this.getEffectReferenceInfo(referenceNode, variableInfo, instantAction); } else { return new VariableReferenceInfo(instantAction, undefined, "", VariableReferenceKind.UNRECOGNIZED, referenceNode, ""); } } else { throw new Error("Unexpected action type."); } } // else if (constraintFound) { // todo: support for constraint // } else { const range = this.domainInfo.getDocumentPositionResolver().nodeToRange(referenceNode); return new UnrecognizedVariableReferenceInfo(referenceNode, range); } } getConditionReferenceInfo(referenceNode, _variableInfo, structure, timeQualifierNode) { return this.getReadOnlyReferenceInfo(referenceNode, _variableInfo, structure, "condition", timeQualifierNode); } getReadOnlyReferenceInfo(referenceNode, _variableInfo, structure, part, timeQualifierNode) { var _a; let conditionNode = referenceNode; while (!['(=', '(>', '(<', '(>=', '(<=', '(not'].includes(conditionNode.getToken().tokenText)) { const parentNode = (_a = conditionNode.getParent()) !== null && _a !== void 0 ? _a : conditionNode; if (parentNode === timeQualifierNode || parentNode.isType(PddlTokenizer_1.PddlTokenType.Keyword) || parentNode.isDocument() || ['(and', '(at start', '(at end', '(over all'].includes(parentNode.getToken().tokenText.toLowerCase())) { break; } conditionNode = parentNode; } return new VariableReferenceInfo(structure, timeQualifierNode, part, VariableReferenceKind.READ, referenceNode, conditionNode.getText()); } getEffectReferenceInfo(referenceNode, variableInfo, structure, timeQualifierNode) { var _a; let effectNode = referenceNode; while (!['(increase', '(decrease', '(scale-up', '(scale-down', '(assign', '(not'].includes(effectNode.getToken().tokenText)) { const parentNode = (_a = effectNode.getParent()) !== null && _a !== void 0 ? _a : effectNode; if (parentNode === timeQualifierNode || parentNode.isType(PddlTokenizer_1.PddlTokenType.Keyword) || parentNode.isDocument() || ['(and', '(at start', '(at end'].includes(parentNode.getToken().tokenText.toLowerCase())) { break; } effectNode = parentNode; } const effect = ActionEffectParser_1.ActionEffectParser.parseEffect(effectNode); const kind = effect instanceof ActionEffectParser_1.VariableEffect && effect.modifies(variableInfo) ? VariableReferenceKind.WRITE : VariableReferenceKind.READ; return new VariableEffectReferenceInfo(structure, timeQualifierNode, "effect", kind, effect, referenceNode, effect.toPddlString()); } static isInsideCondition(currentNode) { return ModelHierarchy.findConditionAncestor(currentNode) !== undefined; } static findConditionAncestor(currentNode) { return currentNode.findAncestor(PddlTokenizer_1.PddlTokenType.Keyword, /^\s*:condition$/i); } static isInsideDurativeActionUnqualifiedCondition(currentNode) { return ModelHierarchy.findDurativeActionAncestor(currentNode) !== undefined && ModelHierarchy.findConditionTimeQualifier(currentNode) === undefined; } static findDurativeActionAncestor(currentNode) { return currentNode.findAncestor(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /^\(\s*:durative-action/i); } static findConditionTimeQualifier(currentNode) { return currentNode.findAncestor(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /^\(\s*(at\s+start|at\s+end|over\s+all)/i); } static isInsideDurativeActionDiscreteEffect(currentNode) { return currentNode.findAncestor(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /\(\s*:durative-action/i) !== undefined && currentNode.findAncestor(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /\(\s*(at start|at end)/i) !== undefined; } static isInsideActionOrEvent(currentNode) { return currentNode.findAncestor(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /\(\s*:(action|event)/i) !== undefined; } static isInsideEffect(currentNode) { return currentNode.findAncestor(PddlTokenizer_1.PddlTokenType.Keyword, /^\s*:effect$/i) !== undefined; } static isInsideDurativeActionUnqualifiedEffect(currentNode) { return currentNode.findAncestor(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /\(\s*:durative-action/i) !== undefined && currentNode.findAncestor(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /\(\s*(at start|at end)/i) === undefined; } static isInsideProcess(currentNode) { return currentNode.findAncestor(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /\(\s*:process/i) !== undefined; } } exports.ModelHierarchy = ModelHierarchy; class ReferenceInfo { constructor(node) { this.node = node; } } exports.ReferenceInfo = ReferenceInfo; class VariableReferenceInfo extends ReferenceInfo { constructor(structure, timeQualifierNode, part, kind, node, relevantCode) { super(node); this.structure = structure; this.timeQualifierNode = timeQualifierNode; this.part = part; this.kind = kind; this.relevantCode = relevantCode; } getTimeQualifier() { var _a, _b; return (_b = (_a = this.timeQualifierNode) === null || _a === void 0 ? void 0 : _a.getToken().tokenText.substr(1)) !== null && _b !== void 0 ? _b : ""; } toString() { return `Accessed by structure \`${this.structure.getNameOrEmpty()}\` *${this.getTimeQualifier()}* ${this.part}`; } } exports.VariableReferenceInfo = VariableReferenceInfo; class VariableEffectReferenceInfo extends VariableReferenceInfo { constructor(structure, timeQualifierNode, part, kind, effect, node, relevantCode) { super(structure, timeQualifierNode, part, kind, node, relevantCode); this.effect = effect; } } exports.VariableEffectReferenceInfo = VariableEffectReferenceInfo; class UnrecognizedVariableReferenceInfo extends VariableReferenceInfo { constructor(node, range) { super(new DomainInfo_1.UnrecognizedStructure(range), undefined, "", VariableReferenceKind.UNRECOGNIZED, node); } } exports.UnrecognizedVariableReferenceInfo = UnrecognizedVariableReferenceInfo; var VariableReferenceKind; (function (VariableReferenceKind) { VariableReferenceKind[VariableReferenceKind["READ"] = 0] = "READ"; VariableReferenceKind[VariableReferenceKind["READ_OR_WRITE"] = 1] = "READ_OR_WRITE"; VariableReferenceKind[VariableReferenceKind["WRITE"] = 2] = "WRITE"; VariableReferenceKind[VariableReferenceKind["UNRECOGNIZED"] = 3] = "UNRECOGNIZED"; })(VariableReferenceKind || (exports.VariableReferenceKind = VariableReferenceKind = {})); //# sourceMappingURL=ModelHierarchy.js.map