* Contributors: | * Contributors: | ||||
* PARC initial implementation | * PARC initial implementation | ||||
* ******************************************************************/ | * ******************************************************************/ | ||||
package org.aspectj.weaver; | package org.aspectj.weaver; | ||||
import java.lang.reflect.Modifier; | import java.lang.reflect.Modifier; | ||||
//import org.aspectj.weaver.ResolvedType.Name; | |||||
/** | /** | ||||
* The AjcMemberMaker is responsible for creating the representations of methods/fields/etc that are placed in both aspects and | * The AjcMemberMaker is responsible for creating the representations of methods/fields/etc that are placed in both aspects and | ||||
* affected target types. It uses the NameMangler class to create the actual names that will be used. | * affected target types. It uses the NameMangler class to create the actual names that will be used. | ||||
} | } | ||||
public static ResolvedMember perCflowField(UnresolvedType declaringType) { | public static ResolvedMember perCflowField(UnresolvedType declaringType) { | ||||
return new ResolvedMemberImpl(Member.FIELD, declaringType, PUBLIC_STATIC_FINAL, NameMangler.PERCFLOW_FIELD_NAME, | |||||
return new ResolvedMemberImpl(Member.FIELD, declaringType, PUBLIC_STATIC, NameMangler.PERCFLOW_FIELD_NAME, | |||||
CFLOW_STACK_TYPE.getSignature()); | CFLOW_STACK_TYPE.getSignature()); | ||||
} | } | ||||
pointcutKind = CFLOW; | pointcutKind = CFLOW; | ||||
} | } | ||||
/** | |||||
* @return Returns true is this is a cflowbelow pointcut | |||||
*/ | |||||
public boolean isCflowBelow() { | public boolean isCflowBelow() { | ||||
return isBelow; | return isBelow; | ||||
} | } | ||||
} else { | } else { | ||||
// Create a counter field in the aspect | // Create a counter field in the aspect | ||||
localCflowField = new ResolvedMemberImpl(Member.FIELD, concreteAspect, Modifier.STATIC | Modifier.PUBLIC | |||||
| Modifier.FINAL, NameMangler.cflowCounter(xcut), UnresolvedType.forName(NameMangler.CFLOW_COUNTER_TYPE) | |||||
localCflowField = new ResolvedMemberImpl(Member.FIELD, concreteAspect, Modifier.STATIC | Modifier.PUBLIC, | |||||
NameMangler.cflowCounter(xcut), UnresolvedType.forName(NameMangler.CFLOW_COUNTER_TYPE) | |||||
.getSignature()); | .getSignature()); | ||||
// Create type munger to add field to the aspect | // Create type munger to add field to the aspect | ||||
localCflowField = (ResolvedMember) field; | localCflowField = (ResolvedMember) field; | ||||
} else { | } else { | ||||
localCflowField = new ResolvedMemberImpl(Member.FIELD, concreteAspect, Modifier.STATIC | Modifier.PUBLIC | |||||
| Modifier.FINAL, NameMangler.cflowStack(xcut), UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE) | |||||
localCflowField = new ResolvedMemberImpl(Member.FIELD, concreteAspect, Modifier.STATIC | Modifier.PUBLIC, | |||||
NameMangler.cflowStack(xcut), UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE) | |||||
.getSignature()); | .getSignature()); | ||||
// System.out.println("adding field to: " + inAspect + " field " | // System.out.println("adding field to: " + inAspect + " field " | ||||
// + cflowField); | // + cflowField); |
return ret; | return ret; | ||||
} | } | ||||
Member cflowStackField = new ResolvedMemberImpl(Member.FIELD, inAspect, Modifier.STATIC | Modifier.PUBLIC | Modifier.FINAL, | |||||
Member cflowStackField = new ResolvedMemberImpl(Member.FIELD, inAspect, Modifier.PUBLIC | Modifier.STATIC, | |||||
UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE), NameMangler.PERCFLOW_FIELD_NAME, UnresolvedType.NONE); | UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE), NameMangler.PERCFLOW_FIELD_NAME, UnresolvedType.NONE); | ||||
World world = inAspect.getWorld(); | World world = inAspect.getWorld(); |
*/ | */ | ||||
public class Ajc192Tests extends XMLBasedAjcTestCase { | public class Ajc192Tests extends XMLBasedAjcTestCase { | ||||
public void testCflowFinal() { | |||||
runTest("no final on cflow elements"); | |||||
} | |||||
public void testAroundAdvice_AnnoStyle() { | |||||
runTest("around advice"); | |||||
} | |||||
public void testAroundAdvice_CodeStyle() { | |||||
runTest("around advice - 2"); | |||||
} | |||||
public void testPTW_nonPrivileged() { | public void testPTW_nonPrivileged() { | ||||
runTest("ptw"); | runTest("ptw"); | ||||
} | } |
<suite> | <suite> | ||||
<ajc-test dir="bugs192/537825" title="no final on cflow elements"> | |||||
<compile files="Code.java" options="-9"> | |||||
</compile> | |||||
<run class="Code"> | |||||
<stdout> | |||||
<line text="call(void B.methodB())"/> | |||||
<line text="staticinitialization(B.<clinit>)"/> | |||||
<line text="execution(void B.methodB())"/> | |||||
<line text="call(void C.methodC())"/> | |||||
<line text="staticinitialization(C.<clinit>)"/> | |||||
<line text="execution(void C.methodC())"/> | |||||
<line text="call(void D.methodD())"/> | |||||
<line text="staticinitialization(D.<clinit>)"/> | |||||
<line text="execution(void D.methodD())"/> | |||||
<line text="get(PrintStream java.lang.System.out)"/> | |||||
<line text="call(void java.io.PrintStream.println(int))"/> | |||||
<line text="3"/> | |||||
</stdout> | |||||
</run> | |||||
</ajc-test> | |||||
<ajc-test dir="bugs192/535156" title="around advice"> | |||||
<compile files="DemoApp.java" options="-8 -showWeaveInfo"> | |||||
<message kind="weave" text="Join point 'method-call(void DemoApp.say())' in Type 'DemoApp' (DemoApp.java:6) advised by around advice from 'X' (DemoApp.java:14)"/> | |||||
</compile> | |||||
<run class="DemoApp"> | |||||
</run> | |||||
</ajc-test> | |||||
<ajc-test dir="bugs192/535156" title="around advice - 2"> | |||||
<compile files="DemoApp2.java" options="-8 -showWeaveInfo"> | |||||
<message kind="weave" text="Join point 'method-call(void DemoApp2.say())' in Type 'DemoApp2' (DemoApp2.java:6) advised by around advice from 'X' (DemoApp2.java:13)"/> | |||||
</compile> | |||||
<run class="DemoApp2"> | |||||
</run> | |||||
</ajc-test> | |||||
<ajc-test dir="bugs192/ptw" title="ptw"> | <ajc-test dir="bugs192/ptw" title="ptw"> | ||||
<compile files="a/b/c/Code.java a/b/d/Foo.java" options="-8"> | <compile files="a/b/c/Code.java a/b/d/Foo.java" options="-8"> | ||||
</compile> | </compile> |
/******************************************************************************* | /******************************************************************************* | ||||
* Copyright (c) 2014 Contributors | |||||
* Copyright (c) 2014,2018 Contributors | |||||
* All rights reserved. This program and the accompanying materials | * All rights reserved. This program and the accompanying materials | ||||
* are made available under the terms of the Eclipse Public License v1.0 | * are made available under the terms of the Eclipse Public License v1.0 | ||||
* which accompanies this distribution, and is available at | * which accompanies this distribution, and is available at | ||||
*******************************************************************************/ | *******************************************************************************/ | ||||
package org.aspectj.systemtest.apt; | package org.aspectj.systemtest.apt; | ||||
import junit.framework.Test; | |||||
import org.aspectj.apache.bcel.classfile.Method; | |||||
import java.io.File; | |||||
import org.aspectj.testing.XMLBasedAjcTestCase; | import org.aspectj.testing.XMLBasedAjcTestCase; | ||||
import org.aspectj.util.LangUtil; | import org.aspectj.util.LangUtil; | ||||
import java.io.File; | |||||
import junit.framework.Test; | |||||
/** | /** | ||||
* Annotation processing tool tests. | * Annotation processing tool tests. |