All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.aspectj.weaver.patterns.Declare Maven / Gradle / Ivy

Go to download

AspectJ tools most notably contains the AspectJ compiler (AJC). AJC applies aspects to Java classes during compilation, fully replacing Javac for plain Java classes and also compiling native AspectJ or annotation-based @AspectJ syntax. Furthermore, AJC can weave aspects into existing class files in a post-compile binary weaving step. This library is a superset of AspectJ weaver and hence also of AspectJ runtime.

There is a newer version: 1.9.22.1
Show newest version
/* *******************************************************************
 * 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