/* * 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