aboutsummaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
authoraclement <aclement>2006-07-25 08:38:09 +0000
committeraclement <aclement>2006-07-25 08:38:09 +0000
commitd373429ee98f689574fb2657ef0739c58ed4e0b8 (patch)
tree0729f014ec4fed877032dd30c488fe0ec2e12dc7 /weaver
parent357bbe9eeb34748f7c8c2ff85049230db2adbbf2 (diff)
downloadaspectj-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.java3
-rw-r--r--weaver/src/org/aspectj/weaver/AsmRelationshipUtils.java84
-rw-r--r--weaver/src/org/aspectj/weaver/ShadowMunger.java54
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) + "..";
- }
- }
+
}