org.aspectj.weaver.patterns.Declare Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aspectjmatcher Show documentation
Show all versions of aspectjmatcher Show documentation
The AspectJ matcher can be used for matching pointcuts independently of any AspectJ compilation or weaving steps.
Most notably, this can be used by frameworks such as Spring AOP which utilise the @AspectJ pointcut syntax but
implement aspect weaving in a way independent of AspectJ, e.g. using dynamic proxies.
/* *******************************************************************
* 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 v 2.0
* which accompanies this distribution and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
*
* Contributors:
* PARC initial implementation
* ******************************************************************/
package org.aspectj.weaver.patterns;
import java.io.IOException;
import java.util.Map;
import org.aspectj.weaver.ISourceContext;
import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.UnresolvedType;
import org.aspectj.weaver.VersionedDataInputStream;
import org.aspectj.weaver.World;
public abstract class Declare extends PatternNode {
public static final byte ERROR_OR_WARNING = 1;
public static final byte PARENTS = 2;
public static final byte SOFT = 3;
public static final byte DOMINATES = 4;
public static final byte ANNOTATION = 5;
public static final byte PARENTSMIXIN = 6;
public static final byte TYPE_ERROR_OR_WARNING = 7;
// set when reading declare from aspect
private ResolvedType declaringType;
public static Declare read(VersionedDataInputStream s, ISourceContext context) throws IOException {
byte kind = s.readByte();
switch (kind) {
case ERROR_OR_WARNING:
return DeclareErrorOrWarning.read(s, context);
case DOMINATES:
return DeclarePrecedence.read(s, context);
case PARENTS:
return DeclareParents.read(s, context);
case SOFT:
return DeclareSoft.read(s, context);
case ANNOTATION:
return DeclareAnnotation.read(s, context);
case PARENTSMIXIN:
return DeclareParentsMixin.read(s, context);
case TYPE_ERROR_OR_WARNING:
return DeclareTypeErrorOrWarning.read(s, context);
default:
throw new RuntimeException("unimplemented");
}
}
/**
* Returns this declare mutated
*/
public abstract void resolve(IScope scope);
/**
* Returns a version of this declare element in which all references to type variables are replaced with their bindings given in
* the map.
*/
public abstract Declare parameterizeWith(Map typeVariableBindingMap, World w);
/**
* Indicates if this declare should be treated like advice. If true, the declare will have no effect in an abstract aspect. It
* will be inherited by any concrete aspects and will have an effect for each concrete aspect it is ultimately inherited by.
*/
public abstract boolean isAdviceLike();
/**
* Declares have methods in the .class file against which info can be stored (for example, the annotation in the case of declare
* annotation). The name is of the form ajc$declare_XXX_NNN where XXX can optionally be set in this 'getNameSuffix()' method -
* depending on whether, at weave time, we want to easily differentiate between the declare methods.
*/
public abstract String getNameSuffix();
public void setDeclaringType(ResolvedType aType) {
this.declaringType = aType;
}
public ResolvedType getDeclaringType() {
return declaringType;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy