From: mkersten Date: Sat, 16 Aug 2003 03:14:36 +0000 (+0000) Subject: Added spacewar project for testing. X-Git-Tag: V1_1_1~84 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=eb12f56518d08c54fc17047749a5d2d66b3c4181;p=aspectj.git Added spacewar project for testing. --- diff --git a/ajde/testdata/examples/coverage/ModelCoverage.java b/ajde/testdata/examples/coverage/ModelCoverage.java index bb977e36c..51fb54b89 100644 --- a/ajde/testdata/examples/coverage/ModelCoverage.java +++ b/ajde/testdata/examples/coverage/ModelCoverage.java @@ -107,7 +107,7 @@ aspect DeclareCoverage { pointcut illegalNewFigElt(): call(Point.new(..)) && !withincode(* *.doIt(..)); declare error: illegalNewFigElt(): "Illegal constructor call."; - declare warning: illegalNewFigElt(): "Illegal constructor call."; + declare warning: call(* Point.setX(..)): "Illegal call."; declare parents: Point extends java.io.Serializable; declare parents: Point+ implements java.util.Observable; diff --git a/ajde/testsrc/org/aspectj/ajde/AsmDeclarationsTest.java b/ajde/testsrc/org/aspectj/ajde/AsmDeclarationsTest.java index 9d7bdf79c..028d84140 100644 --- a/ajde/testsrc/org/aspectj/ajde/AsmDeclarationsTest.java +++ b/ajde/testsrc/org/aspectj/ajde/AsmDeclarationsTest.java @@ -55,7 +55,7 @@ public class AsmDeclarationsTest extends AjdeTestCase { assertNotNull(decErrNode); assertEquals(decErrNode.toLabelString(), label); - String decWarnMessage = "declare warning: \"Illegal construct..\""; + String decWarnMessage = "declare warning: \"Illegal call.\""; IProgramElement decWarnNode = model.findElementForSignature(aspect, IProgramElement.Kind.DECLARE_WARNING, "declare warning"); assertNotNull(decWarnNode); assertEquals(decWarnNode.toLabelString(), decWarnMessage); diff --git a/ajde/testsrc/org/aspectj/ajde/AsmRelationshipsTest.java b/ajde/testsrc/org/aspectj/ajde/AsmRelationshipsTest.java index 85df30d08..f4b41a846 100644 --- a/ajde/testsrc/org/aspectj/ajde/AsmRelationshipsTest.java +++ b/ajde/testsrc/org/aspectj/ajde/AsmRelationshipsTest.java @@ -24,6 +24,11 @@ public class AsmRelationshipsTest extends AjdeTestCase { public AsmRelationshipsTest(String name) { super(name); } + + public void testDeclareWarningAndError() { + checkDeclareMapping("DeclareCoverage", "Point", "declare warning: \"Illegal call.\"", + "method-call(void Point.setX(int))", "matched by", "matches declare", IProgramElement.Kind.DECLARE_WARNING); + } public void testInterTypeDeclarations() { checkInterTypeMapping("InterTypeDecCoverage", "Point", "Point.xxx", "Point", @@ -41,6 +46,28 @@ public class AsmRelationshipsTest extends AjdeTestCase { "field-set(int Point.x)", "advises"); } + private void checkDeclareMapping(String fromType, String toType, String from, String to, + String forwardRelName, String backRelName, IProgramElement.Kind kind) { + + IProgramElement aspect = AsmManager.getDefault().getHierarchy().findElementForType(null, fromType); + assertNotNull(aspect); + String beforeExec = from; + IProgramElement beforeExecNode = manager.getHierarchy().findElementForLabel(aspect, kind, beforeExec); + assertNotNull(beforeExecNode); + IRelationship rel = manager.getRelationshipMap().get(beforeExecNode, IRelationship.Kind.DECLARE, forwardRelName); + String handle = (String)rel.getTargets().get(0); + assertEquals(manager.getHierarchy().findElementForHandle(handle).toString(), to); + + IProgramElement clazz = AsmManager.getDefault().getHierarchy().findElementForType(null, toType); + assertNotNull(clazz); + String set = to; + IProgramElement setNode = manager.getHierarchy().findElementForLabel(clazz, IProgramElement.Kind.CODE, set); + assertNotNull(setNode); + IRelationship rel2 = manager.getRelationshipMap().get(setNode, IRelationship.Kind.DECLARE, backRelName); + String handle2 = (String)rel2.getTargets().get(0); + assertEquals(manager.getHierarchy().findElementForHandle(handle2).toString(), from); + } + private void checkUniDirectionalMapping(String fromType, String toType, String from, String to, String relName) { diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AsmInterTypeRelationshipProvider.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AsmInterTypeRelationshipProvider.java index 46a155204..88a9e1953 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AsmInterTypeRelationshipProvider.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AsmInterTypeRelationshipProvider.java @@ -53,7 +53,6 @@ public class AsmInterTypeRelationshipProvider { onType.getSourceLocation().getLine(), onType.getSourceLocation().getColumn()); -// System.err.println(">> putting: " + sourceHandle + ", to " + targetHandle); IRelationshipMap mapper = AsmManager.getDefault().getRelationshipMap(); if (sourceHandle != null && targetHandle != null) { IRelationship foreward = mapper.get(sourceHandle, IRelationship.Kind.DECLARE_INTER_TYPE, INTER_TYPE_DECLARES); diff --git a/weaver/src/org/aspectj/weaver/AsmAdviceRelationshipProvider.java b/weaver/src/org/aspectj/weaver/AsmAdviceRelationshipProvider.java deleted file mode 100644 index 59f65ed8d..000000000 --- a/weaver/src/org/aspectj/weaver/AsmAdviceRelationshipProvider.java +++ /dev/null @@ -1,163 +0,0 @@ -/* ******************************************************************* - * 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 Common Public License v1.0 - * which accompanies this distribution and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * PARC initial implementation - * ******************************************************************/ - - -package org.aspectj.weaver; - -import java.util.*; - -import org.aspectj.asm.*; -import org.aspectj.asm.internal.ProgramElement; -import org.aspectj.bridge.*; - -public class AsmAdviceRelationshipProvider { - - public static final String ADVISES = "advises"; - public static final String ADVISED_BY = "advised by"; - public static final String DECLARES_ON = "declares on"; - public static final String DECLAREDY_BY = "declared by"; - - public static void checkerMunger(IHierarchy model, Shadow shadow) { -// System.err.println("> " + shadow.getThisVar() + " to " + shadow.getTargetVar()); - } - - public static void nodeMunger(IHierarchy model, Shadow shadow, ShadowMunger munger) { - if (munger instanceof Advice) { - Advice advice = (Advice)munger; - if (advice.getKind().isPerEntry() || advice.getKind().isCflow()) { - // TODO: might want to show these in the future - return; - } - IRelationshipMap mapper = AsmManager.getDefault().getRelationshipMap(); - IProgramElement targetNode = getNode(AsmManager.getDefault().getHierarchy(), shadow); - if (advice.getSourceLocation() != null && targetNode != null) { - String adviceHandle = ProgramElement.createHandleIdentifier( - advice.getSourceLocation().getSourceFile(), - advice.getSourceLocation().getLine(), - advice.getSourceLocation().getColumn()); - - if (targetNode != null) { - String targetHandle = targetNode.getHandleIdentifier(); - - IRelationship foreward = mapper.get(adviceHandle, IRelationship.Kind.ADVICE, ADVISES); - if (foreward != null) foreward.getTargets().add(targetHandle); - - IRelationship back = mapper.get(targetHandle, IRelationship.Kind.ADVICE, ADVISED_BY); - if (back != null) back.getTargets().add(adviceHandle); - } - } - - } - } - - private static IProgramElement getNode(IHierarchy model, Shadow shadow) { - Member enclosingMember = shadow.getEnclosingCodeSignature(); - - IProgramElement enclosingNode = lookupMember(model, enclosingMember); - if (enclosingNode == null) { - Lint.Kind err = shadow.getIWorld().getLint().shadowNotInStructure; - if (err.isEnabled()) { - err.signal(shadow.toString(), shadow.getSourceLocation()); - } - return null; - } - - Member shadowSig = shadow.getSignature(); - if (!shadowSig.equals(enclosingMember)) { - IProgramElement bodyNode = findOrCreateCodeNode(enclosingNode, shadowSig, shadow); - return bodyNode; - } else { - return enclosingNode; - } - } - - private static IProgramElement findOrCreateCodeNode(IProgramElement enclosingNode, Member shadowSig, Shadow shadow) - { - for (Iterator it = enclosingNode.getChildren().iterator(); it.hasNext(); ) { - IProgramElement node = (IProgramElement)it.next(); - if (shadowSig.getName().equals(node.getBytecodeName()) && - shadowSig.getSignature().equals(node.getBytecodeSignature())) - { - return node; - } - } - - ISourceLocation sl = shadow.getSourceLocation(); - - IProgramElement peNode = new ProgramElement( - shadow.toString(), - IProgramElement.Kind.CODE, - //XXX why not use shadow file? new SourceLocation(sl.getSourceFile(), sl.getLine()), - new SourceLocation(enclosingNode.getSourceLocation().getSourceFile(), sl.getLine()), - 0, - "", - new ArrayList()); - - peNode.setBytecodeName(shadowSig.getName()); - peNode.setBytecodeSignature(shadowSig.getSignature()); - enclosingNode.addChild(peNode); - return peNode; - } - - private static IProgramElement lookupMember(IHierarchy model, Member member) { - TypeX declaringType = member.getDeclaringType(); - IProgramElement classNode = - model.findElementForType(declaringType.getPackageName(), declaringType.getClassName()); - return findMemberInClass(classNode, member); - } - - private static IProgramElement findMemberInClass( - IProgramElement classNode, - Member member) - { - if (classNode == null) return null; // XXX remove this check - for (Iterator it = classNode.getChildren().iterator(); it.hasNext(); ) { - IProgramElement node = (IProgramElement)it.next(); - //System.err.println("checking: " + member.getName() + " with " + node.getBytecodeName() + ", " + node.getBytecodeSignature()); - if (member.getName().equals(node.getBytecodeName()) && - member.getSignature().equals(node.getBytecodeSignature())) - { - return node; - } - } - // if we can't find the member, we'll just put it in the class - return classNode; - } - -// private static IProgramElement.Kind genShadowKind(Shadow shadow) { -// IProgramElement.Kind shadowKind; -// if (shadow.getKind() == Shadow.MethodCall -// || shadow.getKind() == Shadow.ConstructorCall -// || shadow.getKind() == Shadow.FieldGet -// || shadow.getKind() == Shadow.FieldSet -// || shadow.getKind() == Shadow.ExceptionHandler) { -// return IProgramElement.Kind.CODE; -// -// } else if (shadow.getKind() == Shadow.MethodExecution) { -// return IProgramElement.Kind.METHOD; -// -// } else if (shadow.getKind() == Shadow.ConstructorExecution) { -// return IProgramElement.Kind.CONSTRUCTOR; -// -// } else if (shadow.getKind() == Shadow.PreInitialization -// || shadow.getKind() == Shadow.Initialization) { -// return IProgramElement.Kind.CLASS; -// -// } else if (shadow.getKind() == Shadow.AdviceExecution) { -// return IProgramElement.Kind.ADVICE; -// -// } else { -// return IProgramElement.Kind.ERROR; -// } -// } - -} diff --git a/weaver/src/org/aspectj/weaver/AsmRelationshipProvider.java b/weaver/src/org/aspectj/weaver/AsmRelationshipProvider.java new file mode 100644 index 000000000..b6ce56445 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/AsmRelationshipProvider.java @@ -0,0 +1,186 @@ +/* ******************************************************************* + * 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 Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * PARC initial implementation + * ******************************************************************/ + + +package org.aspectj.weaver; + +import java.util.ArrayList; +import java.util.Iterator; + +import org.aspectj.asm.*; +import org.aspectj.asm.internal.ProgramElement; +import org.aspectj.bridge.ISourceLocation; +import org.aspectj.bridge.SourceLocation; + +public class AsmRelationshipProvider { + + public static final String ADVISES = "advises"; + public static final String ADVISED_BY = "advised by"; + public static final String DECLARES_ON = "declares on"; + public static final String DECLAREDY_BY = "declared by"; + public static final String MATCHED_BY = "matched by"; + public static final String MATCHES_DECLARE = "matches declare"; + + public static void checkerMunger(IHierarchy model, Shadow shadow, Checker checker) { + if (shadow.getSourceLocation() == null || checker == null) return; + + String sourceHandle = ProgramElement.createHandleIdentifier( + checker.getSourceLocation().getSourceFile(), + checker.getSourceLocation().getLine(), + checker.getSourceLocation().getColumn()); + + String targetHandle = ProgramElement.createHandleIdentifier( + shadow.getSourceLocation().getSourceFile(), + shadow.getSourceLocation().getLine(), + shadow.getSourceLocation().getColumn()); + + IRelationshipMap mapper = AsmManager.getDefault().getRelationshipMap(); + if (sourceHandle != null && targetHandle != null) { + IRelationship foreward = mapper.get(sourceHandle, IRelationship.Kind.DECLARE, MATCHED_BY); + foreward.getTargets().add(targetHandle); + + IRelationship back = mapper.get(targetHandle, IRelationship.Kind.DECLARE, MATCHES_DECLARE); + back.getTargets().add(sourceHandle); + } + } + + public static void adviceMunger(IHierarchy model, Shadow shadow, ShadowMunger munger) { + if (munger instanceof Advice) { + Advice advice = (Advice)munger; + if (advice.getKind().isPerEntry() || advice.getKind().isCflow()) { + // TODO: might want to show these in the future + return; + } + IRelationshipMap mapper = AsmManager.getDefault().getRelationshipMap(); + IProgramElement targetNode = getNode(AsmManager.getDefault().getHierarchy(), shadow); + if (advice.getSourceLocation() != null && targetNode != null) { + String adviceHandle = ProgramElement.createHandleIdentifier( + advice.getSourceLocation().getSourceFile(), + advice.getSourceLocation().getLine(), + advice.getSourceLocation().getColumn()); + + if (targetNode != null) { + String targetHandle = targetNode.getHandleIdentifier(); + + IRelationship foreward = mapper.get(adviceHandle, IRelationship.Kind.ADVICE, ADVISES); + if (foreward != null) foreward.getTargets().add(targetHandle); + + IRelationship back = mapper.get(targetHandle, IRelationship.Kind.ADVICE, ADVISED_BY); + if (back != null) back.getTargets().add(adviceHandle); + } + } + + } + } + + private static IProgramElement getNode(IHierarchy model, Shadow shadow) { + Member enclosingMember = shadow.getEnclosingCodeSignature(); + + IProgramElement enclosingNode = lookupMember(model, enclosingMember); + if (enclosingNode == null) { + Lint.Kind err = shadow.getIWorld().getLint().shadowNotInStructure; + if (err.isEnabled()) { + err.signal(shadow.toString(), shadow.getSourceLocation()); + } + return null; + } + + Member shadowSig = shadow.getSignature(); + if (!shadowSig.equals(enclosingMember)) { + IProgramElement bodyNode = findOrCreateCodeNode(enclosingNode, shadowSig, shadow); + return bodyNode; + } else { + return enclosingNode; + } + } + + private static IProgramElement findOrCreateCodeNode(IProgramElement enclosingNode, Member shadowSig, Shadow shadow) + { + for (Iterator it = enclosingNode.getChildren().iterator(); it.hasNext(); ) { + IProgramElement node = (IProgramElement)it.next(); + if (shadowSig.getName().equals(node.getBytecodeName()) && + shadowSig.getSignature().equals(node.getBytecodeSignature())) + { + return node; + } + } + + ISourceLocation sl = shadow.getSourceLocation(); + + IProgramElement peNode = new ProgramElement( + shadow.toString(), + IProgramElement.Kind.CODE, + //XXX why not use shadow file? new SourceLocation(sl.getSourceFile(), sl.getLine()), + new SourceLocation(enclosingNode.getSourceLocation().getSourceFile(), sl.getLine()), + 0, + "", + new ArrayList()); + + peNode.setBytecodeName(shadowSig.getName()); + peNode.setBytecodeSignature(shadowSig.getSignature()); + enclosingNode.addChild(peNode); + return peNode; + } + + private static IProgramElement lookupMember(IHierarchy model, Member member) { + TypeX declaringType = member.getDeclaringType(); + IProgramElement classNode = + model.findElementForType(declaringType.getPackageName(), declaringType.getClassName()); + return findMemberInClass(classNode, member); + } + + private static IProgramElement findMemberInClass( + IProgramElement classNode, + Member member) + { + if (classNode == null) return null; // XXX remove this check + for (Iterator it = classNode.getChildren().iterator(); it.hasNext(); ) { + IProgramElement node = (IProgramElement)it.next(); + //System.err.println("checking: " + member.getName() + " with " + node.getBytecodeName() + ", " + node.getBytecodeSignature()); + if (member.getName().equals(node.getBytecodeName()) && + member.getSignature().equals(node.getBytecodeSignature())) + { + return node; + } + } + // if we can't find the member, we'll just put it in the class + return classNode; + } + +// private static IProgramElement.Kind genShadowKind(Shadow shadow) { +// IProgramElement.Kind shadowKind; +// if (shadow.getKind() == Shadow.MethodCall +// || shadow.getKind() == Shadow.ConstructorCall +// || shadow.getKind() == Shadow.FieldGet +// || shadow.getKind() == Shadow.FieldSet +// || shadow.getKind() == Shadow.ExceptionHandler) { +// return IProgramElement.Kind.CODE; +// +// } else if (shadow.getKind() == Shadow.MethodExecution) { +// return IProgramElement.Kind.METHOD; +// +// } else if (shadow.getKind() == Shadow.ConstructorExecution) { +// return IProgramElement.Kind.CONSTRUCTOR; +// +// } else if (shadow.getKind() == Shadow.PreInitialization +// || shadow.getKind() == Shadow.Initialization) { +// return IProgramElement.Kind.CLASS; +// +// } else if (shadow.getKind() == Shadow.AdviceExecution) { +// return IProgramElement.Kind.ADVICE; +// +// } else { +// return IProgramElement.Kind.ERROR; +// } +// } + +} diff --git a/weaver/src/org/aspectj/weaver/Shadow.java b/weaver/src/org/aspectj/weaver/Shadow.java index a8a1ebd94..029a16d69 100644 --- a/weaver/src/org/aspectj/weaver/Shadow.java +++ b/weaver/src/org/aspectj/weaver/Shadow.java @@ -341,7 +341,7 @@ public abstract class Shadow { munger.implementOn(this); if (world.getModel() != null) { //System.err.println("munger: " + munger + " on " + this); - AsmAdviceRelationshipProvider.nodeMunger(world.getModel(), this, munger); + AsmRelationshipProvider.adviceMunger(world.getModel(), this, munger); } } }