Skip to content
Node.java 3.5 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.stmt.Statement;
Javier Costa's avatar
Javier Costa committed
import edg.graphlib.Vertex;
Javier Costa's avatar
Javier Costa committed
import org.checkerframework.checker.nullness.qual.NonNull;
Javier Costa's avatar
Javier Costa committed
import tfm.arcs.data.ArcData;
Javier Costa's avatar
Javier Costa committed
import tfm.variables.VariableExtractor;
Javier Costa's avatar
Javier Costa committed

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

public class Node<ASTNode extends com.github.javaparser.ast.Node> extends Vertex<String, ArcData> {
Javier Costa's avatar
Javier Costa committed

    private ASTNode astNode;
Javier Costa's avatar
Javier Costa committed
    protected Set<String> declaredVariables;
    protected Set<String> definedVariables;
    protected Set<String> usedVariables;
    public <N extends Node<ASTNode>> Node(N node) {
        this(node.getId(), node.getData(), node.getAstNode());
Javier Costa's avatar
Javier Costa committed
    }

    public Node(int id, String representation, @NonNull ASTNode astNode) {
Javier Costa's avatar
Javier Costa committed
        super(String.valueOf(id), representation);
        this.astNode = astNode;
Javier Costa's avatar
Javier Costa committed

        this.declaredVariables = new HashSet<>();
        this.definedVariables = new HashSet<>();
        this.usedVariables = new HashSet<>();

        if (astNode instanceof Statement) {
            extractVariables((Statement) astNode);
        }

Javier Costa's avatar
Javier Costa committed
    }

    private void extractVariables(@NonNull Statement statement) {
        new VariableExtractor()
                .setOnVariableDeclarationListener(variable -> this.declaredVariables.add(variable))
                .setOnVariableDefinitionListener(variable -> this.definedVariables.add(variable))
                .setOnVariableUseListener(variable -> this.usedVariables.add(variable))
                .visit(statement);
Javier Costa's avatar
Javier Costa committed
    }

    public int getId() {
        return Integer.parseInt(getName());
    }

    public String toString() {
Javier Costa's avatar
Javier Costa committed
        return String.format("Node{id: %s, data: '%s', in: %s, out: %s}",
Javier Costa's avatar
Javier Costa committed
                getName(),
                getData(),
                getIncomingArrows().stream().map(arrow -> arrow.getFrom().getName()).collect(Collectors.toList()),
                getOutgoingArrows().stream().map(arc -> arc.getTo().getName()).collect(Collectors.toList()));
    }
    public ASTNode getAstNode() {
        return astNode;
Javier Costa's avatar
Javier Costa committed
    public Optional<Integer> getFileLineNumber() {
        return astNode.getBegin().isPresent() ? Optional.of(astNode.getBegin().get().line) : Optional.empty();
Javier Costa's avatar
Javier Costa committed

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 Node))
Javier Costa's avatar
Javier Costa committed
            return false;

Javier Costa's avatar
Javier Costa committed
        Node other = (Node) o;
Javier Costa's avatar
Javier Costa committed

        return Objects.equals(getData(), other.getData())
                && Objects.equals(getIncomingArrows(), other.getIncomingArrows())
                && Objects.equals(getOutgoingArrows(), other.getOutgoingArrows())
                && Objects.equals(astNode, other.astNode);
Javier Costa's avatar
Javier Costa committed
                // && Objects.equals(getName(), other.getName()) ID IS ALWAYS UNIQUE, SO IT WILL NEVER BE THE SAME
    }
Javier Costa's avatar
Javier Costa committed

    public String toGraphvizRepresentation() {
        return String.format("%s[label=\"%s: %s\"];", getId(), getId(), getData());
    }
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
}