Loading sdg-core/src/main/java/es/upv/mist/slicing/graphs/ClassGraph.java +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; Loading Loading @@ -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); } Loading Loading @@ -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; } } sdg-core/src/main/java/es/upv/mist/slicing/graphs/GraphNodeContentVisitor.java +1 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysCFGBuilder.java +3 −1 Original line number Diff line number Diff line Loading @@ -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); } Loading sdg-core/src/main/java/es/upv/mist/slicing/nodes/VariableVisitor.java +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.*; Loading Loading @@ -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)); Loading sdg-core/src/main/java/es/upv/mist/slicing/utils/ASTUtils.java +5 −0 Original line number Diff line number Diff line Loading @@ -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; } } Loading
sdg-core/src/main/java/es/upv/mist/slicing/graphs/ClassGraph.java +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; Loading Loading @@ -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); } Loading Loading @@ -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; } }
sdg-core/src/main/java/es/upv/mist/slicing/graphs/GraphNodeContentVisitor.java +1 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading
sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysCFGBuilder.java +3 −1 Original line number Diff line number Diff line Loading @@ -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); } Loading
sdg-core/src/main/java/es/upv/mist/slicing/nodes/VariableVisitor.java +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.*; Loading Loading @@ -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)); Loading
sdg-core/src/main/java/es/upv/mist/slicing/utils/ASTUtils.java +5 −0 Original line number Diff line number Diff line Loading @@ -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; } }