Skip to content
GraphNode.java 4.25 KiB
Newer Older
Javier Costa's avatar
Javier Costa committed
package tfm.nodes;
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
import com.github.javaparser.ast.Node;
Javier Costa's avatar
Javier Costa committed
import org.jetbrains.annotations.NotNull;
import tfm.graphs.cfg.CFG;
import tfm.graphs.pdg.PDG;
import tfm.graphs.sdg.SDG;
jacosro's avatar
jacosro committed
import tfm.nodes.type.NodeType;
Javier Costa's avatar
Javier Costa committed
import tfm.utils.Utils;
Javier Costa's avatar
Javier Costa committed
import tfm.variables.VariableExtractor;
Javier Costa's avatar
Javier Costa committed

import java.util.Collection;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
Javier Costa's avatar
Javier Costa committed

 * Represents a node in the various graphs ({@link CFG CFG},
 * {@link PDG PDG} and {@link SDG SDG}),
 * including its AST representation and the connections it has to other nodes
 * in the same graph. It can hold a string of characters that will be used
 * to represent it.
 * <br/>
 * It is immutable.
 * @param <N> The type of the AST represented by this node.
 */
public class GraphNode<N extends Node> implements Comparable<GraphNode<?>> {
Javier Costa's avatar
Javier Costa committed

jacosro's avatar
jacosro committed
    public static final NodeFactory DEFAULT_FACTORY = TypeNodeFactory.fromType(NodeType.STATEMENT);
jacosro's avatar
jacosro committed

    private NodeType nodeType;

    private final String instruction;
    private final N astNode;
Javier Costa's avatar
Javier Costa committed

    private final Set<String> declaredVariables;
    private final Set<String> definedVariables;
    private final Set<String> usedVariables;
jacosro's avatar
jacosro committed
    GraphNode(long id, NodeType type, String instruction, @NotNull N astNode) {
Javier Costa's avatar
Javier Costa committed
        this(
                id,
jacosro's avatar
jacosro committed
                type,
Javier Costa's avatar
Javier Costa committed
                instruction,
Javier Costa's avatar
Javier Costa committed
                astNode,
                Utils.emptySet(),
                Utils.emptySet(),
                Utils.emptySet()
        );
Javier Costa's avatar
Javier Costa committed
        extractVariables(astNode);
Javier Costa's avatar
Javier Costa committed
    }

jacosro's avatar
jacosro committed
                NodeType type,
Javier Costa's avatar
Javier Costa committed
                String instruction,
                Collection<String> declaredVariables,
                Collection<String> definedVariables,
                Collection<String> usedVariables
Javier Costa's avatar
Javier Costa committed
    ) {
Javier Costa's avatar
Javier Costa committed
        this.id = id;
jacosro's avatar
jacosro committed
        this.nodeType = type;
Javier Costa's avatar
Javier Costa committed
        this.instruction = instruction;
        this.astNode = astNode;
Javier Costa's avatar
Javier Costa committed

        this.declaredVariables = new HashSet<>(declaredVariables);
        this.definedVariables = new HashSet<>(definedVariables);
        this.usedVariables = new HashSet<>(usedVariables);
Javier Costa's avatar
Javier Costa committed
    }

Javier Costa's avatar
Javier Costa committed
    private void extractVariables(@NotNull Node node) {
Javier Costa's avatar
Javier Costa committed
        new VariableExtractor()
                .setOnVariableDeclarationListener(this.declaredVariables::add)
                .setOnVariableDefinitionListener(this.definedVariables::add)
                .setOnVariableUseListener(this.usedVariables::add)
Javier Costa's avatar
Javier Costa committed
                .visit(node);
Javier Costa's avatar
Javier Costa committed
    }

Javier Costa's avatar
Javier Costa committed
        return id;
Javier Costa's avatar
Javier Costa committed
    }

    public String toString() {
jacosro's avatar
jacosro committed
        return String.format("GraphNode{id: %s, type: %s, instruction: '%s', astNodeType: %s}",
Javier Costa's avatar
Javier Costa committed
                getId(),
jacosro's avatar
jacosro committed
                getNodeType(),
                getInstruction(),
                getAstNode().getClass().getSimpleName()
Javier Costa's avatar
Javier Costa committed
        );
Javier Costa's avatar
Javier Costa committed
    }
Javier Costa's avatar
Javier Costa committed
    public N getAstNode() {
        return astNode;
Javier Costa's avatar
Javier Costa committed
    public void addDeclaredVariable(String variable) {
        declaredVariables.add(variable);
    }

    public void addDefinedVariable(String variable) {
        definedVariables.add(variable);
    }

    public void addUsedVariable(String variable) {
        usedVariables.add(variable);
    }

Javier Costa's avatar
Javier Costa committed
    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;

Javier Costa's avatar
Javier Costa committed
        if (!(o instanceof GraphNode))
Javier Costa's avatar
Javier Costa committed
            return false;

        GraphNode<?> other = (GraphNode<?>) o;
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
        return Objects.equals(getId(), other.getId())
jacosro's avatar
jacosro committed
                && Objects.equals(getNodeType(), other.getNodeType())
Javier Costa's avatar
Javier Costa committed
                && Objects.equals(getInstruction(), other.getInstruction())
Javier Costa's avatar
Javier Costa committed
                && Objects.equals(astNode, other.astNode);
Javier Costa's avatar
Javier Costa committed
    }
Javier Costa's avatar
Javier Costa committed
    @Override
    public int hashCode() {
jacosro's avatar
jacosro committed
        return Objects.hash(getId(), getNodeType(), getInstruction(), getAstNode());
Javier Costa's avatar
Javier Costa committed
    }
Javier Costa's avatar
Javier Costa committed

    public Set<String> getDeclaredVariables() {
        return declaredVariables;
    }

    public Set<String> getDefinedVariables() {
        return definedVariables;
    }

    public Set<String> getUsedVariables() {
        return usedVariables;
    }
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
    public String getInstruction() {
        return instruction;
Javier Costa's avatar
Javier Costa committed
    }

    @Override
    public int compareTo(@NotNull GraphNode<?> o) {
jacosro's avatar
jacosro committed

    public NodeType getNodeType() {
        return nodeType;
    }
Javier Costa's avatar
Javier Costa committed
}