diff options
author | aclement <aclement> | 2006-07-25 08:38:09 +0000 |
---|---|---|
committer | aclement <aclement> | 2006-07-25 08:38:09 +0000 |
commit | d373429ee98f689574fb2657ef0739c58ed4e0b8 (patch) | |
tree | 0729f014ec4fed877032dd30c488fe0ec2e12dc7 /weaver | |
parent | 357bbe9eeb34748f7c8c2ff85049230db2adbbf2 (diff) | |
download | aspectj-d373429ee98f689574fb2657ef0739c58ed4e0b8.tar.gz aspectj-d373429ee98f689574fb2657ef0739c58ed4e0b8.zip |
test and fixes for Bug 145963: add injar aspects to the model
Diffstat (limited to 'weaver')
-rw-r--r-- | weaver/src/org/aspectj/weaver/AsmRelationshipProvider.java | 3 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/AsmRelationshipUtils.java | 84 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/ShadowMunger.java | 54 |
3 files changed, 121 insertions, 20 deletions
diff --git a/weaver/src/org/aspectj/weaver/AsmRelationshipProvider.java b/weaver/src/org/aspectj/weaver/AsmRelationshipProvider.java index 04725f894..a353a845a 100644 --- a/weaver/src/org/aspectj/weaver/AsmRelationshipProvider.java +++ b/weaver/src/org/aspectj/weaver/AsmRelationshipProvider.java @@ -176,6 +176,9 @@ public class AsmRelationshipProvider { return; } + if (World.createInjarHierarchy) { + munger.createHierarchy(); + } IRelationshipMap mapper = AsmManager.getDefault().getRelationshipMap(); IProgramElement targetNode = getNode(AsmManager.getDefault().getHierarchy(), shadow); diff --git a/weaver/src/org/aspectj/weaver/AsmRelationshipUtils.java b/weaver/src/org/aspectj/weaver/AsmRelationshipUtils.java new file mode 100644 index 000000000..e9a1bdbf6 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/AsmRelationshipUtils.java @@ -0,0 +1,84 @@ +/******************************************************************** + * Copyright (c) 2006 Contributors. 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://eclipse.org/legal/epl-v10.html + * + * Contributors: IBM Corporation - initial API and implementation + * Helen Hawkins - initial version + *******************************************************************/ +package org.aspectj.weaver; + +import org.aspectj.weaver.patterns.AndPointcut; +import org.aspectj.weaver.patterns.OrPointcut; +import org.aspectj.weaver.patterns.Pointcut; +import org.aspectj.weaver.patterns.ReferencePointcut; + +/** + * Provides utility methods for generating details for IProgramElements + * used when creating the model both from source (via AsmElementFormatter.visit(..)) + * and when filling in the model for binary aspects (via AsmRelationshipProvider + * bug 145963) + */ +public class AsmRelationshipUtils { + + public static final String UNDEFINED="<undefined>"; + public static final String DECLARE_PRECEDENCE = "precedence"; + public static final String DECLARE_SOFT = "soft"; + public static final String DECLARE_PARENTS = "parents"; + public static final String DECLARE_WARNING = "warning"; + public static final String DECLARE_ERROR = "error"; + public static final String DECLARE_UNKNONWN = "<unknown declare>"; + public static final String POINTCUT_ABSTRACT = "<abstract pointcut>"; + public static final String POINTCUT_ANONYMOUS = "<anonymous pointcut>"; + public static final String DOUBLE_DOTS = ".."; + public static final int MAX_MESSAGE_LENGTH = 18; + public static final String DEC_LABEL = "declare"; + + /** + * Generates the declare message used in the details, for example if + * the declare warning statement has message "There should be no printlns" + * will return 'declare warning: "There should be n.."' + */ + public static String genDeclareMessage(String message) { + int length = message.length(); + if (length < MAX_MESSAGE_LENGTH) { + return message; + } else { + return message.substring(0, MAX_MESSAGE_LENGTH-1) + DOUBLE_DOTS; + } + } + + /** + * Generates the pointcut details for the given pointcut, for example + * an anonymous pointcut will return '<anonymous pointcut>' and + * a named pointcut called p() will return 'p()..' + */ + public static String genPointcutDetails(Pointcut pcd) { + StringBuffer details = new StringBuffer(); + if (pcd instanceof ReferencePointcut) { + ReferencePointcut rp = (ReferencePointcut)pcd; + details.append(rp.name).append(DOUBLE_DOTS); + } else if (pcd instanceof AndPointcut) { + AndPointcut ap = (AndPointcut)pcd; + if (ap.getLeft() instanceof ReferencePointcut) { + details.append(ap.getLeft().toString()).append(DOUBLE_DOTS); + } else { + details.append(POINTCUT_ANONYMOUS).append(DOUBLE_DOTS); + } + } else if (pcd instanceof OrPointcut) { + OrPointcut op = (OrPointcut)pcd; + if (op.getLeft() instanceof ReferencePointcut) { + details.append(op.getLeft().toString()).append(DOUBLE_DOTS); + } else { + details.append(POINTCUT_ANONYMOUS).append(DOUBLE_DOTS); + } + } else { + details.append(POINTCUT_ANONYMOUS); + } + return details.toString(); + } + + +} diff --git a/weaver/src/org/aspectj/weaver/ShadowMunger.java b/weaver/src/org/aspectj/weaver/ShadowMunger.java index df21a4a82..e5e5d0574 100644 --- a/weaver/src/org/aspectj/weaver/ShadowMunger.java +++ b/weaver/src/org/aspectj/weaver/ShadowMunger.java @@ -98,9 +98,6 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH if (null == handle) { ISourceLocation sl = getSourceLocation(); if (sl != null) { - if (World.createInjarHierarchy) { - createHierarchy(); - } IProgramElement ipe = AsmManager.getDefault().getHierarchy().findElementForSourceLine(sl); handle = AsmManager.getDefault().getHandleProvider().createHandleIdentifier(ipe); } @@ -155,6 +152,9 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH */ public abstract ResolvedType getResolvedDeclaringAspect(); + /** + * Creates the hierarchy for binary aspects + */ public void createHierarchy() { IProgramElement sourceFileNode = AsmManager.getDefault().getHierarchy().findElementForSourceLine(getSourceLocation()); if (!sourceFileNode.getKind().equals(IProgramElement.Kind.FILE_JAVA)) { @@ -162,6 +162,7 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH } String name = sourceFileNode.getName(); sourceFileNode.setName(name + " (binary)"); + AsmManager.getDefault().getHandleProvider().createHandleIdentifier(sourceFileNode); ResolvedType aspect = getResolvedDeclaringAspect(); @@ -178,9 +179,29 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH IProgramElement.Kind.PACKAGE, new ArrayList()); root.addChild(pkgNode); + pkgNode.addChild(sourceFileNode); + } else { + for (Iterator iter = pkgNode.getChildren().iterator(); iter.hasNext();) { + IProgramElement element = (IProgramElement) iter.next(); + if (element.getHandleIdentifier().equals( + sourceFileNode.getHandleIdentifier())) { + // already added the sourcefile so have already + // added the structure for this aspect + return; + } + } + pkgNode.addChild(sourceFileNode); } - pkgNode.addChild(sourceFileNode); } else { + for (Iterator iter = root.getChildren().iterator(); iter.hasNext();) { + IProgramElement element = (IProgramElement) iter.next(); + if (element.getHandleIdentifier().equals( + sourceFileNode.getHandleIdentifier())) { + // already added the sourcefile so have already + // added the structure for this aspect + return; + } + } root.addChild(sourceFileNode); } @@ -240,26 +261,19 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH getSourceLocation(), this.getDeclaringType().getModifiers(), null,null); - deowNode.setDetails("\"" + genDeclareMessage(decl.getMessage()) + "\""); + deowNode.setDetails("\"" + AsmRelationshipUtils.genDeclareMessage(decl.getMessage()) + "\""); parent.addChild(deowNode); } else if (element instanceof BcelAdvice) { BcelAdvice advice = (BcelAdvice)element; - parent.addChild(new ProgramElement( - advice.kind.getName(), - IProgramElement.Kind.ADVICE, - getSourceLocation(), - advice.signature.getModifiers(),null,Collections.EMPTY_LIST)); + IProgramElement adviceNode = new ProgramElement( + advice.kind.getName(), + IProgramElement.Kind.ADVICE, + getSourceLocation(), + advice.signature.getModifiers(),null,Collections.EMPTY_LIST); + adviceNode.setDetails(AsmRelationshipUtils.genPointcutDetails(advice.getPointcut())); + parent.addChild(adviceNode); } } } - - // taken from AsmElementFormatter - private String genDeclareMessage(String message) { - int length = message.length(); - if (length < 18) { - return message; - } else { - return message.substring(0, 17) + ".."; - } - } + } |