@@ -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; |
@@ -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); |
@@ -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) { | |||
@@ -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); |
@@ -13,24 +13,47 @@ | |||
package org.aspectj.weaver; | |||
import java.util.*; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import org.aspectj.asm.*; | |||
import org.aspectj.asm.internal.ProgramElement; | |||
import org.aspectj.bridge.*; | |||
import org.aspectj.bridge.ISourceLocation; | |||
import org.aspectj.bridge.SourceLocation; | |||
public class AsmAdviceRelationshipProvider { | |||
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) { | |||
// System.err.println("> " + shadow.getThisVar() + " to " + shadow.getTargetVar()); | |||
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 nodeMunger(IHierarchy model, Shadow shadow, ShadowMunger munger) { | |||
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()) { |
@@ -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); | |||
} | |||
} | |||
} |