package org.jruby.anno;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.NestingKind;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import java.lang.annotation.Annotation;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Set;
public class ExecutableElementDescriptor extends MethodDescriptor<ExecutableElement> {
public final ExecutableElement method;
public ExecutableElementDescriptor(ExecutableElement method) {
super(method);
this.method = method;
}
protected <A extends Annotation> A getAnnotation(ExecutableElement methodObject, Class<A> annotationType) {
return methodObject.getAnnotation(annotationType);
}
protected int getModifiers(ExecutableElement methodObject) {
Set<javax.lang.model.element.Modifier> mods = methodObject.getModifiers();
int modifierTmp = 0;
try {
for (javax.lang.model.element.Modifier mod : mods) {
modifierTmp |= (Integer) Modifier.class.getField(mod.name()).get(null);
}
}
catch (NoSuchFieldException|IllegalAccessException e) {
throw new RuntimeException(e);
}
return modifierTmp;
}
protected String getDeclaringClassName(ExecutableElement methodObject) {
return getActualQualifiedName((TypeElement) methodObject.getEnclosingElement()).toString();
}
protected String getSimpleName(ExecutableElement methodObject) {
return methodObject.getSimpleName().toString();
}
protected boolean hasContext(ExecutableElement methodObject) {
List<? extends VariableElement> symbolicParameters = methodObject.getParameters();
if (symbolicParameters.size() > 0) {
return symbolicParameters.get(0).asType().toString().equals("org.jruby.runtime.ThreadContext");
}
return false;
}
protected boolean hasBlock(ExecutableElement methodObject) {
List<? extends VariableElement> symbolicParameters = methodObject.getParameters();
if (symbolicParameters.size() > 0) {
return symbolicParameters.get(symbolicParameters.size() - 1).asType().toString().equals("org.jruby.runtime.Block");
}
return false;
}
protected int parameterCount(ExecutableElement methodObject) {
return methodObject.getParameters().size();
}
protected String parameterAsString(ExecutableElement methodObject, int index) {
return methodObject.getParameters().get(index).asType().toString();
}
public static CharSequence getActualQualifiedName(TypeElement td) {
if (td.getNestingKind() == NestingKind.MEMBER) {
return getActualQualifiedName((TypeElement)td.getEnclosingElement()) + "$" + td.getSimpleName();
}
return td.getQualifiedName().toString();
}
}