/*
* Bytecode Analysis Framework
* 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;
import org.apache.bcel.Constants;
public class AssignedFieldMap implements Constants {
/*
private final Map<Method, Set<XField>> assignedFieldSetForMethodMap;
private final JavaClass myClass;
public AssignedFieldMap(JavaClass jclass) {
this.assignedFieldSetForMethodMap = new IdentityHashMap<Method, Set<XField>>();
this.myClass = jclass;
}
public void build() throws ClassNotFoundException {
// Build a set of all fields that could be assigned
// by methods in this class
Set<XField> assignableFieldSet = new HashSet<XField>();
scanFields(myClass, assignableFieldSet);
JavaClass[] superClassList = myClass.getSuperClasses();
if (superClassList != null) {
for (JavaClass aSuperClassList : superClassList) {
scanFields(aSuperClassList, assignableFieldSet);
}
}
Method[] methodList = myClass.getMethods();
for (Method method : methodList) {
scanMethod(method, assignableFieldSet);
}
}
public Set<XField> getAssignedFieldSetForMethod(Method method) {
Set<XField> set = assignedFieldSetForMethodMap.get(method);
if (set == null) {
set = new HashSet<XField>();
assignedFieldSetForMethodMap.put(method, set);
}
return set;
}
private void scanFields(JavaClass jclass, Set<XField> assignableFieldSet) {
// JavaClass myClass = classContext.getJavaClass();
String myClassName = myClass.getClassName();
String myPackageName = myClass.getPackageName();
String superClassName = jclass.getClassName();
String superPackageName = jclass.getPackageName();
Field[] fieldList = jclass.getFields();
for (Field field : fieldList) {
if (field.isStatic())
continue;
boolean assignable;
if (field.isPublic() || field.isProtected())
assignable = true;
else if (field.isPrivate())
assignable = myClassName.equals(superClassName);
else // package protected
assignable = myPackageName.equals(superPackageName);
if (assignable) {
assignableFieldSet.add(new InstanceField(superClassName, field.getName(), field.getSignature(),
field.getAccessFlags()));
}
}
}
private void scanMethod(Method method, Set<XField> assignableFieldSet) throws ClassNotFoundException {
//MethodGen methodGen = classContext.getMethodGen(method);
MethodGen methodGen;
try {
methodGen= Global.getAnalysisCache().getMethodAnalysis(MethodGen.class, BCELUtil.getMethodDescriptor(myClass, method));
} catch (CheckedAnalysisException e) {
// Should not happen
throw new AnalysisException("Could not get MethodGen for Method", e);
}
if (methodGen == null) return;
InstructionList il = methodGen.getInstructionList();
InstructionHandle handle = il.getStart();
ConstantPoolGen cpg = methodGen.getConstantPool();
while (handle != null) {
Instruction ins = handle.getInstruction();
short opcode = ins.getOpcode();
if (opcode == Constants.PUTFIELD) {
PUTFIELD putfield = (PUTFIELD) ins;
XField instanceField = Hierarchy.findXField(putfield, cpg);
if (instanceField != null && assignableFieldSet.contains(instanceField)) {
Set<XField> assignedFieldSetForMethod = getAssignedFieldSetForMethod(method);
assignedFieldSetForMethod.add(instanceField);
}
}
handle = handle.getNext();
}
}
*/
}
// vim:ts=4