diff --git a/sdg-core/src/main/java/es/upv/mist/slicing/slicing/ClassFileLineCriterion.java b/sdg-core/src/main/java/es/upv/mist/slicing/slicing/ClassFileLineCriterion.java new file mode 100644 index 0000000000000000000000000000000000000000..a1b48287c7884f74eca7f17f875123dc16c93041 --- /dev/null +++ b/sdg-core/src/main/java/es/upv/mist/slicing/slicing/ClassFileLineCriterion.java @@ -0,0 +1,34 @@ +package es.upv.mist.slicing.slicing; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.NodeList; +import com.github.javaparser.ast.body.TypeDeclaration; + +import java.util.Objects; +import java.util.Optional; + +public class ClassFileLineCriterion extends LineNumberCriterion { + private final String fullyQualifiedClassName; + + public ClassFileLineCriterion(final String fullyQualifiedClassName, int lineNumber, String variable) { + super(lineNumber, variable); + this.fullyQualifiedClassName = fullyQualifiedClassName; + } + + /** Locates the compilation unit that corresponds to this criterion's file. */ + protected Optional findCompilationUnit(NodeList cus) { + for (CompilationUnit cu : cus) { + if (cu.getTypes().stream() + .map(TypeDeclaration::getFullyQualifiedName) + .map(o -> o.orElse(null)) + .anyMatch(type -> Objects.equals(type, fullyQualifiedClassName))) + return Optional.of(cu); + } + return Optional.empty(); + } + + @Override + public String toString() { + return fullyQualifiedClassName + "#" + lineNumber + ":" + variable; + } +} diff --git a/sdg-core/src/main/java/es/upv/mist/slicing/slicing/FileLineSlicingCriterion.java b/sdg-core/src/main/java/es/upv/mist/slicing/slicing/FileLineSlicingCriterion.java index 584f454f71eb86f2db1f5bd835bbace14c9f89e0..8a1afdbe4adcd0d34b07d30578efae257b20688d 100644 --- a/sdg-core/src/main/java/es/upv/mist/slicing/slicing/FileLineSlicingCriterion.java +++ b/sdg-core/src/main/java/es/upv/mist/slicing/slicing/FileLineSlicingCriterion.java @@ -2,9 +2,6 @@ package es.upv.mist.slicing.slicing; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.NodeList; -import com.github.javaparser.ast.stmt.Statement; -import es.upv.mist.slicing.graphs.sdg.SDG; -import es.upv.mist.slicing.nodes.GraphNode; import java.io.File; import java.util.Optional; @@ -18,20 +15,15 @@ public class FileLineSlicingCriterion extends LineNumberCriterion { this.file = file; } - @Override - public Optional> findNode(SDG graph) { - Optional optCu = findCompilationUnit(graph.getCompilationUnits()); - if (optCu.isEmpty()) - return Optional.empty(); - return optCu.get().findFirst(Statement.class, this::matchesLine).flatMap(graph::findNodeByASTNode); - } - /** Locates the compilation unit that corresponds to this criterion's file. */ + @Override protected Optional findCompilationUnit(NodeList cus) { for (CompilationUnit cu : cus) { - Optional optStorage = cu.getStorage(); - if (optStorage.isPresent() && optStorage.get().getFileName().equals(file.getName()) - && optStorage.get().getDirectory().toAbsolutePath().equals(file.toPath().toAbsolutePath().getParent())) + if (cu.getStorage().isEmpty()) + continue; + CompilationUnit.Storage storage = cu.getStorage().get(); + if (storage.getDirectory().toAbsolutePath().equals(file.toPath().toAbsolutePath().getParent()) + && storage.getFileName().equals(file.getName())) return Optional.of(cu); } return Optional.empty(); diff --git a/sdg-core/src/main/java/es/upv/mist/slicing/slicing/LineNumberCriterion.java b/sdg-core/src/main/java/es/upv/mist/slicing/slicing/LineNumberCriterion.java index 18598aed62e41b9fc1002a4cf71dd1a5daf12217..84fd9481a945de44fae5f47c621d868408f39ebd 100644 --- a/sdg-core/src/main/java/es/upv/mist/slicing/slicing/LineNumberCriterion.java +++ b/sdg-core/src/main/java/es/upv/mist/slicing/slicing/LineNumberCriterion.java @@ -1,7 +1,10 @@ package es.upv.mist.slicing.slicing; import com.github.javaparser.Position; +import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.NodeList; +import com.github.javaparser.ast.stmt.Statement; import es.upv.mist.slicing.graphs.cfg.CFG; import es.upv.mist.slicing.graphs.pdg.PDG; import es.upv.mist.slicing.graphs.sdg.SDG; @@ -46,7 +49,15 @@ public class LineNumberCriterion extends SlicingCriterion { @Override public Optional> findNode(SDG graph) { - return Optional.empty(); + Optional optCu = findCompilationUnit(graph.getCompilationUnits()); + if (optCu.isEmpty()) + return Optional.empty(); + return optCu.get().findFirst(Statement.class, this::matchesLine).flatMap(graph::findNodeByASTNode); + } + + /** Locates the compilation unit that corresponds to this criterion's file. */ + protected Optional findCompilationUnit(NodeList cus) { + return cus.getFirst(); } /** Check if a node matches the criterion's line. */ diff --git a/sdg-core/src/main/java/es/upv/mist/slicing/slicing/Slice.java b/sdg-core/src/main/java/es/upv/mist/slicing/slicing/Slice.java index 67babbc4d34b3319a0e43978b3c5788666410611..4dc751a90007ac5485cadbd3dccadf8b35d76735 100644 --- a/sdg-core/src/main/java/es/upv/mist/slicing/slicing/Slice.java +++ b/sdg-core/src/main/java/es/upv/mist/slicing/slicing/Slice.java @@ -73,8 +73,9 @@ public class Slice { CloneVisitor cloneVisitor = new CloneVisitor(); for (Map.Entry> entry : cuMap.entrySet()) { CompilationUnit clone = (CompilationUnit) entry.getKey().accept(cloneVisitor, null); - assert entry.getKey().getStorage().isPresent(); - clone.setStorage(entry.getKey().getStorage().get().getPath()); + if (entry.getKey().getStorage().isPresent()) + clone.setStorage(entry.getKey().getStorage().get().getPath(), + entry.getKey().getStorage().get().getEncoding()); clone.accept(sliceVisitor, entry.getValue()); cus.add(clone); }