/* * FindBugs - Find Bugs in Java programs * Copyright (C) 2003-2007 University of Maryland * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package edu.umd.cs.findbugs.ba.jsr305; import javax.annotation.meta.When; import edu.umd.cs.findbugs.ba.Location; import edu.umd.cs.findbugs.ba.vna.ValueNumber; /** * Information about a source or sink in the type qualifier dataflow analysis. * * @author David Hovemeyer */ public class SourceSinkInfo implements Comparable<SourceSinkInfo> { private final SourceSinkType type; private final Location location; private final ValueNumber vn; private final When when; private int parameter; private int local; private Object constantValue; private boolean interproc; /** * Constructor. * * @param type * type of the source or sink * @param location * Location of the source or sink * @param vn * the ValueNumber of the annotated value * @param when * the When value used (explicitly or implicitly) to annotate * this source or sink */ public SourceSinkInfo(SourceSinkType type, Location location, ValueNumber vn, When when) { this.type = type; this.location = location; this.vn = vn; this.when = when; } /** * @return Returns the type. */ public SourceSinkType getType() { return type; } /** * @return Returns the location. */ public Location getLocation() { return location; } /** * @return Returns the ValueNumber. */ public ValueNumber getValueNumber() { return vn; } /** * @return Returns the when. */ public When getWhen() { return when; } /** * @param parameter * The parameter to set. */ public void setParameter(int parameter) { this.parameter = parameter; } /** * @param parameter * The parameter to set. * @param local * The local to set. */ public void setParameterAndLocal(int parameter, int local) { this.parameter = parameter; this.local = local; } /** * @return Returns the parameter. */ public int getParameter() { return parameter; } /** * @return Returns the local. */ public int getLocal() { return local; } /** * Set the SourceSinkInfo as having been created based on the results of * type qualifiers computed for a called method (and not explicitly * annotating the called method). * * @param interproc * true if the SourceSinkInfo results from computed type * qualifiers for a called method, false otherwise */ public void setInterproc(boolean interproc) { this.interproc = interproc; } /** * Return whether or not the SourceSinkInfo was created based on the results * of type qualifiers computed for a called method (and not explicitly * annotating the called method). * * @return true if the SourceSinkInfo results from computed type qualifiers * for a called method, false otherwise */ public boolean getInterproc() { return interproc; } /* * (non-Javadoc) * * @see java.lang.Comparable#compareTo(java.lang.Object) */ public int compareTo(SourceSinkInfo o) { return this.location.compareTo(o.location); } public Object getConstantValue() { return constantValue; } public void setConstantValue(Object constantValue) { this.constantValue = constantValue; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((constantValue == null) ? 0 : constantValue.hashCode()); result = prime * result + (interproc ? 1231 : 1237); result = prime * result + local; result = prime * result + ((location == null) ? 0 : location.hashCode()); result = prime * result + parameter; result = prime * result + ((type == null) ? 0 : type.hashCode()); result = prime * result + ((vn == null) ? 0 : vn.hashCode()); result = prime * result + ((when == null) ? 0 : when.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; SourceSinkInfo other = (SourceSinkInfo) obj; if (constantValue == null) { if (other.constantValue != null) return false; } else if (!constantValue.equals(other.constantValue)) return false; if (interproc != other.interproc) return false; if (local != other.local) return false; if (location == null) { if (other.location != null) return false; } else if (!location.equals(other.location)) return false; if (parameter != other.parameter) return false; if (type != other.type) return false; if (vn == null) { if (other.vn != null) return false; } else if (!vn.equals(other.vn)) return false; if (when != other.when) return false; return true; } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ @Override public String toString() { return type.toString() + "@" + location.toCompactString() + "[vn=" + vn.getNumber() + ",when=" + when + "]"; } }