Newer
Older
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;
import tfm.utils.Utils;
/**
* Immutable class that represents an AST node inside a CFG, PDG or SDG.
*
* @param <N> the AST node that represents
*/
private final int id;
private final String instruction;
private final N astNode;
private final Set<String> declaredVariables;
private final Set<String> definedVariables;
private final Set<String> usedVariables;
public GraphNode(int id, String instruction, @NotNull N astNode) {
astNode,
Utils.emptySet(),
Utils.emptySet(),
Utils.emptySet()
);
if (astNode instanceof Statement) {
extractVariables((Statement) astNode);
}
Collection<String> declaredVariables,
Collection<String> definedVariables,
Collection<String> usedVariables
this.declaredVariables = new HashSet<>(declaredVariables);
this.definedVariables = new HashSet<>(definedVariables);
this.usedVariables = new HashSet<>(usedVariables);
}
private void extractVariables(@NonNull Statement statement) {
new VariableExtractor()
.setOnVariableDeclarationListener(this.declaredVariables::add)
.setOnVariableDefinitionListener(this.definedVariables::add)
.setOnVariableUseListener(this.usedVariables::add)
return String.format("GraphNode{id: %s, instruction: '%s', astNodeType: %s}",
getInstruction(),
getAstNode().getClass().getSimpleName()
}
public void addDeclaredVariable(String variable) {
declaredVariables.add(variable);
}
public void addDefinedVariable(String variable) {
definedVariables.add(variable);
}
public void addUsedVariable(String variable) {
usedVariables.add(variable);
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
return Objects.equals(getId(), other.getId())
&& Objects.equals(getInstruction(), other.getInstruction())
}
@Override
public int hashCode() {
return Objects.hash(getId(), getInstruction(), getAstNode());
public Set<String> getDeclaredVariables() {
return declaredVariables;
}
public Set<String> getDefinedVariables() {
return definedVariables;
}
public Set<String> getUsedVariables() {
return usedVariables;
}
public String getInstruction() {
return instruction;