// Path: Support/rsense-0.2/src/org/cx4a/rsense/typing/Propagation.java
// public class Propagation {
//     private Graph graph;
//     private Set<Object> visited;
//     private int refCount;
// 
//     public Propagation(Graph graph) {
//         this.graph = graph;
//         this.refCount = 0;
//     }
// 
//     public Graph getGraph() {
//         return graph;
//     }
// 
//     public boolean isVisited(Vertex vertex) {
//         return visited != null ? visited.contains(getVisitTag(vertex)) : false;
//     }
// 
//     public void addVisited(Vertex vertex) {
//         if (visited == null) {
//             // lazy allocation
//             visited = new HashSet<Object>();
//         }
//         visited.add(getVisitTag(vertex));
//     }
// 
//     public boolean checkVisited(Vertex vertex) {
//         if (isVisited(vertex)) {
//             return true;
//         } else {
//             addVisited(vertex);
//             return false;
//         }
//     }
// 
//     public void retain() {
//         refCount++;
//     }
// 
//     public boolean release() {
//         return --refCount == 0;
//     }
// 
//     private Object getVisitTag(Vertex vertex) {
//         return vertex.getNode() != null ? vertex.getNode() : vertex;
//     }
// }


import org.jruby.RubyClass;
import org.jruby.ast.Node;
import org.jruby.ast.types.INameNode;
import org.cx4a.rsense.ruby.Block;
import org.cx4a.rsense.typing.Propagation;
    public Block getBlock() {
        return block;
    }

    public boolean hasPrivateVisibility() {
        return privateVisibility;
    }

    public void setPrivateVisibility(boolean privateVisibility) {
        this.privateVisibility = privateVisibility;
    }

    public boolean isApplicable() {
        if (receiverVertex == null || receiverVertex.isEmpty()) {
            return false;
        }
        
        boolean applicable = true;
        if (argVertices != null) {
            for (Vertex v : argVertices) {
                if (v.isEmpty()) {
                    applicable = false;
                    break;
                }
            }
        }
        return applicable;
    }

    @Override
// Path: Support/rsense-0.2/src/org/cx4a/rsense/typing/Propagation.java
// public class Propagation {
//     private Graph graph;
//     private Set<Object> visited;
//     private int refCount;
// 
//     public Propagation(Graph graph) {
//         this.graph = graph;
//         this.refCount = 0;
//     }
// 
//     public Graph getGraph() {
//         return graph;
//     }
// 
//     public boolean isVisited(Vertex vertex) {
//         return visited != null ? visited.contains(getVisitTag(vertex)) : false;
//     }
// 
//     public void addVisited(Vertex vertex) {
//         if (visited == null) {
//             // lazy allocation
//             visited = new HashSet<Object>();
//         }
//         visited.add(getVisitTag(vertex));
//     }
// 
//     public boolean checkVisited(Vertex vertex) {
//         if (isVisited(vertex)) {
//             return true;
//         } else {
//             addVisited(vertex);
//             return false;
//         }
//     }
// 
//     public void retain() {
//         refCount++;
//     }
// 
//     public boolean release() {
//         return --refCount == 0;
//     }
// 
//     private Object getVisitTag(Vertex vertex) {
//         return vertex.getNode() != null ? vertex.getNode() : vertex;
//     }
// }


// Path: Support/rsense-0.2/src/org/cx4a/rsense/typing/vertex/CallVertex.java
import org.jruby.RubyClass;
import org.jruby.ast.Node;
import org.jruby.ast.types.INameNode;
import org.cx4a.rsense.ruby.Block;
import org.cx4a.rsense.typing.Propagation;

    public Block getBlock() {
        return block;
    }

    public boolean hasPrivateVisibility() {
        return privateVisibility;
    }

    public void setPrivateVisibility(boolean privateVisibility) {
        this.privateVisibility = privateVisibility;
    }

    public boolean isApplicable() {
        if (receiverVertex == null || receiverVertex.isEmpty()) {
            return false;
        }
        
        boolean applicable = true;
        if (argVertices != null) {
            for (Vertex v : argVertices) {
                if (v.isEmpty()) {
                    applicable = false;
                    break;
                }
            }
        }
        return applicable;
    }

    @Override
    public boolean accept(Propagation propagation, Vertex src) {