diff --git a/build.xml b/build.xml index 5846db2bf..259f88854 100644 --- a/build.xml +++ b/build.xml @@ -10,7 +10,6 @@ - - diff --git a/lib/bcel.jar b/lib/bcel.jar deleted file mode 100644 index 3195ae587..000000000 Binary files a/lib/bcel.jar and /dev/null differ diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/Configuration.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/Configuration.java index 3d8363e71..c7f73eda1 100644 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/Configuration.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/Configuration.java @@ -607,12 +607,6 @@ public class Configuration return getBooleanProperty(Defn.JAVADOC_CHECK_UNUSED_THROWS_PROP); } - /** @return whether to check unused fields **/ - boolean isCheckUnusedFields() - { - return getBooleanProperty(Defn.CHECK_UNUSED_FIELDS_PROP); - } - /** @return Set of pkg prefixes that are illegal in import statements */ Set getIllegalImports() { diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/Defn.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/Defn.java index b8f0480f5..823c0853b 100644 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/Defn.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/Defn.java @@ -127,8 +127,6 @@ public interface Defn String BASEDIR_PROP = "checkstyle.basedir"; /** property name for wrapping lines on operators **/ String WRAP_OP_PROP = "checkstyle.wrap.operator"; - /** property name for checking for unused fields **/ - String CHECK_UNUSED_FIELDS_PROP = "checkstyle.checkUnused.fields"; /** property name for the locale language for reporting **/ String LOCALE_LANGUAGE_PROP = "checkstyle.locale.language"; @@ -153,7 +151,6 @@ public interface Defn JAVADOC_CHECK_UNUSED_THROWS_PROP, REQUIRE_PACKAGE_HTML_PROP, REQUIRE_VERSION_PROP, - CHECK_UNUSED_FIELDS_PROP, }; /** All the properties that are a regulare expression */ diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/UnusedDetector.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/UnusedDetector.java deleted file mode 100644 index 81686634c..000000000 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/UnusedDetector.java +++ /dev/null @@ -1,277 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// checkstyle: Checks Java source code for adherence to a set of rules. -// Copyright (C) 2001-2002 Oliver Burn -// -// 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 com.puppycrawl.tools.checkstyle; - -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.GETFIELD; -import org.apache.bcel.generic.PUTFIELD; -import org.apache.bcel.generic.GETSTATIC; -import org.apache.bcel.generic.PUTSTATIC; -import org.apache.bcel.generic.FieldInstruction; - -import java.util.HashMap; -import java.util.Map; -import java.util.Iterator; -import java.util.ArrayList; - -/** - * Used to locate unused constructs using BCEL. - * A field is considered if: - *
    - *
  • It is private as another class can access it
  • - *
  • It is not final as the compiler can optimise these away
  • - *
- * - * @author Oliver Burn - * @version 1.0 - */ -class UnusedDetector - extends org.apache.bcel.classfile.EmptyVisitor -{ - /** the class being examined */ - private final JavaClass mJavaClass; - /** the found field statistics */ - private final Map mFieldStats = new HashMap(); - /** a BCEL pool */ - private final ConstantPoolGen mPoolGen; - /** a BCEL pool */ - private final ConstantPool mPool; - /** used to process the instructions */ - private final InstructionVisitor mIV = new InstructionVisitor(); - - /** - * Creates a new UnusedDetector instance. - * - * @param aJavaClass a JavaClass value - */ - UnusedDetector(JavaClass aJavaClass) - { - mJavaClass = aJavaClass; - mPool = aJavaClass.getConstantPool(); - mPoolGen = new ConstantPoolGen(mPool); - } - - /** @return the names of all unusued fields */ - String[] getUnusedFields() - { - final ArrayList unused = new ArrayList(); - final Iterator it = mFieldStats.values().iterator(); - while (it.hasNext()) { - final FieldStats fs = (FieldStats) it.next(); - final Field details = fs.getDetails(); - if (details.isPrivate() - && !details.isFinal() - && !"this$0".equals(fs.getName())) - { - if (fs.getReads() == 0) { - unused.add(fs.getName()); - } - } - } - - return (String[]) unused.toArray(new String[unused.size()]); - } - - /////////////////////////////////////////////////////////////////////////// - // Classfile Visitor methods - /////////////////////////////////////////////////////////////////////////// - - /** @see org.apache.bcel.classfile.Visitor */ - public void visitField(Field aField) - { - reportField(aField); - } - - /** @see org.apache.bcel.classfile.Visitor */ - public void visitCode(Code aCode) - { - // Process all the instructions - final InstructionList list = new InstructionList(aCode.getCode()); - for (InstructionHandle handle = list.getStart(); - handle != null; - handle = handle.getNext()) - { - handle.getInstruction().accept(mIV); - } - } - - /////////////////////////////////////////////////////////////////////////// - // Private methods - /////////////////////////////////////////////////////////////////////////// - - /** - * @param aField report the field found - */ - private void reportField(Field aField) - { - final FieldStats fs = findFieldStats(aField.getName()); - fs.setDetails(aField); - } - - /** @param aFI report the field is read */ - private void reportRead(FieldInstruction aFI) - { - if (memberOfClass(aFI)) { - findFieldStats(aFI.getName(mPoolGen)).addRead(); - } - } - - /** @param aFI report the field is written to */ - private void reportWrite(FieldInstruction aFI) - { - if (memberOfClass(aFI)) { - findFieldStats(aFI.getName(mPoolGen)).addWrite(); - } - } - - /** - * @return whether the field is from this class - * @param aFI the field to check - */ - private boolean memberOfClass(FieldInstruction aFI) - { - return mJavaClass.getClassName().equals( - aFI.getClassType(mPoolGen).getClassName()); - } - - /** - * @return the FieldStats for the specifed name. If one does not exist, it - * is created - * @param aName the field name - */ - private FieldStats findFieldStats(String aName) - { - FieldStats retVal = (FieldStats) mFieldStats.get(aName); - if (retVal == null) { - retVal = new FieldStats(aName); - mFieldStats.put(aName, retVal); - } - return retVal; - } - - /////////////////////////////////////////////////////////////////////////// - // Internal types - /////////////////////////////////////////////////////////////////////////// - - /** - * Helper class for visiting all the Class instructions. Looks for access - * to fields. - * - */ - private class InstructionVisitor - extends org.apache.bcel.generic.EmptyVisitor - { - /** @see org.apache.bcel.generic.EmptyVisitor */ - public void visitGETFIELD(GETFIELD aField) - { - reportRead(aField); - } - - /** @see org.apache.bcel.generic.EmptyVisitor */ - public void visitPUTFIELD(PUTFIELD aField) - { - reportWrite(aField); - } - - /** @see org.apache.bcel.generic.EmptyVisitor */ - public void visitGETSTATIC(GETSTATIC aField) - { - reportRead(aField); - } - - /** @see org.apache.bcel.generic.EmptyVisitor */ - public void visitPUTSTATIC(PUTSTATIC aField) - { - reportWrite(aField); - } - } - - /** - * Represents the statistics for a field. - */ - private static class FieldStats - { - /** the name of the field */ - private final String mName; - /** number of reads */ - private int mReads = 0; - /** number of writes */ - private int mWrites = 0; - /** field details */ - private Field mDetails; - - /** - * Creates a new FieldStats instance. - * - * @param aName name of the field - */ - FieldStats(String aName) - { - mName = aName; - } - - /** @return the name of the field */ - String getName() - { - return mName; - } - - /** @return the number of field reads */ - int getReads() - { - return mReads; - } - - /** @return the number of field writes */ - int getWrites() - { - return mWrites; - } - - /** Add a field read */ - void addRead() - { - mReads++; - } - - /** Add a field write */ - void addWrite() - { - mWrites++; - } - - /** @return the field details */ - Field getDetails() - { - return mDetails; - } - - /** @param aDetails set the field detail */ - void setDetails(Field aDetails) - { - mDetails = aDetails; - } - } -} diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/Verifier.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/Verifier.java index 99c452ac9..19aa82868 100644 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/Verifier.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/Verifier.java @@ -28,14 +28,9 @@ import java.util.ListIterator; import java.util.Map; import java.util.Set; import java.util.Stack; -import java.io.InputStream; -import java.io.IOException; import org.apache.regexp.RE; import org.apache.regexp.RESyntaxException; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.DescendingVisitor; -import org.apache.bcel.classfile.ClassParser; /** * Verifier of Java rules. Each rule verifier takes the form of @@ -179,7 +174,6 @@ class Verifier **/ LocalizedMessage[] getMessages() { - checkUnused(); checkImports(); return mMessages.getMessages(); } @@ -1492,59 +1486,6 @@ class Verifier return (i == -1) ? aType : aType.substring(i + 1); } - /** - * Checks for unused variables using BCEL. - */ - private void checkUnused() - { - if (!mConfig.isCheckUnusedFields()) { - return; - } - - final Iterator typeNames = mTypeFieldsMap.keySet().iterator(); - while (typeNames.hasNext()) { - final String type = (String) typeNames.next(); - String cname = type.replace('.', '$'); - if (mPkgName != null) { - cname = mPkgName + "." + cname; - } - final String fname = cname.replace('.', '/') + ".class"; - final InputStream is = - mConfig.getClassLoader().getResourceAsStream(fname); - - final ClassParser parser = new ClassParser(is, cname); - JavaClass jc = null; - try { - jc = parser.parse(); - } - catch (IOException e) { - e.printStackTrace(); - return; - } - catch (ClassFormatError e) { - e.printStackTrace(); - return; - } - - // Visit the code using BCEL - final UnusedDetector ud = new UnusedDetector(jc); - final DescendingVisitor dv = new DescendingVisitor(jc, ud); - dv.visit(); - - // Report all unused fields - final Map typeVars = (Map) mTypeFieldsMap.get(type); - final String[] unusedFields = ud.getUnusedFields(); - for (int i = 0; i < unusedFields.length; i++) { - final MyVariable var = - (MyVariable) typeVars.get(unusedFields[i]); - mMessages.add(var.getLineNo(), - var.getColumnNo() - 1, - "field.unused", - var.getText()); - } - } - } - /** Check the imports that are unused or unrequired. **/ private void checkImports() {