Select Git revision
webserver.py
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
BDefinitionsFinder.java 2.67 KiB
package de.tla2b.translation;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import tla2sany.semantic.ASTConstants;
import tla2sany.semantic.AssumeNode;
import tla2sany.semantic.ExprNode;
import tla2sany.semantic.ExprOrOpArgNode;
import tla2sany.semantic.OpApplNode;
import tla2sany.semantic.OpDefNode;
import tlc2.tool.ToolGlobals;
import de.tla2b.analysis.AbstractASTVisitor;
import de.tla2b.analysis.BOperation;
import de.tla2b.analysis.SpecAnalyser;
import de.tla2b.global.TranslationGlobals;
public class BDefinitionsFinder extends AbstractASTVisitor implements ASTConstants, ToolGlobals, TranslationGlobals {
private final HashSet<OpDefNode> bDefinitionsSet = new HashSet<>();
public BDefinitionsFinder(SpecAnalyser specAnalyser) {
if (specAnalyser.getConfigFileEvaluator() != null) {
bDefinitionsSet.addAll(specAnalyser.getConfigFileEvaluator().getConstantOverrideTable().values());
bDefinitionsSet.addAll(specAnalyser.getConfigFileEvaluator().getOperatorOverrideTable().values());
}
for (BOperation op : specAnalyser.getBOperations()) {
visitExprNode(op.getNode());
ArrayList<OpApplNode> existQuans = op.getExistQuans();
for (OpApplNode opApplNode : existQuans) {
ExprNode[] bdedQuantBounds = opApplNode.getBdedQuantBounds();
for (ExprNode exprNode : bdedQuantBounds) {
visitExprNode(exprNode);
}
}
}
if (specAnalyser.getInits() != null) {
for (int i = 0; i < specAnalyser.getInits().size(); i++) {
visitExprNode(specAnalyser.getInits().get(i));
}
}
for (AssumeNode assume : specAnalyser.getModuleNode().getAssumptions()) {
visitAssumeNode(assume);
}
for (OpDefNode def : specAnalyser.getInvariants()) {
bDefinitionsSet.add(def);
}
for (OpDefNode opDef : specAnalyser.getModuleNode().getOpDefs()) {
String defName = opDef.getName().toString();
// GOAL, ANIMATION_FUNCTION, ANIMATION_IMGxx, SET_PREF_xxx,
if (defName.equals("GOAL") || defName.startsWith("ANIMATION_") || defName.startsWith("CUSTOM_GRAPH_")
|| defName.startsWith("SET_PREF_") || defName.startsWith("HEURISTIC_FUNCTION")|| defName.startsWith("SCOPE_")) {
bDefinitionsSet.add(opDef);
}
}
HashSet<OpDefNode> temp = new HashSet<>(bDefinitionsSet);
for (OpDefNode opDefNode : temp) {
visitExprNode(opDefNode.getBody());
}
}
@Override
public void visitUserDefinedNode(OpApplNode n) {
OpDefNode def = (OpDefNode) n.getOperator();
if (bDefinitionsSet.add(def)) {
// visit body only once
visitExprNode(def.getBody());
}
for (ExprOrOpArgNode exprOrOpArgNode : n.getArgs()) {
visitExprOrOpArgNode(exprOrOpArgNode);
}
}
public Set<OpDefNode> getBDefinitionsSet() {
return bDefinitionsSet;
}
}