/* ******************************************************************* * 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; } }