Moved across nearly all the unit tests, just the illegal import to go

This commit is contained in:
Oliver Burn 2002-09-29 05:01:34 +00:00
parent 11fad553fd
commit aa5dbacdcb
10 changed files with 281 additions and 71 deletions

View File

@ -284,6 +284,20 @@ public abstract class Check
log(aLineNo, aColNo, aKey, EMPTY_OBJECT_ARRAY);
}
/**
* Helper method to log a LocalizedMessage.
*
* @param aLineNo line number to associate with the message
* @param aColNo column number to associate with the message
* @param aKey key to locale message format
* @param aArg0 an <code>Object</code> value
*/
public void log(int aLineNo, int aColNo, String aKey,
Object aArg0)
{
log(aLineNo, aColNo, aKey, new Object[] {aArg0});
}
/**
* Helper method to log a LocalizedMessage.
*
@ -309,6 +323,7 @@ public abstract class Check
*/
public void log(int aLineNo, int aColNo, String aKey, Object[] aArgs)
{
// TODO: need to fix this ugly hack below!!!!!!
final int col = aColNo + 1;
// final int col = 1 + Utils.lengthExpandedTabs(
// mLines[aLineNo - 1], aColNo, mTabWidth);

View File

@ -0,0 +1,100 @@
////////////////////////////////////////////////////////////////////////////////
// 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.api;
import com.puppycrawl.tools.checkstyle.JavaTokenTypes;
/**
* Represents a string with an associated line number.
* @author <a href="mailto:oliver@puppycrawl.com">Oliver Burn</a>
**/
public class FullIdent
{
/** the string **/
private final StringBuffer mBuffer = new StringBuffer();
/** the line number **/
private int mLineNo;
/** the column number **/
private int mColNo;
/** @return the text **/
public String getText()
{
return mBuffer.toString();
}
/** @return the line number **/
public int getLineNo()
{
return mLineNo;
}
/** @return the column number **/
public int getColumnNo()
{
return mColNo;
}
public void append(String aText)
{
mBuffer.append(".");
}
public void append(DetailAST aAST)
{
mBuffer.append(aAST.getText());
if (mLineNo == 0) {
mLineNo = aAST.getLineNo();
}
else if (aAST.getLineNo() > 0) {
mLineNo = Math.min(mLineNo, aAST.getLineNo());
}
// TODO: make a function
if (mColNo == 0) {
mColNo = aAST.getColumnNo();
}
else if (aAST.getColumnNo() > 0) {
mColNo = Math.min(mColNo, aAST.getColumnNo());
}
}
public static FullIdent createFullIdent(DetailAST aAST)
{
final FullIdent fi = new FullIdent();
extractFullIdent(fi, aAST);
return fi;
}
public static void extractFullIdent(FullIdent aFull, DetailAST aAST)
{
// A guard to be paranoid
if (aAST == null) {
return;
}
if (aAST.getType() == JavaTokenTypes.DOT) {
extractFullIdent(aFull, (DetailAST) aAST.getFirstChild());
aFull.append(".");
extractFullIdent(
aFull, (DetailAST) aAST.getFirstChild().getNextSibling());
}
else {
aFull.append(aAST);
}
}
}

View File

@ -21,6 +21,7 @@ package com.puppycrawl.tools.checkstyle.checks;
import com.puppycrawl.tools.checkstyle.JavaTokenTypes;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.FullIdent;
/**
* Check that finds import statement that use the * notation.
@ -44,8 +45,8 @@ public class AvoidStarImport
/** @see com.puppycrawl.tools.checkstyle.api.Check */
public void visitToken(DetailAST aAST)
{
final String name = getImportText(aAST);
if ((name != null) && name.endsWith(".*")) {
final FullIdent name = getImportText(aAST);
if ((name != null) && name.getText().endsWith(".*")) {
log(aAST.getLineNo(), "import.avoidStar");
}
}

View File

@ -21,6 +21,8 @@ package com.puppycrawl.tools.checkstyle.checks;
import com.puppycrawl.tools.checkstyle.api.Check;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.FullIdent;
import com.puppycrawl.tools.checkstyle.api.Utils;
import com.puppycrawl.tools.checkstyle.JavaTokenTypes;
/**
@ -41,47 +43,15 @@ public abstract class ImportCheck
* @param aAST the node containing the import
* @return a <code>String</code> value
*/
protected String getImportText(DetailAST aAST)
protected FullIdent getImportText(DetailAST aAST)
{
String text = (String) getTokenContext().get(TEXT_KEY);
FullIdent text = (FullIdent) getTokenContext().get(TEXT_KEY);
if (text != null) {
return text;
}
final StringBuffer buf = new StringBuffer();
extractIdent(buf, (DetailAST) aAST.getFirstChild());
text = buf.toString();
text = FullIdent.createFullIdent((DetailAST) aAST.getFirstChild());
getTokenContext().put(TEXT_KEY, text);
return text;
}
/**
* Fills in the name of an import.
*
* @param aBuf the StringBuffer to add the name to
* @param aAST the node to operate on
*/
private static void extractIdent(StringBuffer aBuf, DetailAST aAST)
{
if (aAST == null) {
System.out.println("CALLED WITH NULL");
return;
}
if (aAST.getType() == JavaTokenTypes.DOT) {
extractIdent(aBuf, (DetailAST) aAST.getFirstChild());
aBuf.append(".");
extractIdent(aBuf,
(DetailAST) aAST.getFirstChild().getNextSibling());
}
else if ((aAST.getType() == JavaTokenTypes.IDENT)
|| (aAST.getType() == JavaTokenTypes.STAR))
{
aBuf.append(aAST.getText());
}
else {
System.out.println("********* Got the string " + aAST.getText());
aBuf.append(aAST.getText());
}
}
}

View File

@ -19,6 +19,7 @@
package com.puppycrawl.tools.checkstyle.checks;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.FullIdent;
import com.puppycrawl.tools.checkstyle.JavaTokenTypes;
public class PackageNameCheck
@ -45,35 +46,13 @@ public class PackageNameCheck
public void visitToken(DetailAST aAST)
{
final DetailAST nameAST = (DetailAST) aAST.getFirstChild();
final StringBuffer buf = new StringBuffer();
extractIdent(buf, nameAST);
final String text = buf.toString();
if (!getRegexp().match(text)) {
log(nameAST.getLineNo(),
final FullIdent full = FullIdent.createFullIdent(nameAST);
if (!getRegexp().match(full.getText())) {
log(full.getLineNo(),
full.getColumnNo(),
"name.invalidPattern",
text,
full.getText(),
getFormat());
}
}
// TODO: refactor to Utils. It should return the text, plus the starting
// line and column
private static void extractIdent(StringBuffer aBuf, DetailAST aAST)
{
if (aAST == null) {
System.out.println("CALLED WITH NULL");
return;
}
if (aAST.getType() == JavaTokenTypes.DOT) {
extractIdent(aBuf, (DetailAST) aAST.getFirstChild());
aBuf.append(".");
extractIdent(aBuf,
(DetailAST) aAST.getFirstChild().getNextSibling());
}
else {
aBuf.append(aAST.getText());
}
}
}

View File

@ -0,0 +1,77 @@
////////////////////////////////////////////////////////////////////////////////
// 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.checks;
import com.puppycrawl.tools.checkstyle.JavaTokenTypes;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.FullIdent;
public class RedundantImportCheck
extends ImportCheck
{
private String mPkgName;
/** @see com.puppycrawl.tools.checkstyle.api.Check */
public int[] getDefaultTokens()
{
return new int[] {JavaTokenTypes.IMPORT, JavaTokenTypes.PACKAGE_DEF};
}
/** @see com.puppycrawl.tools.checkstyle.api.Check */
public void visitToken(DetailAST aAST)
{
if (aAST.getType() == JavaTokenTypes.PACKAGE_DEF) {
final DetailAST nameAST = (DetailAST) aAST.getFirstChild();
mPkgName = FullIdent.createFullIdent(nameAST).getText();
}
else {
final FullIdent imp = getImportText(aAST);
if (fromPackage(imp.getText(), "java.lang")) {
log(aAST.getLineNo(), aAST.getColumnNo(), "import.lang");
}
else if (fromPackage(imp.getText(), mPkgName)) {
log(aAST.getLineNo(), aAST.getColumnNo(), "import.same");
}
}
}
/**
* Determines in an import statement is for types from a specified package.
* @param aImport the import name
* @param aPkg the package name
* @return whether from the package
*/
private static boolean fromPackage(String aImport, String aPkg)
{
boolean retVal = false;
if (aPkg == null) {
// If not package, then check for no package in the import.
retVal = (aImport.indexOf('.') == -1);
}
else {
final int index = aImport.lastIndexOf('.');
if (index != -1) {
final String front = aImport.substring(0, index);
retVal = front.equals(aPkg);
}
}
return retVal;
}
}

View File

@ -21,6 +21,7 @@ package com.puppycrawl.tools.checkstyle.checks;
import com.puppycrawl.tools.checkstyle.JavaTokenTypes;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.FullIdent;
import java.util.HashSet;
import java.util.Set;
@ -31,7 +32,8 @@ import java.util.Iterator;
* @author <a href="mailto:checkstyle@puppycrawl.com">Oliver Burn</a>
* @version 1.0
*/
public class UnusedImportsCheck extends ImportCheck
public class UnusedImportsCheck
extends ImportCheck
{
/** flag to indicate when time to start collecting references */
private boolean mCollect;
@ -54,10 +56,16 @@ public class UnusedImportsCheck extends ImportCheck
// loop over all the imports to see if referenced.
final Iterator it = mImports.iterator();
while (it.hasNext()) {
final String imp = (String) it.next();
if (!mReferenced.contains(basename(imp))) {
log(666, "unused import " + imp);
final FullIdent imp = (FullIdent) it.next();
if (!mReferenced.contains(basename(imp.getText()))) {
log(imp.getLineNo(),
imp.getColumnNo(),
"import.unused", imp.getText());
}
// else if (isIllegalImport(imp.getText())) {
// mMessages.add(imp.getLineNo(), "import.illegal", imp.getText());
// }
}
}
@ -113,8 +121,8 @@ public class UnusedImportsCheck extends ImportCheck
*/
private void processImport(DetailAST aAST)
{
final String name = getImportText(aAST);
if ((name != null) && !name.endsWith(".*")) {
final FullIdent name = getImportText(aAST);
if ((name != null) && !name.getText().endsWith(".*")) {
mImports.add(name);
}
}
@ -128,4 +136,5 @@ public class UnusedImportsCheck extends ImportCheck
final int i = aType.lastIndexOf(".");
return (i == -1) ? aType : aType.substring(i + 1);
}
}

View File

@ -23,7 +23,7 @@ public class PackageNameCheckTest
final Checker c = createChecker(checkConfig);
final String fname = getPath("InputSimple.java");
final String[] expected = {
"6:1: Name 'com.puppycrawl.tools.checkstyle' must match pattern '[A-Z]+'.",
"6:9: Name 'com.puppycrawl.tools.checkstyle' must match pattern '[A-Z]+'.",
};
verify(c, fname, expected);
}

View File

@ -0,0 +1,28 @@
package com.puppycrawl.tools.checkstyle;
import com.puppycrawl.tools.checkstyle.checks.RedundantImportCheck;
public class RedundantImportCheckTest
extends BaseCheckTestCase
{
public RedundantImportCheckTest(String aName)
{
super(aName);
}
public void testWithChecker()
throws Exception
{
final CheckConfiguration checkConfig = new CheckConfiguration();
checkConfig.setClassname(RedundantImportCheck.class.getName());
final Checker c = createChecker(checkConfig);
final String fname = getPath("InputImport.java");
final String[] expected = {
"7:1: Redundant import from the same package.",
"8:38: Redundant import from the same package.",
"10:1: Redundant import from the java.lang package.",
"11:1: Redundant import from the java.lang package.",
};
verify(c, fname, expected);
}
}

View File

@ -0,0 +1,31 @@
package com.puppycrawl.tools.checkstyle;
import com.puppycrawl.tools.checkstyle.checks.UnusedImportsCheck;
public class UnusedImportsCheckTest
extends BaseCheckTestCase
{
public UnusedImportsCheckTest(String aName)
{
super(aName);
}
public void testDefault()
throws Exception
{
final CheckConfiguration checkConfig = new CheckConfiguration();
checkConfig.setClassname(UnusedImportsCheck.class.getName());
final Checker c = createChecker(checkConfig);
final String fname = getPath("InputImport.java");
final String[] expected = {
"8:45: Unused import - com.puppycrawl.tools.checkstyle.Configuration.",
"11:8: Unused import - java.lang.String.",
"13:8: Unused import - java.util.List.",
"14:8: Unused import - java.util.List.",
"17:8: Unused import - java.util.Enumeration.",
"20:8: Unused import - javax.swing.JToggleButton.",
"22:8: Unused import - javax.swing.BorderFactory.",
};
verify(c, fname, expected);
}
}