/*
* FindBugs - Find Bugs in Java programs
* Copyright (C) 2005, 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.model;
import java.util.Iterator;
import edu.umd.cs.findbugs.FieldAnnotation;
import edu.umd.cs.findbugs.MethodAnnotation;
import edu.umd.cs.findbugs.ba.SignatureParser;
/**
* Utility methods for using a ClassNameRewriter.
*
* @author David Hovemeyer
*/
public abstract class ClassNameRewriterUtil {
/**
* Rewrite a method signature.
*
* @param classNameRewriter
* a ClassNameRewriter
* @param methodSignature
* a method signature
* @return the rewritten method signature
*/
public static String rewriteMethodSignature(ClassNameRewriter classNameRewriter, String methodSignature) {
if (classNameRewriter != IdentityClassNameRewriter.instance()) {
SignatureParser parser = new SignatureParser(methodSignature);
StringBuilder buf = new StringBuilder();
buf.append('(');
for (Iterator<String> i = parser.parameterSignatureIterator(); i.hasNext();) {
buf.append(rewriteSignature(classNameRewriter, i.next()));
}
buf.append(')');
buf.append(rewriteSignature(classNameRewriter, parser.getReturnTypeSignature()));
methodSignature = buf.toString();
}
return methodSignature;
}
/**
* Rewrite a signature.
*
* @param classNameRewriter
* a ClassNameRewriter
* @param signature
* a signature (parameter, return type, or field)
* @return rewritten signature with class name updated if required
*/
public static String rewriteSignature(ClassNameRewriter classNameRewriter, String signature) {
if (classNameRewriter != IdentityClassNameRewriter.instance() && signature.startsWith("L")) {
String className = signature.substring(1, signature.length() - 1).replace('/', '.');
className = classNameRewriter.rewriteClassName(className);
signature = "L" + className.replace('.', '/') + ";";
}
return signature;
}
/**
* Rewrite a MethodAnnotation to update the class name, and any class names
* mentioned in the method signature.
*
* @param classNameRewriter
* a ClassNameRewriter
* @param annotation
* a MethodAnnotation
* @return the possibly-rewritten MethodAnnotation
*/
public static MethodAnnotation convertMethodAnnotation(ClassNameRewriter classNameRewriter, MethodAnnotation annotation) {
if (classNameRewriter != IdentityClassNameRewriter.instance()) {
annotation = new MethodAnnotation(classNameRewriter.rewriteClassName(annotation.getClassName()),
annotation.getMethodName(), rewriteMethodSignature(classNameRewriter, annotation.getMethodSignature()),
annotation.isStatic());
}
return annotation;
}
/**
* Rewrite a FieldAnnotation to update the class name and field signature,
* if needed.
*
* @param classNameRewriter
* a ClassNameRewriter
* @param annotation
* a FieldAnnotation
* @return the possibly-rewritten FieldAnnotation
*/
public static FieldAnnotation convertFieldAnnotation(ClassNameRewriter classNameRewriter, FieldAnnotation annotation) {
if (classNameRewriter != IdentityClassNameRewriter.instance()) {
annotation = new FieldAnnotation(classNameRewriter.rewriteClassName(annotation.getClassName()),
annotation.getFieldName(), rewriteSignature(classNameRewriter, annotation.getFieldSignature()),
annotation.isStatic());
}
return annotation;
}
}