Loading sdg-core/src/main/java/es/upv/mist/slicing/graphs/ClassGraph.java +10 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import com.github.javaparser.resolution.UnsolvedSymbolException; import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration; import com.github.javaparser.resolution.types.ResolvedReferenceType; import com.github.javaparser.resolution.types.ResolvedType; import es.upv.mist.slicing.arcs.Arc; import es.upv.mist.slicing.nodes.ObjectTree; import es.upv.mist.slicing.utils.ASTUtils; Loading Loading @@ -145,6 +146,15 @@ public class ClassGraph extends DirectedPseudograph<ClassGraph.Vertex, ClassGrap } } public Optional<ObjectTree> generateObjectTreeForType(ResolvedType type) { if (type.isReferenceType()) { Vertex v = vertexDeclarationMap.get(mapKey(type.asReferenceType())); if (v != null) return Optional.of(generateObjectTreeFor(v)); } return Optional.empty(); } public ObjectTree generateObjectTreeFor(ClassOrInterfaceDeclaration declaration) { return generateObjectTreeFor(vertexDeclarationMap.get(mapKey(declaration))); } Loading sdg-core/src/main/java/es/upv/mist/slicing/graphs/ExpressionObjectTreeFinder.java +10 −8 Original line number Diff line number Diff line Loading @@ -6,7 +6,6 @@ import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import com.github.javaparser.resolution.Resolvable; import com.github.javaparser.resolution.declarations.ResolvedMethodLikeDeclaration; import com.github.javaparser.resolution.types.ResolvedReferenceType; import com.github.javaparser.utils.Pair; import es.upv.mist.slicing.nodes.GraphNode; import es.upv.mist.slicing.nodes.ObjectTree; Loading @@ -29,9 +28,8 @@ public class ExpressionObjectTreeFinder { public void handleVariableDeclarator(VariableDeclarator variableDeclarator) { assert variableDeclarator.getInitializer().isPresent(); VariableAction targetAction = locateVAVariableDeclarator(variableDeclarator.getNameAsString()); ResolvedReferenceType type = variableDeclarator.getType().resolve().asReferenceType(); var fields = ClassGraph.getInstance().generateObjectTreeFor(type); targetAction.getObjectTree().addAll(fields); ClassGraph.getInstance().generateObjectTreeForType(variableDeclarator.getType().resolve()) .ifPresent(objectTree -> targetAction.getObjectTree().addAll(objectTree)); locateExpressionResultTrees(variableDeclarator.getInitializer().get()) .forEach(pair -> markTransference(pair, targetAction, "")); } Loading @@ -54,9 +52,8 @@ public class ExpressionObjectTreeFinder { } public void handleAssignExpr(AssignExpr assignExpr, VariableAction assignTarget, String targetMember) { ResolvedReferenceType type = assignExpr.getTarget().calculateResolvedType().asReferenceType(); var fields = ClassGraph.getInstance().generateObjectTreeFor(type); assignTarget.getObjectTree().addAll(fields); ClassGraph.getInstance().generateObjectTreeForType(assignExpr.getTarget().calculateResolvedType()) .ifPresent(fields -> assignTarget.getObjectTree().addAll(fields)); locateExpressionResultTrees(assignExpr.getValue()) .forEach(pair -> markTransference(pair, assignTarget, targetMember)); } Loading Loading @@ -97,6 +94,10 @@ public class ExpressionObjectTreeFinder { public void visit(NameExpr n, String arg) { if (n.resolve().isType()) return; if (n.resolve().isField()) { new FieldAccessExpr(new ThisExpr(), n.getNameAsString()).accept(this, arg); return; } for (VariableAction action : graphNode.getVariableActions()) { if (action.isUsage() && action.getName().equals(n.getNameAsString())) { list.add(new Pair<>(action, arg)); Loading Loading @@ -160,6 +161,7 @@ public class ExpressionObjectTreeFinder { protected void markTransference(Pair<VariableAction, String> sourcePair, VariableAction targetAction, String targetMember) { VariableAction sourceAction = sourcePair.a; String sourceMember = sourcePair.b; if (sourceAction.hasObjectTree() && !sourceAction.getObjectTree().isLeaf(sourceMember)) ObjectTree.copyTree(sourceAction.getObjectTree(), targetAction.getObjectTree(), sourceMember, targetMember); sourceAction.setPDGTreeConnectionTo(targetAction, sourceMember, targetMember); } Loading sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysCFG.java +12 −13 Original line number Diff line number Diff line Loading @@ -199,8 +199,7 @@ public class JSysCFG extends ESCFG { protected void expandOutputVariable(CallableDeclaration<?> callableDeclaration, VariableAction useOutput) { // Generate the full tree for the method's returned type (static) var fields = classGraph.generateObjectTreeForReturnOf(callableDeclaration); if (fields.isEmpty()) return; if (fields.isPresent()) { // Insert tree into the OutputNode useOutput.getObjectTree().addAll(fields.get()); // Insert tree into GraphNode<ReturnStmt> nodes, the last action is always DEF(-output-) Loading @@ -210,13 +209,13 @@ public class JSysCFG extends ESCFG { .map(list -> list.get(list.size() - 1)) .map(VariableAction::getObjectTree) .forEach(tree -> tree.addAll(fields.get())); } // Generate the assignment trees and prepare for linking vertexSet().stream() .filter(gn -> gn.getAstNode() instanceof ReturnStmt) .forEach(gn -> { Expression expr = ((ReturnStmt) gn.getAstNode()).getExpression().orElseThrow(); ExpressionObjectTreeFinder finder = new ExpressionObjectTreeFinder(gn); finder.locateAndMarkTransferenceToRoot(expr, -1); new ExpressionObjectTreeFinder(gn).locateAndMarkTransferenceToRoot(expr, -1); }); } } Loading sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysPDG.java +2 −5 Original line number Diff line number Diff line Loading @@ -107,12 +107,9 @@ public class JSysPDG extends ESPDG { jSysCFG.findLastDefinitionOfPrimitive(varAct).forEach(def -> addFlowDependencyArc(def, varAct)); else { jSysCFG.findLastDefinitionOfObjectRoot(varAct).forEach(def -> addObjectFlowDependencyArc(def, varAct)); if (varAct.hasObjectTree()) { for (String member : varAct.getObjectTree().nameIterable()) { if (varAct.hasObjectTree()) for (String member : varAct.getObjectTree().nameIterable()) jSysCFG.findLastDefinitionOfObjectMember(varAct, member).forEach(def -> addFlowDependencyArc(def, varAct, member)); addValueDependencyArc(varAct, member, node); } } } } else if (varAct.isDefinition()) { if (!varAct.isSynthetic()) Loading sdg-core/src/main/java/es/upv/mist/slicing/nodes/ObjectTree.java +4 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,10 @@ public class ObjectTree implements Cloneable { childrenMap.put(entry.getKey(), entry.getValue().clone(this)); } public boolean isLeaf(String memberWithoutRoot) { return findObjectTreeOfMember(memberWithoutRoot).childrenMap.isEmpty(); } /** * Copies a subtree from source into another subtree in target. * Loading Loading
sdg-core/src/main/java/es/upv/mist/slicing/graphs/ClassGraph.java +10 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import com.github.javaparser.resolution.UnsolvedSymbolException; import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration; import com.github.javaparser.resolution.types.ResolvedReferenceType; import com.github.javaparser.resolution.types.ResolvedType; import es.upv.mist.slicing.arcs.Arc; import es.upv.mist.slicing.nodes.ObjectTree; import es.upv.mist.slicing.utils.ASTUtils; Loading Loading @@ -145,6 +146,15 @@ public class ClassGraph extends DirectedPseudograph<ClassGraph.Vertex, ClassGrap } } public Optional<ObjectTree> generateObjectTreeForType(ResolvedType type) { if (type.isReferenceType()) { Vertex v = vertexDeclarationMap.get(mapKey(type.asReferenceType())); if (v != null) return Optional.of(generateObjectTreeFor(v)); } return Optional.empty(); } public ObjectTree generateObjectTreeFor(ClassOrInterfaceDeclaration declaration) { return generateObjectTreeFor(vertexDeclarationMap.get(mapKey(declaration))); } Loading
sdg-core/src/main/java/es/upv/mist/slicing/graphs/ExpressionObjectTreeFinder.java +10 −8 Original line number Diff line number Diff line Loading @@ -6,7 +6,6 @@ import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import com.github.javaparser.resolution.Resolvable; import com.github.javaparser.resolution.declarations.ResolvedMethodLikeDeclaration; import com.github.javaparser.resolution.types.ResolvedReferenceType; import com.github.javaparser.utils.Pair; import es.upv.mist.slicing.nodes.GraphNode; import es.upv.mist.slicing.nodes.ObjectTree; Loading @@ -29,9 +28,8 @@ public class ExpressionObjectTreeFinder { public void handleVariableDeclarator(VariableDeclarator variableDeclarator) { assert variableDeclarator.getInitializer().isPresent(); VariableAction targetAction = locateVAVariableDeclarator(variableDeclarator.getNameAsString()); ResolvedReferenceType type = variableDeclarator.getType().resolve().asReferenceType(); var fields = ClassGraph.getInstance().generateObjectTreeFor(type); targetAction.getObjectTree().addAll(fields); ClassGraph.getInstance().generateObjectTreeForType(variableDeclarator.getType().resolve()) .ifPresent(objectTree -> targetAction.getObjectTree().addAll(objectTree)); locateExpressionResultTrees(variableDeclarator.getInitializer().get()) .forEach(pair -> markTransference(pair, targetAction, "")); } Loading @@ -54,9 +52,8 @@ public class ExpressionObjectTreeFinder { } public void handleAssignExpr(AssignExpr assignExpr, VariableAction assignTarget, String targetMember) { ResolvedReferenceType type = assignExpr.getTarget().calculateResolvedType().asReferenceType(); var fields = ClassGraph.getInstance().generateObjectTreeFor(type); assignTarget.getObjectTree().addAll(fields); ClassGraph.getInstance().generateObjectTreeForType(assignExpr.getTarget().calculateResolvedType()) .ifPresent(fields -> assignTarget.getObjectTree().addAll(fields)); locateExpressionResultTrees(assignExpr.getValue()) .forEach(pair -> markTransference(pair, assignTarget, targetMember)); } Loading Loading @@ -97,6 +94,10 @@ public class ExpressionObjectTreeFinder { public void visit(NameExpr n, String arg) { if (n.resolve().isType()) return; if (n.resolve().isField()) { new FieldAccessExpr(new ThisExpr(), n.getNameAsString()).accept(this, arg); return; } for (VariableAction action : graphNode.getVariableActions()) { if (action.isUsage() && action.getName().equals(n.getNameAsString())) { list.add(new Pair<>(action, arg)); Loading Loading @@ -160,6 +161,7 @@ public class ExpressionObjectTreeFinder { protected void markTransference(Pair<VariableAction, String> sourcePair, VariableAction targetAction, String targetMember) { VariableAction sourceAction = sourcePair.a; String sourceMember = sourcePair.b; if (sourceAction.hasObjectTree() && !sourceAction.getObjectTree().isLeaf(sourceMember)) ObjectTree.copyTree(sourceAction.getObjectTree(), targetAction.getObjectTree(), sourceMember, targetMember); sourceAction.setPDGTreeConnectionTo(targetAction, sourceMember, targetMember); } Loading
sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysCFG.java +12 −13 Original line number Diff line number Diff line Loading @@ -199,8 +199,7 @@ public class JSysCFG extends ESCFG { protected void expandOutputVariable(CallableDeclaration<?> callableDeclaration, VariableAction useOutput) { // Generate the full tree for the method's returned type (static) var fields = classGraph.generateObjectTreeForReturnOf(callableDeclaration); if (fields.isEmpty()) return; if (fields.isPresent()) { // Insert tree into the OutputNode useOutput.getObjectTree().addAll(fields.get()); // Insert tree into GraphNode<ReturnStmt> nodes, the last action is always DEF(-output-) Loading @@ -210,13 +209,13 @@ public class JSysCFG extends ESCFG { .map(list -> list.get(list.size() - 1)) .map(VariableAction::getObjectTree) .forEach(tree -> tree.addAll(fields.get())); } // Generate the assignment trees and prepare for linking vertexSet().stream() .filter(gn -> gn.getAstNode() instanceof ReturnStmt) .forEach(gn -> { Expression expr = ((ReturnStmt) gn.getAstNode()).getExpression().orElseThrow(); ExpressionObjectTreeFinder finder = new ExpressionObjectTreeFinder(gn); finder.locateAndMarkTransferenceToRoot(expr, -1); new ExpressionObjectTreeFinder(gn).locateAndMarkTransferenceToRoot(expr, -1); }); } } Loading
sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysPDG.java +2 −5 Original line number Diff line number Diff line Loading @@ -107,12 +107,9 @@ public class JSysPDG extends ESPDG { jSysCFG.findLastDefinitionOfPrimitive(varAct).forEach(def -> addFlowDependencyArc(def, varAct)); else { jSysCFG.findLastDefinitionOfObjectRoot(varAct).forEach(def -> addObjectFlowDependencyArc(def, varAct)); if (varAct.hasObjectTree()) { for (String member : varAct.getObjectTree().nameIterable()) { if (varAct.hasObjectTree()) for (String member : varAct.getObjectTree().nameIterable()) jSysCFG.findLastDefinitionOfObjectMember(varAct, member).forEach(def -> addFlowDependencyArc(def, varAct, member)); addValueDependencyArc(varAct, member, node); } } } } else if (varAct.isDefinition()) { if (!varAct.isSynthetic()) Loading
sdg-core/src/main/java/es/upv/mist/slicing/nodes/ObjectTree.java +4 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,10 @@ public class ObjectTree implements Cloneable { childrenMap.put(entry.getKey(), entry.getValue().clone(this)); } public boolean isLeaf(String memberWithoutRoot) { return findObjectTreeOfMember(memberWithoutRoot).childrenMap.isEmpty(); } /** * Copies a subtree from source into another subtree in target. * Loading