Loading sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysCFGBuilder.java +1 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ public class JSysCFGBuilder extends ACFGBuilder { @Override public void visit(FieldDeclaration n, Void arg){ connectTo(n); super.visit(n,arg); } @Override Loading sdg-core/src/main/java/es/upv/mist/slicing/nodes/VariableVisitor.java +34 −11 Original line number Diff line number Diff line package es.upv.mist.slicing.nodes; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.FieldDeclaration; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.body.Parameter; import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.expr.*; Loading @@ -11,6 +12,7 @@ import com.github.javaparser.ast.stmt.ExpressionStmt; import com.github.javaparser.ast.stmt.ForEachStmt; import com.github.javaparser.resolution.Resolvable; import com.github.javaparser.resolution.declarations.ResolvedMethodLikeDeclaration; import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserFieldDeclaration; import es.upv.mist.slicing.graphs.GraphNodeContentVisitor; import es.upv.mist.slicing.utils.ASTUtils; import es.upv.mist.slicing.utils.TriConsumer; Loading Loading @@ -90,6 +92,8 @@ public class VariableVisitor extends GraphNodeContentVisitor<VariableVisitor.Act @Override public void visit(NameExpr n, Action action) { String prefix = this.getNamePrefix(n); n.setName(new SimpleName(prefix + n.getNameAsString())); acceptAction(n, action); } Loading Loading @@ -218,16 +222,11 @@ 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); } v.getNameAsExpression().accept(this, action.or(Action.DECLARATION)); v.getInitializer().ifPresent(init -> { init.accept(this, action); visitAsDefinition(v.getNameAsExpression(), init); }); } } Loading Loading @@ -277,4 +276,28 @@ public class VariableVisitor extends GraphNodeContentVisitor<VariableVisitor.Act graphNode.addCallMarker(call, false); return false; } /** Checks whether a NameExpr representing a variable * is a Field and returns the correct prefix to reference it */ protected String getNamePrefix(NameExpr n){ if (graphNode.getAstNode() instanceof FieldDeclaration) return "this."; else { Expression expr = ((ExpressionStmt) graphNode.getAstNode()).getExpression(); if (expr instanceof AssignExpr && n.resolve().isField()){ JavaParserFieldDeclaration fieldDeclaration = (JavaParserFieldDeclaration) n.resolve(); Node decClass = ASTUtils.getClassNode(fieldDeclaration.getVariableDeclarator()); Node nClass = ASTUtils.getClassNode(n); assert (nClass instanceof ClassOrInterfaceDeclaration && decClass instanceof ClassOrInterfaceDeclaration); if (decClass.equals(nClass)) return "this."; return ((ClassOrInterfaceDeclaration) decClass).getNameAsString() + ".this."; } } return ""; } } sdg-core/src/main/java/es/upv/mist/slicing/utils/ASTUtils.java +9 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ package es.upv.mist.slicing.utils; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.body.CallableDeclaration; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.ConstructorDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.expr.CastExpr; Loading Loading @@ -180,4 +181,12 @@ public class ASTUtils { throw new IllegalArgumentException("This operation is only valid for reference type cast operations."); } /** Given an AST node, visit the parent until finding a ClassOrInterfaceDeclaration */ public static Node getClassNode(Node n){ Node upperNode = n; while (!(upperNode instanceof ClassOrInterfaceDeclaration)) upperNode = upperNode.getParentNode().get(); return upperNode; } } Loading
sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysCFGBuilder.java +1 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ public class JSysCFGBuilder extends ACFGBuilder { @Override public void visit(FieldDeclaration n, Void arg){ connectTo(n); super.visit(n,arg); } @Override Loading
sdg-core/src/main/java/es/upv/mist/slicing/nodes/VariableVisitor.java +34 −11 Original line number Diff line number Diff line package es.upv.mist.slicing.nodes; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.FieldDeclaration; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.body.Parameter; import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.expr.*; Loading @@ -11,6 +12,7 @@ import com.github.javaparser.ast.stmt.ExpressionStmt; import com.github.javaparser.ast.stmt.ForEachStmt; import com.github.javaparser.resolution.Resolvable; import com.github.javaparser.resolution.declarations.ResolvedMethodLikeDeclaration; import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserFieldDeclaration; import es.upv.mist.slicing.graphs.GraphNodeContentVisitor; import es.upv.mist.slicing.utils.ASTUtils; import es.upv.mist.slicing.utils.TriConsumer; Loading Loading @@ -90,6 +92,8 @@ public class VariableVisitor extends GraphNodeContentVisitor<VariableVisitor.Act @Override public void visit(NameExpr n, Action action) { String prefix = this.getNamePrefix(n); n.setName(new SimpleName(prefix + n.getNameAsString())); acceptAction(n, action); } Loading Loading @@ -218,16 +222,11 @@ 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); } v.getNameAsExpression().accept(this, action.or(Action.DECLARATION)); v.getInitializer().ifPresent(init -> { init.accept(this, action); visitAsDefinition(v.getNameAsExpression(), init); }); } } Loading Loading @@ -277,4 +276,28 @@ public class VariableVisitor extends GraphNodeContentVisitor<VariableVisitor.Act graphNode.addCallMarker(call, false); return false; } /** Checks whether a NameExpr representing a variable * is a Field and returns the correct prefix to reference it */ protected String getNamePrefix(NameExpr n){ if (graphNode.getAstNode() instanceof FieldDeclaration) return "this."; else { Expression expr = ((ExpressionStmt) graphNode.getAstNode()).getExpression(); if (expr instanceof AssignExpr && n.resolve().isField()){ JavaParserFieldDeclaration fieldDeclaration = (JavaParserFieldDeclaration) n.resolve(); Node decClass = ASTUtils.getClassNode(fieldDeclaration.getVariableDeclarator()); Node nClass = ASTUtils.getClassNode(n); assert (nClass instanceof ClassOrInterfaceDeclaration && decClass instanceof ClassOrInterfaceDeclaration); if (decClass.equals(nClass)) return "this."; return ((ClassOrInterfaceDeclaration) decClass).getNameAsString() + ".this."; } } return ""; } }
sdg-core/src/main/java/es/upv/mist/slicing/utils/ASTUtils.java +9 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ package es.upv.mist.slicing.utils; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.body.CallableDeclaration; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.ConstructorDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.expr.CastExpr; Loading Loading @@ -180,4 +181,12 @@ public class ASTUtils { throw new IllegalArgumentException("This operation is only valid for reference type cast operations."); } /** Given an AST node, visit the parent until finding a ClassOrInterfaceDeclaration */ public static Node getClassNode(Node n){ Node upperNode = n; while (!(upperNode instanceof ClassOrInterfaceDeclaration)) upperNode = upperNode.getParentNode().get(); return upperNode; } }