blob: 500b30cd0b8904d5e122936993fee24666c4adf8 [file] [log] [blame]
/* *******************************************************************
* Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
* 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://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* PARC initial implementation
* ******************************************************************/
package org.aspectj.weaver;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.aspectj.weaver.patterns.Pointcut;
public class ResolvedPointcutDefinition extends ResolvedMemberImpl {
private Pointcut pointcut;
public ResolvedPointcutDefinition(UnresolvedType declaringType, int modifiers, String name, UnresolvedType[] parameterTypes,
Pointcut pointcut) {
this(declaringType, modifiers, name, parameterTypes, UnresolvedType.VOID, pointcut);
}
/**
* An instance which can be given a specific returnType, used f.e. in if() pointcut for @AJ
*
* @param declaringType
* @param modifiers
* @param name
* @param parameterTypes
* @param returnType
* @param pointcut
*/
public ResolvedPointcutDefinition(UnresolvedType declaringType, int modifiers, String name, UnresolvedType[] parameterTypes,
UnresolvedType returnType, Pointcut pointcut) {
super(POINTCUT, declaringType, modifiers, returnType, name, parameterTypes);
this.pointcut = pointcut;
// XXXpointcut.assertState(Pointcut.RESOLVED);
checkedExceptions = UnresolvedType.NONE;
}
// ----
@Override
public void write(CompressingDataOutputStream s) throws IOException {
getDeclaringType().write(s);
s.writeInt(getModifiers());
s.writeUTF(getName());
UnresolvedType.writeArray(getParameterTypes(), s);
pointcut.write(s);
}
public static ResolvedPointcutDefinition read(VersionedDataInputStream s, ISourceContext context) throws IOException {
ResolvedPointcutDefinition rpd = new ResolvedPointcutDefinition(UnresolvedType.read(s), s.readInt(), s.readUTF(),
UnresolvedType.readArray(s), Pointcut.read(s, context));
rpd.setSourceContext(context); // whilst we have a source context, let's remember it
return rpd;
}
@Override
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("pointcut ");
buf.append((getDeclaringType() == null ? "<nullDeclaringType>" : getDeclaringType().getName()));
buf.append(".");
buf.append(getName());
buf.append("(");
for (int i = 0; i < getParameterTypes().length; i++) {
if (i > 0) {
buf.append(", ");
}
buf.append(getParameterTypes()[i].toString());
}
buf.append(")");
// buf.append(pointcut);
return buf.toString();
}
public Pointcut getPointcut() {
return pointcut;
}
@Override
public boolean isAjSynthetic() {
return true;
}
/**
* Called when asking a parameterized super-aspect for its pointcuts.
*/
@Override
public ResolvedMemberImpl parameterizedWith(UnresolvedType[] typeParameters, ResolvedType newDeclaringType,
boolean isParameterized) {
TypeVariable[] typeVariables = getDeclaringType().resolve(newDeclaringType.getWorld()).getTypeVariables();
if (isParameterized && (typeVariables.length != typeParameters.length)) {
throw new IllegalStateException("Wrong number of type parameters supplied");
}
Map typeMap = new HashMap();
boolean typeParametersSupplied = typeParameters != null && typeParameters.length > 0;
if (typeVariables != null) {
// If no 'replacements' were supplied in the typeParameters array then collapse
// type variables to their first bound.
for (int i = 0; i < typeVariables.length; i++) {
UnresolvedType ut = (!typeParametersSupplied ? typeVariables[i].getFirstBound() : typeParameters[i]);
typeMap.put(typeVariables[i].getName(), ut);
}
}
UnresolvedType parameterizedReturnType = parameterize(getGenericReturnType(), typeMap, isParameterized,
newDeclaringType.getWorld());
UnresolvedType[] parameterizedParameterTypes = new UnresolvedType[getGenericParameterTypes().length];
for (int i = 0; i < parameterizedParameterTypes.length; i++) {
parameterizedParameterTypes[i] = parameterize(getGenericParameterTypes()[i], typeMap, isParameterized,
newDeclaringType.getWorld());
}
ResolvedPointcutDefinition ret = new ResolvedPointcutDefinition(newDeclaringType, getModifiers(), getName(),
parameterizedParameterTypes, parameterizedReturnType, pointcut.parameterizeWith(typeMap,
newDeclaringType.getWorld()));
ret.setTypeVariables(getTypeVariables());
ret.setSourceContext(getSourceContext());
ret.setPosition(getStart(), getEnd());
ret.setParameterNames(getParameterNames());
return ret;
// return this;
}
// for testing
public static final ResolvedPointcutDefinition DUMMY = new ResolvedPointcutDefinition(UnresolvedType.OBJECT, 0, "missing",
UnresolvedType.NONE, Pointcut.makeMatchesNothing(Pointcut.RESOLVED));
public static final ResolvedPointcutDefinition[] NO_POINTCUTS = new ResolvedPointcutDefinition[] {};
public void setPointcut(Pointcut pointcut) {
this.pointcut = pointcut;
}
}