Commit 83db3876 authored by Sergio Pérez's avatar Sergio Pérez
Browse files

Added dynamic init & VariableActions for field declarations

parent 955981f3
Loading
Loading
Loading
Loading
+33 −2
Original line number Diff line number Diff line
package es.upv.mist.slicing.graphs;

import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.body.*;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import es.upv.mist.slicing.arcs.clg.ExtendsArc;
import es.upv.mist.slicing.arcs.clg.ImplementsArc;
import es.upv.mist.slicing.arcs.clg.MemberArc;
import es.upv.mist.slicing.graphs.cfg.CFG;
import es.upv.mist.slicing.utils.ASTUtils;
import es.upv.mist.slicing.utils.Utils;
import org.jgrapht.graph.DefaultEdge;
@@ -90,7 +90,6 @@ public class ClassGraph extends DirectedPseudograph<ClassGraph.Vertex, DefaultEd
    /** Add a field declaration vertex to the class graph */
    protected void addFieldDeclaration(FieldDeclaration n, ClassOrInterfaceDeclaration c){
        ClassGraph.Vertex v = new ClassGraph.Vertex(n);
        // Key value: hashCode + toString() to avoid multiple field declarations with the same syntax in different classes
        vertexDeclarationMap.put(c.getFullyQualifiedName().get()+ "." + n.toString(), v);
        addVertex(v);
    }
@@ -190,6 +189,38 @@ public class ClassGraph extends DirectedPseudograph<ClassGraph.Vertex, DefaultEd
            return super.toString();
        }
    }

    /** Returns a NodeList with the static FieldDeclarations and InitializerDeclarations of the given class */
    public NodeList<BodyDeclaration<?>> getStaticInit(String className){
        return getClassInit(className,true);
    }

    /** Returns a NodeList with the dynamic FieldDeclarations and InitializerDeclarations of the given class */
    public NodeList<BodyDeclaration<?>> getDynInit(String className){
        return getClassInit(className,false);
    }

    /** Returns a NodeList with FieldDeclarations and InitializerDeclarations static/dynamic items of the given class */
    private NodeList<BodyDeclaration<?>> getClassInit(String className, Boolean isStatic){
        Vertex classNode = vertexDeclarationMap.get(className);
        NodeList<BodyDeclaration<?>> members = classNode.declaration.asClassOrInterfaceDeclaration().getMembers();
        NodeList<BodyDeclaration<?>> classInit = new NodeList<>();
        for (BodyDeclaration<?> member : members) {
            if (member instanceof CallableDeclaration<?>)
                continue;

            if (member.isFieldDeclaration()) {
                if (isStatic == member.asFieldDeclaration().hasModifier(Modifier.Keyword.STATIC))
                    classInit.add(member);
                continue;
            }

            if (member.isInitializerDeclaration())
                if (isStatic == member.asInitializerDeclaration().isStatic())
                    classInit.add(member);
        }
        return classInit;
    }
}

+1 −3
Original line number Diff line number Diff line
@@ -87,9 +87,7 @@ public class GraphNodeContentVisitor<A> extends VoidVisitorAdapter<A> {
    }

    @Override
    public void visit(FieldDeclaration n, A arg) {
        throw new UnsupportedOperationException();
    }
    public void visit(FieldDeclaration n, A arg) { super.visit(n, arg); }

    @Override
    public void visit(ForEachStmt n, A arg) {
+3 −1
Original line number Diff line number Diff line
@@ -33,7 +33,9 @@ public class JSysCFGBuilder extends ACFGBuilder {
            connectTo(n);
        }
        // 2. Insert dynamic class code
        // TODO
        ClassOrInterfaceDeclaration containerClass = ((JSysCFG) graph).getDeclarationClass();
        NodeList<BodyDeclaration<?>> dynInitList = ((JSysCFG) graph).getClassGraph().getDynInit(containerClass.getNameAsString());
        dynInitList.accept(this, arg);

    }

+17 −0
Original line number Diff line number Diff line
package es.upv.mist.slicing.nodes;

import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.body.Parameter;
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.expr.*;
@@ -174,6 +175,22 @@ public class VariableVisitor extends GraphNodeContentVisitor<VariableVisitor.Act
        }
    }

    @Override
    public void visit(FieldDeclaration n, Action action) {
        for (VariableDeclarator v : n.getVariables()) {

            // Change the name of the FieldDeclaration Variable to "this.varName"
            NameExpr nameExpr = v.getNameAsExpression();
            nameExpr.setName(new SimpleName("this." + nameExpr.getNameAsString()));

            nameExpr.accept(this, action.or(Action.DECLARATION));
            if (v.getInitializer().isPresent()) {
                v.getInitializer().get().accept(this, action);
                v.getNameAsExpression().accept(this, Action.DEFINITION);
            }
        }
    }

    @Override
    public void visit(CatchClause n, Action arg) {
        n.getParameter().accept(this, arg.or(Action.DECLARATION));
+5 −0
Original line number Diff line number Diff line
@@ -126,4 +126,9 @@ public class ASTUtils {
    public static boolean shouldVisitArgumentsForMethodCalls(Resolvable<? extends ResolvedMethodLikeDeclaration> call, GraphNode<?> graphNode) {
        return shouldVisitArgumentsForMethodCalls(call) || graphNode == null;
    }

    public static boolean constructorHasExplicitConstructorInvocation(ConstructorDeclaration declaration) {
        return !getCallableBody(declaration).getStatements().isEmpty() &&
                getCallableBody(declaration).getStatements().getFirst().get() instanceof ExplicitConstructorInvocationStmt;
    }
}