Commit 55e88421 authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Merge branch 'criterion-without-file' into 'develop'

Implement criterion which don't need a file.

See merge request !43
parents 2944eb06 258bdace
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
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<CompilationUnit> findCompilationUnit(NodeList<CompilationUnit> 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;
  }
}
+6 −14
Original line number Diff line number Diff line
@@ -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<GraphNode<?>> findNode(SDG graph) {
        Optional<CompilationUnit> 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<CompilationUnit> findCompilationUnit(NodeList<CompilationUnit> cus) {
        for (CompilationUnit cu : cus) {
            Optional<CompilationUnit.Storage> 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();
+12 −1
Original line number Diff line number Diff line
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<GraphNode<?>> findNode(SDG graph) {
        Optional<CompilationUnit> 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<CompilationUnit> findCompilationUnit(NodeList<CompilationUnit> cus) {
        return cus.getFirst();
    }

    /** Check if a node matches the criterion's line. */
+3 −2
Original line number Diff line number Diff line
@@ -73,8 +73,9 @@ public class Slice {
        CloneVisitor cloneVisitor = new CloneVisitor();
        for (Map.Entry<CompilationUnit, Set<Node>> 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);
        }