blob: 4ef079b4930bc3246bfb6b95c7c916a982af4526 [file] [log] [blame]
/* *******************************************************************
* Copyright (c) 2005 Contributors.
* All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0
* which accompanies this distribution and is available at
* http://eclipse.org/legal/epl-v10.html
*
* Contributors:
* Adrian Colyer Initial implementation
* ******************************************************************/
package org.aspectj.internal.lang.reflect;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import org.aspectj.lang.reflect.AjType;
import org.aspectj.lang.reflect.AjTypeSystem;
import org.aspectj.lang.reflect.InterTypeMethodDeclaration;
/**
* @author colyer
*
*/
public class InterTypeMethodDeclarationImpl extends InterTypeDeclarationImpl
implements InterTypeMethodDeclaration {
private String name;
private Method baseMethod;
private int parameterAdjustmentFactor = 1; // no of fake params at start of baseMethod
private AjType<?>[] parameterTypes;
private Type[] genericParameterTypes;
private AjType<?> returnType;
private Type genericReturnType;
private AjType<?>[] exceptionTypes;
public InterTypeMethodDeclarationImpl(AjType<?> decType, String target,
int mods, String name, Method itdInterMethod) {
super(decType, target, mods);
this.name = name;
this.baseMethod = itdInterMethod;
}
public InterTypeMethodDeclarationImpl(AjType<?> decType, AjType<?> targetType, Method base, int modifiers) {
super(decType,targetType,modifiers);
this.parameterAdjustmentFactor = 0;
this.name = base.getName();
this.baseMethod = base;
}
public String getName() {
return this.name;
}
public AjType<?> getReturnType() {
return AjTypeSystem.getAjType(baseMethod.getReturnType());
}
public Type getGenericReturnType() {
Type gRet = baseMethod.getGenericReturnType();
if (gRet instanceof Class) {
return AjTypeSystem.getAjType((Class<?>)gRet);
}
return gRet;
}
public AjType<?>[] getParameterTypes() {
Class<?>[] baseTypes = baseMethod.getParameterTypes();
AjType<?>[] ret = new AjType<?>[baseTypes.length -parameterAdjustmentFactor];
for (int i = parameterAdjustmentFactor; i < baseTypes.length; i++) {
ret[i-parameterAdjustmentFactor] = AjTypeSystem.getAjType(baseTypes[i]);
}
return ret;
}
public Type[] getGenericParameterTypes() {
Type[] baseTypes = baseMethod.getGenericParameterTypes();
Type[] ret = new AjType<?>[baseTypes.length-parameterAdjustmentFactor];
for (int i = parameterAdjustmentFactor; i < baseTypes.length; i++) {
if (baseTypes[i] instanceof Class) {
ret[i-parameterAdjustmentFactor] = AjTypeSystem.getAjType((Class<?>)baseTypes[i]);
} else {
ret[i-parameterAdjustmentFactor] = baseTypes[i];
}
}
return ret;
}
public TypeVariable<Method>[] getTypeParameters() {
return baseMethod.getTypeParameters();
}
public AjType<?>[] getExceptionTypes() {
Class<?>[] baseTypes = baseMethod.getExceptionTypes();
AjType<?>[] ret = new AjType<?>[baseTypes.length];
for (int i = 0; i < baseTypes.length; i++) {
ret[i] = AjTypeSystem.getAjType(baseTypes[i]);
}
return ret;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(java.lang.reflect.Modifier.toString(getModifiers()));
sb.append(" ");
sb.append(getReturnType().toString());
sb.append(" ");
sb.append(this.targetTypeName);
sb.append(".");
sb.append(getName());
sb.append("(");
AjType<?>[] pTypes = getParameterTypes();
for(int i = 0; i < (pTypes.length - 1); i++) {
sb.append(pTypes[i].toString());
sb.append(", ");
}
if (pTypes.length > 0) {
sb.append(pTypes[pTypes.length -1].toString());
}
sb.append(")");
return sb.toString();
}
}