pddl-workspace
Version:
200 lines • 6.48 kB
JavaScript
"use strict";
/* --------------------------------------------------------------------------------------------
* Copyright (c) Jan Dolejsi. 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.UnknownFileInfo = exports.ParsingProblem = exports.FileInfo = exports.stripComments = void 0;
const DocumentPositionResolver_1 = require("./DocumentPositionResolver");
const PddlSyntaxTree_1 = require("./parser/PddlSyntaxTree");
const PddlTokenizer_1 = require("./parser/PddlTokenizer");
const language_1 = require("./language");
const Compilations_1 = require("./Compilations");
function stripComments(pddlText) {
const lines = pddlText.split(/\r?\n/g);
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
const index = line.indexOf(';');
if (index > -1) {
lines[i] = line.substring(0, index);
}
}
return lines.join("\n");
}
exports.stripComments = stripComments;
/**
* An abstract PDDL file.
*/
class FileInfo {
constructor(fileUri, version, name, syntaxTree, positionResolver) {
this.fileUri = fileUri;
this.version = version;
this.name = name;
this.syntaxTree = syntaxTree;
this.positionResolver = positionResolver;
this.status = language_1.FileStatus.Parsed;
this.parsingProblems = [];
this.compilations = new Compilations_1.Compilations();
}
getVersion() {
return this.version;
}
getText() {
if (this.text) {
return this.text;
}
else {
throw new Error('Accessing getText() before file was parsed');
}
}
setText(text) {
this.text = text;
}
getCompiledText() {
return this.getCompilations().applyAll(this.getText());
}
isDomain() {
return false;
}
isProblem() {
return false;
}
isUnknownPddl() {
return false;
}
isPlan() {
return false;
}
isHappenings() {
return false;
}
update(version, text, force = false) {
const isNewerVersion = (version > this.version) || force;
if (isNewerVersion) {
this.setStatus(language_1.FileStatus.Dirty);
this.version = version;
this.text = text;
}
return isNewerVersion;
}
setStatus(status) {
this.status = status;
}
getStatus() {
return this.status;
}
/**
* Adds a parsing problem.
* @param parsingProblem parsing problems
*/
addProblem(parsingProblem) {
this.parsingProblems.push(parsingProblem);
}
/**
* Adds list of parsing problems.
* @param parsingProblems parsing problems
*/
addProblems(parsingProblems) {
parsingProblems.forEach(pp => this.addProblem(pp));
}
getParsingProblems() {
return this.parsingProblems;
}
getVariableReferences(variable) {
const referenceLocations = [];
this.syntaxTree.getDefineNode().getChildrenRecursively(node => this.isVariableReference(node, variable), node => referenceLocations.push(this.getRange(node)));
return referenceLocations;
}
isVariableReference(node, variable) {
if (node.getToken().type !== PddlTokenizer_1.PddlTokenType.OpenBracket) {
return false;
}
const nonWhiteSpaceChildren = node.getNonWhitespaceChildren();
if (nonWhiteSpaceChildren.length < 1) {
return false;
}
const variableNameNode = nonWhiteSpaceChildren[0];
return variableNameNode.getToken().type === PddlTokenizer_1.PddlTokenType.Other
&& variableNameNode.getToken().tokenText.toLowerCase() === variable.name.toLowerCase();
}
getTypeReferences(typeName) {
if (!this.text) {
return [];
}
const referenceLocations = [];
const pattern = `-\\s+${typeName}\\b`;
const lines = stripComments(this.text).split('\n');
const regexp = new RegExp(pattern, "gi");
for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
const line = lines[lineIdx];
regexp.lastIndex = 0;
const match = regexp.exec(line);
if (match) {
const range = new DocumentPositionResolver_1.PddlRange({
start: new DocumentPositionResolver_1.PddlPosition(lineIdx, match.index + 2),
end: new DocumentPositionResolver_1.PddlPosition(lineIdx, match.index + match[0].length)
});
referenceLocations.push(range);
}
}
return referenceLocations;
}
getRange(node) {
return this.positionResolver.resolveToRange(node.getStart(), node.getEnd());
}
setRequirements(requirements, node) {
this.requirements = requirements;
this.requirementsNode = node;
}
getRequirements() {
if (this.requirements) {
return this.requirements;
}
else {
throw new Error('Accessing getRequirements() before file was parsed');
}
}
getRequirementsNode() {
return this.requirementsNode;
}
getDocumentPositionResolver() {
return this.positionResolver;
}
/**
* @returns code injections, code replacements
*/
getCompilations() {
return this.compilations;
}
}
exports.FileInfo = FileInfo;
/**
* Parsing problem.
*/
class ParsingProblem {
/**
* Constructs parsing problem.
* @param problem problem description to display
* @param severity problem severity
* @param range range where the problem is
*/
constructor(problem, severity, range) {
this.problem = problem;
this.severity = severity;
this.range = range;
}
}
exports.ParsingProblem = ParsingProblem;
class UnknownFileInfo extends FileInfo {
constructor(fileUri, version, positionResolver) {
super(fileUri, version, "", PddlSyntaxTree_1.PddlSyntaxTree.EMPTY, positionResolver);
}
getLanguage() {
return language_1.PddlLanguage.PDDL;
}
isUnknownPddl() {
return true;
}
}
exports.UnknownFileInfo = UnknownFileInfo;
//# sourceMappingURL=FileInfo.js.map