123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * 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:
- * IBM Corporation
- *******************************************************************************/
- package org.aspectj.ajdt.internal.compiler.ast;
-
- import java.util.ArrayList;
- import java.util.List;
-
- import org.aspectj.org.eclipse.jdt.internal.compiler.ClassFile;
- import org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult;
- import org.aspectj.org.eclipse.jdt.internal.compiler.IAttribute;
- import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
- import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
- import org.aspectj.weaver.AjAttribute;
-
- /**
- * Root class for all MethodDeclaration objects created by the parser.
- * Enables us to generate extra attributes in the method_info attribute
- * to support aspectj.
- *
- */
- public class AjMethodDeclaration extends MethodDeclaration {
-
- private List<IAttribute> attributes = null;
-
- /**
- * @param compilationResult
- */
- public AjMethodDeclaration(CompilationResult compilationResult) {
- super(compilationResult);
- }
-
- // general purpose hook to add an AjAttribute to this method
- // used by @AspectJ visitor to add pointcut attribute to @Advice
- protected void addAttribute(EclipseAttributeAdapter eaa) {
- if (attributes==null) attributes = new ArrayList<>();
- attributes.add(eaa);
- }
-
- /**
- * Overridden to add extra AJ stuff, also adds synthetic if boolean is true.
- */
- protected int generateInfoAttributes(ClassFile classFile,boolean addAjSynthetic) {
- // add extra attributes into list then call 2-arg version of generateInfoAttributes...
- List<IAttribute> extras = (attributes==null?new ArrayList<>():attributes);
- addDeclarationStartLineAttribute(extras,classFile);
- if (addAjSynthetic) {
- extras.add(new EclipseAttributeAdapter(new AjAttribute.AjSynthetic()));
- }
- return classFile.generateMethodInfoAttributes(binding,extras);
- }
-
- @Override
- protected int generateInfoAttributes(ClassFile classFile) {
- return generateInfoAttributes(classFile,false);
- }
-
- protected void addDeclarationStartLineAttribute(List extraAttributeList, ClassFile classFile) {
- if ((classFile.codeStream.generateAttributes & ClassFileConstants.ATTR_LINES)==0) return;
-
- int[] separators = compilationResult().lineSeparatorPositions;
- int declarationStartLine = 1;
- for (int separator : separators) {
- if (sourceStart < separator) break;
- declarationStartLine++;
- }
-
- extraAttributeList.add(
- new EclipseAttributeAdapter(new AjAttribute.MethodDeclarationLineNumberAttribute(declarationStartLine, this.sourceStart())));
- }
- }
|