Commit 72e7f33e authored by Javier Costa's avatar Javier Costa
Browse files

variables

parent 1e40c14d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ public class Main {
        File file = new File("/home/jacosro/IdeaProjects/TFM/src/main/java/tfm/programs/Example2.java");
        CompilationUnit compilationUnit = JavaParser.parse(file);

        Graph<?> graph = cfg(file, compilationUnit);
        Graph<?> graph = pdg(file, compilationUnit);

        System.out.println(graph);
        System.out.println(graph.toGraphvizRepresentation());
+5 −4
Original line number Diff line number Diff line
@@ -51,11 +51,12 @@ public abstract class PDGGraph extends Graph<PDGVertex> {
        this.addArc(dataDataDependencyArc);
    }

    public Variable addNewVariable(String name, Vertex declarationNode) {
        Variable variable = new Variable(new VariableDeclaration(declarationNode), name);
        variableSet.addVariable(variable);
    public boolean containsVariable(String name) {
        return variableSet.containsVariable(name);
    }

        return variable;
    public Variable addNewVariable(String name, Vertex declarationNode) {
        return variableSet.addVariable(name, new VariableDeclaration(declarationNode));
    }

    public void addVariableWrite(String variable, Vertex currentNode) {
+37 −15
Original line number Diff line number Diff line
@@ -4,19 +4,20 @@ import com.github.javaparser.ast.expr.*;
import com.github.javaparser.ast.stmt.ExpressionStmt;
import com.github.javaparser.ast.visitor.GenericVisitorAdapter;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import org.jetbrains.annotations.NotNull;
import tfm.variables.Variable;
import tfm.variables.VariableSet;
import tfm.variables.actions.VariableAction.Actions;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;

public class VariableExtractor {

    public static class Result {
    public static class Result implements Iterable<Map.Entry<String, List<Actions>>> {

        public Map<String, List<Actions>> variableActions;
        private Map<String, List<Actions>> variableActions;

        public Result() {
            variableActions = new HashMap<>();
@@ -31,14 +32,32 @@ public class VariableExtractor {
                variableActions.put(variable, actions);
            }
        }

        public Set<String> variableNames() {
            return variableActions.keySet();
        }

        public Collection<List<Actions>> variableActions() {
            return variableActions.values();
        }

        public void forEach(BiConsumer<String, List<Actions>> action) {
            variableActions.forEach(action);
        }

        @NotNull
        @Override
        public Iterator<Map.Entry<String, List<Actions>>> iterator() {
            return variableActions.entrySet().iterator();
        }
    }

    private VariableExtractor() {
    }

    public static Result parse(Expression expression) {
    public static Result extractFrom(Expression expression) {
        VariableVisitor variableVisitor = new VariableVisitor();
        expression.accept(variableVisitor, Actions.UNKNOWN);
        expression.accept(variableVisitor, Actions.READ);

        return variableVisitor.result;
    }
@@ -48,7 +67,7 @@ public class VariableExtractor {
        private Result result;

        private VariableVisitor() {
            result = new Result();
            this.result = new Result();
        }

        @Override
@@ -80,7 +99,7 @@ public class VariableExtractor {

        @Override
        public void visit(ConditionalExpr n, Actions action) {
            System.out.println("On CondtionalExpr: [" + n + "]");
            System.out.println("On ConditionalExpr: [" + n + "]");
            n.getCondition().accept(this, action.or(Actions.READ));
            n.getThenExpr().accept(this, action.or(Actions.READ));
            n.getElseExpr().accept(this, action.or(Actions.READ));
@@ -94,8 +113,8 @@ public class VariableExtractor {

        @Override
        public void visit(FieldAccessExpr n, Actions action) {
//            System.out.println("On FieldAccessExpr: [" + n + "]");
//            n.getScope().accept(this, action.or(Actions.READ)); todo: accessing a field of a variable is a READ??
            System.out.println("On FieldAccessExpr: [" + n + "]");
            n.getScope().accept(this, action.or(Actions.READ));
        }

//        @Override
@@ -107,14 +126,17 @@ public class VariableExtractor {
        @Override
        public void visit(MethodCallExpr n, Actions action) {
            System.out.println("On MethodCallExpr: [" + n + "]");
//            n.getScope().ifPresent(expression -> expression.accept(this, action.or(Actions.READ))); todo: accessing a field of a variable is a READ??
            n.getScope().ifPresent(expression -> expression.accept(this, action.or(Actions.READ)));
            n.getArguments().forEach(expression -> expression.accept(this, action.or(Actions.READ)));
        }

        @Override
        public void visit(NameExpr n, Actions action) {
            System.out.println("On NameExpr. Found variable " + n.getNameAsString() + " and action " + action);
            result.addVariableAction(n.getNameAsString(), action);

            String variableName = n.getNameAsString();

            result.addVariableAction(variableName, action);
        }

//        @Override
@@ -139,7 +161,7 @@ public class VariableExtractor {
            System.out.println("On VariableDeclarationExpr: [" + n + "]");
            n.getVariables()
                    .forEach(variableDeclarator -> {
                        variableDeclarator.getNameAsExpression().accept(this, action.or(Actions.WRITE));
                        variableDeclarator.getNameAsExpression().accept(this, action.or(Actions.DECLARE));
                        variableDeclarator.getInitializer()
                                .ifPresent(expression -> expression.accept(this, action.or(Actions.READ)));
                    });
+6 −2
Original line number Diff line number Diff line
package tfm.variables;

import com.github.javaparser.ast.type.Type;
import tfm.variables.actions.VariableDeclaration;
import tfm.variables.actions.VariableRead;
import tfm.variables.actions.VariableWrite;
@@ -15,7 +14,7 @@ public class Variable {
    private List<VariableWrite> writes;
    private List<VariableRead> reads;

    public Variable(VariableDeclaration variableDeclaration, String name) {
    Variable(String name, VariableDeclaration variableDeclaration) {
        this.declaration = variableDeclaration;
        this.name = name;
        this.writes = new ArrayList<>();
@@ -48,6 +47,11 @@ public class Variable {
        return name.equals(other.name) && declaration.equals(other.declaration);
    }

    @Override
    public int hashCode() {
        return name.hashCode() + declaration.hashCode();
    }

    @Override
    public String toString() {
        return String.format("Variable %s declared on vertex %s", name, declaration.getNode().getId());
+19 −15
Original line number Diff line number Diff line
@@ -31,13 +31,13 @@ public class VariableSet {
        return findVariableByName(name).isPresent();
    }

    public void addVariable(Variable variable) {
        this.variableSet.add(variable);
    }
    public  Optional<VariableWrite> getLastWriteOf(@NonNull String variableName) {
        Optional<Variable> variable = findVariableByName(variableName);

        if (!variable.isPresent())
            return Optional.empty();

    public Optional<VariableWrite> getLastWriteOf(@NonNull Variable variable) {
        List<VariableWrite> writes = variable.getWrites();
        List<VariableWrite> writes = variable.get().getWrites();

        if (writes.isEmpty())
            return Optional.empty();
@@ -45,15 +45,6 @@ public class VariableSet {
        return Optional.of(writes.get(writes.size() - 1));
    }

    public  Optional<VariableWrite> getLastWriteOf(@NonNull String variableName) {
        Optional<Variable> variable = findVariableByName(variableName);

        if (!variable.isPresent())
            return Optional.empty();

        return getLastWriteOf(variable.get());
    }

    public void addRead(String variableName, VariableRead variableRead) {
        findVariableByName(variableName)
                .ifPresent(variable -> variable.addRead(variableRead));
@@ -63,4 +54,17 @@ public class VariableSet {
        findVariableByName(variableName)
                .ifPresent(variable -> variable.addWrite(variableWrite));
    }

    public Variable addVariable(String variableName, VariableDeclaration variableDeclaration) {
        Variable newVariable = new Variable(variableName, variableDeclaration);

        // check if it already exists
        if (this.variableSet.contains(newVariable)) {
            throw new IllegalStateException("Variable " + variableName + " already exists in VariableSet");
        }

        this.variableSet.add(newVariable);

        return newVariable;
    }
}
Loading