Skip to content
GraphNode.java 5.99 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 com.github.javaparser.ast.stmt.Statement;
Javier Costa's avatar
Javier Costa committed
import edg.graphlib.Arrow;
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 org.jetbrains.annotations.NotNull;
Javier Costa's avatar
Javier Costa committed
import tfm.arcs.Arc;
Javier Costa's avatar
Javier Costa committed
import tfm.arcs.data.ArcData;
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

Javier Costa's avatar
Javier Costa committed
import java.util.*;
Javier Costa's avatar
Javier Costa committed
import java.util.stream.Collectors;

Javier Costa's avatar
Javier Costa committed
public class GraphNode<N extends Node> extends Vertex<String, ArcData> {
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
    private int id;

Javier Costa's avatar
Javier Costa committed
    protected N astNode;
Javier Costa's avatar
Javier Costa committed
    protected Set<String> declaredVariables;
    protected Set<String> definedVariables;
    protected Set<String> usedVariables;
Javier Costa's avatar
Javier Costa committed
    public <N1 extends GraphNode<N>> GraphNode(N1 node) {
Javier Costa's avatar
Javier Costa committed
        this(
                node.getId(),
                node.getData(),
                node.getAstNode(),
Javier Costa's avatar
Javier Costa committed
                node.getIncomingArcs(),
                node.getOutgoingArcs(),
Javier Costa's avatar
Javier Costa committed
                node.getDeclaredVariables(),
                node.getDefinedVariables(),
                node.getUsedVariables()
        );
Javier Costa's avatar
Javier Costa committed
    }

Javier Costa's avatar
Javier Costa committed
    public GraphNode(int id, String representation, @NotNull N astNode) {
Javier Costa's avatar
Javier Costa committed
        this(
                id,
                representation,
                astNode,
                Utils.emptyList(),
                Utils.emptyList(),
                Utils.emptySet(),
                Utils.emptySet(),
                Utils.emptySet()
        );
    }

Javier Costa's avatar
Javier Costa committed
    public GraphNode(
Javier Costa's avatar
Javier Costa committed
                int id,
                String representation,
Javier Costa's avatar
Javier Costa committed
                @NonNull N astNode,
Javier Costa's avatar
Javier Costa committed
                Collection<? extends Arrow<String, ArcData>> incomingArcs,
                Collection<? extends Arrow<String, ArcData>> outgoingArcs,
                Set<String> declaredVariables,
                Set<String> definedVariables,
                Set<String> usedVariables
    ) {
Javier Costa's avatar
Javier Costa committed
        super(null, representation);

        this.id = id;
        this.astNode = astNode;
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
        this.declaredVariables = declaredVariables;
        this.definedVariables = definedVariables;
        this.usedVariables = usedVariables;

        this.setIncomingArcs(incomingArcs);
        this.setOutgoingArcs(outgoingArcs);
Javier Costa's avatar
Javier Costa committed

        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
    }

Javier Costa's avatar
Javier Costa committed
    public void setId(int id) {
        this.id = id;
    }

Javier Costa's avatar
Javier Costa committed
    public int getId() {
Javier Costa's avatar
Javier Costa committed
        return id;
Javier Costa's avatar
Javier Costa committed
    }

    public String toString() {
Javier Costa's avatar
Javier Costa committed
        return String.format("GraphNode{id: %s, data: '%s', in: %s, out: %s}",
Javier Costa's avatar
Javier Costa committed
                getId(),
Javier Costa's avatar
Javier Costa committed
                getData(),
Javier Costa's avatar
Javier Costa committed
                getIncomingArcs().stream().map(arc -> arc.getFromNode().getId()).collect(Collectors.toList()),
                getOutgoingArcs().stream().map(arc -> arc.getToNode().getId()).collect(Collectors.toList()));
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 setAstNode(N node) {
        this.astNode = node;
    }

Javier Costa's avatar
Javier Costa committed
    public Optional<Integer> getFileLineNumber() {
Javier Costa's avatar
Javier Costa committed
        return astNode.getBegin()
                .map(begin -> begin.line);
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 GraphNode))
Javier Costa's avatar
Javier Costa committed
            return false;

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

        return Objects.equals(getData(), other.getData())
Javier Costa's avatar
Javier Costa committed
                && Objects.equals(astNode, other.astNode);
Javier Costa's avatar
Javier Costa committed
//                && Objects.equals(getIncomingArrows(), other.getIncomingArrows())
//                && Objects.equals(getOutgoingArrows(), other.getOutgoingArrows())
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
    }
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

Javier Costa's avatar
Javier Costa committed
    public List<Arc<ArcData>> getIncomingArcs() {
        return super.getIncomingArrows().stream()
                .map(arrow -> (Arc<ArcData>) arrow)
                .collect(Collectors.toList());
    }

    public List<Arc<ArcData>> getOutgoingArcs() {
        return super.getOutgoingArrows().stream()
                .map(arrow -> (Arc<ArcData>) arrow)
                .collect(Collectors.toList());
    }

Javier Costa's avatar
Javier Costa committed
    public <A extends Arrow<String, ArcData>, C extends Collection<A>> void setIncomingArcs(C arcs) {
        for (A arc : arcs) {
            this.addIncomingEdge(arc.getFrom(), arc.getCost());
        }
    }

    public <A extends Arrow<String, ArcData>, C extends Collection<A>> void setOutgoingArcs(C arcs) {
        for (A arc : arcs) {
            this.addOutgoingEdge(arc.getTo(), arc.getCost());
        }
    }
Javier Costa's avatar
Javier Costa committed

    /**
     * Deprecated. Use getIncomingArcs instead
     * @throws UnsupportedOperationException
     */
    @Deprecated
    @Override
    public List<Arrow<String, ArcData>> getIncomingArrows() {
        return super.getIncomingArrows();
    }

    /**
     * Deprecated. Use getOutgoingArcs instead
     * @throws UnsupportedOperationException
     */
    @Deprecated
    @Override
    public List<Arrow<String, ArcData>> getOutgoingArrows() {
        return super.getOutgoingArrows();
    }
Javier Costa's avatar
Javier Costa committed
}