pddl-workspace
Version:
189 lines • 10.8 kB
JavaScript
/* --------------------------------------------------------------------------------------------
* Copyright (c) Jan Dolejsi 2019. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */
;
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