diff --git a/build.gradle b/build.gradle index 771bce0c25ba0426750e4ff784145fc3f250b6ea..c7e02d1234f31f89a306cbc191bcc5fca1af1c58 100644 --- a/build.gradle +++ b/build.gradle @@ -69,6 +69,10 @@ jacocoTestReport { //} +test { + exclude('testing') +} + jar { from sourceSets.main.allJava } jar { from configurations.releaseJars.collect { it.isDirectory() ? it : zipTree(it) } diff --git a/src/main/java/de/tla2b/analysis/AbstractASTVisitor.java b/src/main/java/de/tla2b/analysis/AbstractASTVisitor.java index 9be8b30208d0444890f8c7c5c22dbdf55aa48eb6..b49e64a8fcac21d5e2602871eba0df352a0c6983 100644 --- a/src/main/java/de/tla2b/analysis/AbstractASTVisitor.java +++ b/src/main/java/de/tla2b/analysis/AbstractASTVisitor.java @@ -174,8 +174,9 @@ public class AbstractASTVisitor extends BuiltInOPs implements ASTConstants { } public void visitUserDefinedNode(OpApplNode n) { - ExprOrOpArgNode[] arguments = n.getArgs(); - for (ExprOrOpArgNode exprOrOpArgNode : arguments) { + + + for (ExprOrOpArgNode exprOrOpArgNode : n.getArgs()) { visitExprOrOpArgNode(exprOrOpArgNode); } } diff --git a/src/main/java/de/tla2b/analysis/SpecAnalyser.java b/src/main/java/de/tla2b/analysis/SpecAnalyser.java index 2152ce5c212a3cb19d9779dc3cad628b9b73a976..d42406e2d7d8ceb9382425eee65450ecfad6dad0 100644 --- a/src/main/java/de/tla2b/analysis/SpecAnalyser.java +++ b/src/main/java/de/tla2b/analysis/SpecAnalyser.java @@ -17,8 +17,8 @@ import de.tla2b.exceptions.NotImplementedException; import de.tla2b.exceptions.SemanticErrorException; import de.tla2b.global.BBuiltInOPs; import de.tla2b.global.TranslationGlobals; +import de.tla2b.translation.UsedDefinitionsFinder; import de.tla2b.types.IType; - import tla2sany.semantic.ASTConstants; import tla2sany.semantic.AssumeNode; import tla2sany.semantic.ExprNode; @@ -74,7 +74,7 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, private ArrayList<RecursiveDefinition> recursiveDefinitions = new ArrayList<RecursiveDefinition>(); - private ConfigfileEvaluator conEval; + private ConfigfileEvaluator configFileEvaluator; private SpecAnalyser(ModuleNode m) { this.moduleNode = m; @@ -89,7 +89,7 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, specAnalyser.next = conEval.getNextNode(); specAnalyser.invariants = conEval.getInvariants(); specAnalyser.bConstants = conEval.getbConstantList(); - specAnalyser.conEval = conEval; + specAnalyser.configFileEvaluator = conEval; return specAnalyser; } @@ -123,7 +123,11 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, findOperations(); findDefinitions(); - usedDefinitions.addAll(bDefinitionsSet); + + UsedDefinitionsFinder definitionFinder = new UsedDefinitionsFinder(this); + + usedDefinitions = definitionFinder.getUsedDefinitions(); + //usedDefinitions.addAll(bDefinitionsSet); // test whether there is a init predicate if there is a variable if (moduleNode.getVariableDecls().length > 0 && inits == null) { @@ -371,8 +375,8 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, */ private void findDefinitions() throws ConfigFileErrorException { - if (conEval != null) { - bDefinitionsSet.addAll(conEval.getConstantOverrideTable().values()); + if (configFileEvaluator != null) { + bDefinitionsSet.addAll(configFileEvaluator.getConstantOverrideTable().values()); } AssumeNode[] assumes = moduleNode.getAssumptions(); @@ -386,6 +390,10 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, } } + +// if(nextExpr != null){ +// findDefintionInExprNode(nextExpr, null); +// } if (bOperations != null) { for (int i = 0; i < bOperations.size(); i++) { ExprNode node = bOperations.get(i).getNode(); @@ -422,7 +430,8 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, for (OpDefNode def : defSet) { findDefintionInExprNode(def.getBody(), null); } - + + //bDefinitionsSet.remove(next); } /** @@ -567,7 +576,7 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, * */ private void evalRecursiveFunctions() throws NotImplementedException { - Set<OpDefNode> set = new HashSet<OpDefNode>(bDefinitionsSet); + Set<OpDefNode> set = new HashSet<OpDefNode>(usedDefinitions); for (OpDefNode def : set) { if (def.getInRecursive()) { bDefinitionsSet.remove(def); @@ -645,4 +654,12 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, return this.moduleNode; } + public ConfigfileEvaluator getConfigFileEvaluator(){ + return configFileEvaluator; + } + + public ArrayList<OpDefNode> getInvariants(){ + return invariants; + } + } diff --git a/src/main/java/de/tla2b/translation/UsedDefinitionsFinder.java b/src/main/java/de/tla2b/translation/UsedDefinitionsFinder.java new file mode 100644 index 0000000000000000000000000000000000000000..8fd0f23852c8b6851a884755c63ece15a5229013 --- /dev/null +++ b/src/main/java/de/tla2b/translation/UsedDefinitionsFinder.java @@ -0,0 +1,85 @@ +package de.tla2b.translation; + +import java.util.Collection; +import java.util.HashSet; + +import tla2sany.semantic.ASTConstants; +import tla2sany.semantic.ModuleNode; +import tla2sany.semantic.OpApplNode; +import tla2sany.semantic.OpDefNode; +import tlc2.tool.ToolGlobals; +import de.tla2b.analysis.AbstractASTVisitor; +import de.tla2b.analysis.SpecAnalyser; +import de.tla2b.global.BBuiltInOPs; +import de.tla2b.global.TranslationGlobals; +import de.tla2b.types.IType; + +public class UsedDefinitionsFinder extends AbstractASTVisitor implements + ASTConstants, ToolGlobals, IType, TranslationGlobals { + + private final HashSet<OpDefNode> usedDefinitions = new HashSet<OpDefNode>(); + + public UsedDefinitionsFinder(SpecAnalyser specAnalyser) { + + if(specAnalyser.getConfigFileEvaluator() != null){ + Collection<OpDefNode> cons = specAnalyser.getConfigFileEvaluator().getConstantOverrideTable().values(); + for (OpDefNode def : cons) { + visitExprNode(def.getBody()); + } + Collection<OpDefNode> ops = specAnalyser.getConfigFileEvaluator().getOperatorOverrideTable().values(); + for (OpDefNode def : cons) { + visitExprNode(def.getBody()); + } + usedDefinitions.addAll(cons); + usedDefinitions.addAll(ops); + } + + visitAssumptions(specAnalyser.getModuleNode().getAssumptions()); + + + if(specAnalyser.getNext() != null){ + visitExprNode(specAnalyser.getNext()); + } + + if (specAnalyser.getInits() != null) { + for (int i = 0; i < specAnalyser.getInits().size(); i++) { + visitExprNode(specAnalyser.getInits().get(i)); + } + } + + if (specAnalyser.getInvariants() != null) { + for (int i = 0; i < specAnalyser.getInvariants().size(); i++) { + OpDefNode def = specAnalyser.getInvariants().get(i); + usedDefinitions.add(def); + visitExprNode(def.getBody()); + } + } + } + + public HashSet<OpDefNode> getUsedDefinitions(){ + return usedDefinitions; + } + + @Override + public void visitUserDefinedNode(OpApplNode n) { + super.visitUserDefinedNode(n); + + OpDefNode def = (OpDefNode) n.getOperator(); + ModuleNode moduleNode = def.getSource() + .getOriginallyDefinedInModuleNode(); + if (moduleNode.getName().toString().equals("TLA2B")) { + return; + } + if (BBuiltInOPs.contains(def.getName()) + && STANDARD_MODULES.contains(def.getSource() + .getOriginallyDefinedInModuleNode().getName() + .toString())) { + return; + } + if (usedDefinitions.add(def)) { + visitExprNode(def.getBody()); + } + + + } +}