/*
* Copyright 2012 Chris Pheby
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jadira.scanner.core.helper;
import javassist.Modifier;
import javassist.bytecode.AttributeInfo;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;
public final class JavassistMethodInfoHelper {
private JavassistMethodInfoHelper() {
}
public static String[] getMethodParamTypeNames(MethodInfo methodInfo) {
String desc = methodInfo.getDescriptor();
String paramsString = desc.substring(desc.indexOf('(') + 1, desc.lastIndexOf(')'));
if (paramsString.length() == 0) {
return new String[0];
}
String[] classNames = paramsString.split(";");
return classNames;
}
public static String[] getMethodParamNames(MethodInfo methodInfo) {
String[] retVal = new String[getMethodParamTypeNames(methodInfo).length];
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute localVarAttr = null;
if (codeAttribute != null) {
AttributeInfo attributeInfo = codeAttribute.getAttribute("LocalVariableTable");
localVarAttr = (LocalVariableAttribute) attributeInfo;
}
int j = 0;
if (Modifier.isSynchronized(methodInfo.getAccessFlags())) {
j = j + 1;
}
if (!Modifier.isStatic(methodInfo.getAccessFlags())) {
j = j + 1;
}
for (int i = 0; i < retVal.length; i++) {
if (localVarAttr == null) {
retVal[i] = "" + i;
} else {
retVal[i] = localVarAttr.variableName(i + j);
}
}
return retVal;
}
}