From a0d450944630dbc637ed841cf33eecbdebe2a3d2 Mon Sep 17 00:00:00 2001 From: acolyer Date: Mon, 6 Dec 2004 13:58:33 +0000 Subject: [PATCH] work in progress.... annotation pointcuts, parsing, and patterns --- .../compiler/lookup/EclipseShadow.java | 24 ++ .../compiler/lookup/PointcutBinding.java | 4 +- .../testdata/OutjarTest/aspects.jar | Bin 1255 -> 1290 bytes .../testdata/OutjarTest/child.jar | Bin 719 -> 719 bytes .../testdata/OutjarTest/parent.jar | Bin 628 -> 628 bytes tests/harness/classpathTest/jars/required.jar | Bin 448 -> 681 bytes .../classpathTest/jars/requiredAspects.jar | Bin 898 -> 1330 bytes .../expClasses/expected/Main.class | Bin 355 -> 414 bytes .../org/aspectj/weaver/AnnotatedElement.java | 19 ++ weaver/src/org/aspectj/weaver/Member.java | 9 +- weaver/src/org/aspectj/weaver/Shadow.java | 8 + weaver/src/org/aspectj/weaver/TypeX.java | 7 +- .../org/aspectj/weaver/bcel/BcelShadow.java | 88 +++++- .../patterns/AndAnnotationTypePattern.java | 83 ++++++ .../weaver/patterns/AndTypePattern.java | 2 +- .../patterns/AnnotationPatternList.java | 133 +++++++++ .../patterns/AnnotationTypePattern.java | 99 ++++++ .../patterns/ArgsAnnotationPointcut.java | 94 ++++++ .../weaver/patterns/BasicTokenSource.java | 1 + .../BindingAnnotationTypePattern.java | 80 +++++ .../weaver/patterns/BindingPattern.java | 19 ++ .../weaver/patterns/BindingTypePattern.java | 17 +- .../org/aspectj/weaver/patterns/Bindings.java | 16 +- .../patterns/ExactAnnotationTypePattern.java | 122 ++++++++ .../weaver/patterns/ExactTypePattern.java | 22 +- .../patterns/KindedAnnotationPointcut.java | 186 ++++++++++++ .../patterns/NotAnnotationTypePattern.java | 74 +++++ .../weaver/patterns/NotTypePattern.java | 2 +- .../patterns/OrAnnotationTypePattern.java | 77 +++++ .../weaver/patterns/OrTypePattern.java | 2 +- .../weaver/patterns/PatternParser.java | 282 +++++++++++++++++- .../org/aspectj/weaver/patterns/Pointcut.java | 3 +- .../ThisOrTargetAnnotationPointcut.java | 97 ++++++ .../aspectj/weaver/patterns/TypePattern.java | 30 +- .../weaver/patterns/WildTypePattern.java | 25 +- .../patterns/WithinAnnotationPointcut.java | 94 ++++++ .../WithinCodeAnnotationPointcut.java | 94 ++++++ weaver/testdata/dummyAspect.jar | Bin 823 -> 852 bytes weaver/testdata/ltw-acaspects.jar | Bin 2448 -> 2483 bytes weaver/testdata/ltw-aspects.jar | Bin 1467 -> 1503 bytes weaver/testdata/ltw-classes.jar | Bin 1486 -> 1486 bytes weaver/testdata/ltw-deaspects.jar | Bin 1085 -> 1127 bytes weaver/testdata/ltw-dwaspects.jar | Bin 1089 -> 1133 bytes weaver/testdata/ltw-itdaspects.jar | Bin 4879 -> 4994 bytes weaver/testdata/ltw-peraspects.jar | Bin 1870 -> 1907 bytes weaver/testdata/ltw-woven.jar | Bin 2672 -> 2721 bytes weaver/testdata/megatrace.jar | Bin 5275 -> 5449 bytes weaver/testdata/megatrace0easy.jar | Bin 3238 -> 3330 bytes weaver/testdata/megatrace0hard.jar | Bin 3139 -> 3228 bytes weaver/testdata/megatraceNoweave.jar | Bin 3038 -> 3085 bytes weaver/testdata/tracing.jar | Bin 2617 -> 2691 bytes .../org/aspectj/weaver/TestShadow.java | 42 +++ .../weaver/patterns/BindingTestCase.java | 4 +- .../KindedAnnotationPointcutTestCase.java | 27 ++ 54 files changed, 1826 insertions(+), 60 deletions(-) create mode 100644 weaver/src/org/aspectj/weaver/AnnotatedElement.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/AndAnnotationTypePattern.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/AnnotationPatternList.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/AnnotationTypePattern.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/ArgsAnnotationPointcut.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/BindingAnnotationTypePattern.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/BindingPattern.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/ExactAnnotationTypePattern.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/KindedAnnotationPointcut.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/NotAnnotationTypePattern.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/OrAnnotationTypePattern.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/ThisOrTargetAnnotationPointcut.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/WithinAnnotationPointcut.java create mode 100644 weaver/src/org/aspectj/weaver/patterns/WithinCodeAnnotationPointcut.java create mode 100644 weaver/testsrc/org/aspectj/weaver/patterns/KindedAnnotationPointcutTestCase.java diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseShadow.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseShadow.java index eebb06dab..3ba294132 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseShadow.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseShadow.java @@ -100,7 +100,31 @@ public class EclipseShadow extends Shadow { public Var getThisEnclosingJoinPointStaticPartVar() { throw new RuntimeException("unimplemented"); } + + public Var getArgAnnotationVar(int i, TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + + public Var getKindedAnnotationVar(TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + + public Var getTargetAnnotationVar(TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + public Var getThisAnnotationVar(TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + + public Var getWithinAnnotationVar(TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + + public Var getWithinCodeAnnotationVar(TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + // --- factory methods public static EclipseShadow makeShadow(EclipseFactory world, ASTNode astNode, diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PointcutBinding.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PointcutBinding.java index ce8012806..51456722c 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PointcutBinding.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PointcutBinding.java @@ -20,14 +20,14 @@ import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding; public class PointcutBinding extends Binding { /** - * @see org.eclipse.jdt.internal.compiler.lookup.Binding#bindingType() + * @see org.eclipse.jdt.internal.compiler.lookup.BindingPattern#bindingType() */ public int bindingType() { return 0; } /** - * @see org.eclipse.jdt.internal.compiler.lookup.Binding#readableName() + * @see org.eclipse.jdt.internal.compiler.lookup.BindingPattern#readableName() */ public char[] readableName() { return null; diff --git a/org.aspectj.ajdt.core/testdata/OutjarTest/aspects.jar b/org.aspectj.ajdt.core/testdata/OutjarTest/aspects.jar index 07b10246a2314241b049bb3dcda96443453a1dea..807d8a372f9334e26c26e3d0bd3180da477e25ae 100644 GIT binary patch delta 1039 zcmV+q1n~Rk35p60P)h>@6aWYS2moYVhLH_?17ux>k&GmN-ESL35dW<|;t!lQxJ}yd zk)~i;+bwoVfrciuBu*;H^8w|;EWtAb-kS(%1VM542HOz4V1?2NcV7P!ZhH@mGWH>c| zK7$t-PA)p0xD#%z3x7o`8H$V2=I$!@9lej0L$ii|x`0s~JcTi$S8XR?nAG%qLkYj6 z^Zh)^w{)enzA-&LJ#~#Uj7xvB#*MyHyD#{*@N09eZAag-HsI_Nq1v*wAZ(ZWTshJ^ z%CWEP&D}tWtqfkFipWqMR@ssDW#92sQ~82#%@iuyAba!MFXI_S0>(-7fy1FJA)Z?LyOP<9QhU$Pk2acXjeiT>p zn8Mo(xi$}?C}z0snOyV`jm25zn=pw#Ll9F= z4mgVl8`4u^=Q$>K&9W-|z%UFda%9p}TnU_~tEA|2P9U$p43frm-Dw@7caF4FP}*Il zmC;)G1t)$&_T%b9jO-ark}QiPoiaXJGfeN%L(h8bnXVq-%$}h-tpi0$oHb5^D#4c<&*u@AbJ1Va7^OM*r4aYJ8;9a`R`?K8NI>sCX$yTboWN@Xo@#jRWP3+@KuuJpeM zy4)6l6=n0$g4nit$B%bfs%A@HSV{z{rG1w|MftDL)(U*v(s!{AKO|xtBYa9#_|~w4 zQOnpe;cLP-gdYh{Dcx~GnNTIn6BY<-gpja9_<`^%;djCl!k_rS%#1G4oF3vN@GnqH z2MCUVuuic9007wr002-+0Rj{N6aWYS2moYVhLc+aLk(nIhB1zTuuic9007yOs{}R% JZv+4U005!B@&y0@ delta 1004 zcmV@6aWYS2mq>p6Oj#k1FC=%k&GmNU2hvj6g}gQ_yea6Zj&~A zq$!xzc8i@-prHvZX-Xv^Gyz9JL6)k?dJ?bY?1tTOlJdX{@Wca8{03h7(4FemUrO9oe~bK#b9bP7UXq$RgywJp7k z>f&0&1$a=XM_&ai~t!4zy8uKj`)Ld_)t+elb zOF^$iOxGNI5irYpHV>HNg`YBfW0Ap}?e}m+M*u z1(WZ+ZoY*pg|+qR>FKF!QefNsOZo*V8o}D7iV4!vxM{@G2&G-J6r$1S^};^@^o5 zUi+_qIQ?EJ6a-RRM$z^dx!BV{TCiO+rIj2m;9?eUpvd-gFR{2zl49vt?88@IlS2w=)2TNFF4D9bnRe;!`rSCU{EpZ7aMw{=rY0#=qoIsSp2ih{@_;-Cj-E+= z6j!sD!rKCwrVP7L>~MW)b1_3S7G;&K`JKRjQFmN344J5evL$d~z|EF?R?X??o(}%c z5JZ%d1J1gH^S-Cmt{z;$FYHp&QY)Nio(X=dF=WlyQyMo#)j_$H)QRc}mqo9tj&bX2ZT~xsTi@EFDSqG5rk5#Dn;Q zK98*V=k$4;vwF%;5L-RKdyjB^ug@iai5V-+;(e~G$NqNKH!7EiTk>QwQi#M+0S8I3 zb>b_cP6W7NZX^zmZ*uz(pMQM4&f#>oLRF83>fTOR@0~H(YUqmN2db`Bs2ftt`eH{j z$z^WqVc^tF!u7*XfpN!(&xr4c=S-Y^5lh53#J9vx#4{!}P85kUaf`T3tP&kEVwd=l z_?7sbcuM?<56pbVfqwx|O9u$(aISZb0{{S#1^@t1O928D02BZS00;o8fD@B`1Vas~ afDBat84ycQLsF02Q-O&y1H)(EGpBvL zb@eXtdh2SPJ9B<>kiiw>2TzOiynJ;$eJ_@-+7eWtqvzqP_c5s8+|) zi6Ow7onzCL@GeWBMdm;pfYW+OplnuRk$zEXVQFSjYKp#lPJU8ij$U$3VsUY<|7pKN z4kEV9tzIiX3CVkxXZieQlrop{<$1w$=+NCQcMh01uf8nyxPHeM;TtW@x^m(1sOP5vLG#yH(f!rAyy@jGuh|39-878z^~ zOj|LpBO+xv&(pung3YDVdQQ5shO&!YlaR6%yj*I>?ZI2A(7Eugx09ZG3}^8ASz%_P zn$Fw5_y5`$CipVoX~>E@Mirg2Ds1*%R#ST4_+!qL>&tUy^_sRa*Np?S;b#Y6;^^38388O!*4zo#Bt&Tk7d;fyW+7owgNpG7s zFL0yS)1&g+vJQq_nxDA)MA<$@P&CZ(SozI?k%8ef5C?cOGKnxC(gAW5fzkmgz?CY{ gO+mH+6rBiA4`kwu+yHM@Hjq*#AnXOwY)l{?01yrF7ytkO delta 393 zcmZ3o|_vsJo#Po{PTP3`r7)MLq`P5I2N-8 zH$LK@8c-t_bHXO=5~JWR?r$fUPHx)$KrQaWl9B|WH^LJ;KTSz^_x3!;wMe_?c2*l~ zBO>aRzc@|&_*$!XXIF%dWunA0&dJ8hT;^_fUA;$~HBsi@H8Zk~NLH{$DySpv=#lBeW+oZe`2-?ps@SKl0C#DocFP`8u`X z75|GDFLW+=MOm}w7sSub_IKZ{8TI1Ti}g}l)@7G&jA)Ge{bPgcuXonR&g;L3@Gkz@ zo@mbFoPQ{+_|`wh0B?4V|MQmU%P=x9OaS5lZ$>5&21EcN%SkezfQhqY!~(oo*+7Df OK-O&y1H)(EGpBvL zb@eXtdh2SPJ9B<>kiiw>2TzOiynJ;$eJ_@-+7eWtqvzqP_c5s8+|) zi6Ow7onzCL@GeWBMdm;p0Jpvj&3a{^Y)NWyNn&w9YI2EwaAta5VvcWOW?oQfUS48S zPO4sVPGWI!Ylv@tu)Bz@aQ!jUPR^f8CQNuV?FgfEhEuRm;|k`W+YCZ(ZXy1w)XqEq zIdj@3``(QM@-O6HE|M1WjbIU7c{gz7>`gE9U#$B5?)E)N`=f=QFGX3+vo`)dulV`7 z+Rvxs?f-Br=rL{E9Mv+bJ@?@&ud}zO-PwQI_U8g+)%%}Z*?JaUcoZA=ap#?NckX9R zOlIS3E4)|KJ@3mG*>^u>Rafm1=4$IayYKtqWnA+lr7q1hdzZT~Yu=r2t$a_OPbyjJ ztynz!|4e4q^y{(rJ?-F3)@x$nn;H18=H}X$kFLu|A(_9x58yOpy7n3}L^Geyy=eM-%h4*NO{0v+Cdgi1l$=}{_ z-Q|&zKJ<0xqg&i5_O)J{p3gZd*>+hZrn5;~P5!*hT(^ZrGg3V|*G-tUF6-fi*sEKV zwr@RJCHLH5{$Uxr1-rgSyt7Z75g+mAe)g%i6DoL()vFmJXyTV%1OxP+d}xr=HA z`a4pW&u5jrx#RC0(cI!=JYwusCd*bt>KIN*Iwy3y^I3!Njw#NZscjF{_^UT<+q`en z&6#|&dOn@G+SFHcRQ7zyp(}wOH(j)Nrl)+b*s$96T9(4rin^ZD%GOs}xmNOg-1>Is z6_e{spQq$cvU{cY#OM8F)8tdW$+P~oXHI=+J1cg{#EUcPdndl1@ORS}uGZMylN8Py zZt}Y+A@AC;A<6b&{HTuie z6Ts`f(#f^P<8wdH+NY75<{Y>pCsyb7kk_mKxZb;k8~RWAZ~0=IYv`Th(N-uK&UPq$ ztxV^ehp(cSOwt$DXICnEc2=fi#^%>4`ww1tTwC*p>-27BMa?x4uchn^C%svavD&1z zJ%82pxmgePF9 zZVXVpAXn|R;95d%P1gFWA7aeoJ(+&6gGzy!-nn^r3YzgpYWdmtq0>bG)x)tma0PV#;*Z=?k delta 823 zcmV-71IYZc3W5g?P)h>@6aWYS2ms)6CN7bUG=EcFPZL2DJ=5;CrBo;=pYlyrKBQ}+ zCPoN^keFyt5=v_H#Y~rhZf&Q{?zHId@s&iu2Z$y<^5BavCjJF~g?eYYPze<`IXg3V z&zyVb%-*lRK7BzH3%JcNszji8P!q0la^9}w<)_?}n{_F9p)BHH4CxYYaHq`WuCq}n z5q~j`D8nExxtW^qbDrES3ssemB?(DaFpRHXD!Ry!SaQpr^wcs#bY?csV69cRX=hT4 zHb141L?Vd@IvKjxJt>~mD+S?iX$6Mf^{UIudG3399R_1dMl*$Oz0*RPbXCy{818Ca zzN3V{DOBB;RCA_P9V@?e|Qq=PJgud z)>K`qN+sT?_7y)jLr!reFiFK&04R|zo@Oy55GT+PXf=Z7V;v)PV0c#yhlTI%Gp0kM zj@ola=+V>&y6BxUL7>-&pWl3yHb-!cRzEB|Wn>~?d7XwR%(7us$Pt?T4jVI|aC2}{r;zMF}5 zW-4?h*4uxKk(P`4ZvdHOlZzb~#Tc!}jahnEIyBBY#N>xCI)&+Toc@rLJVfRMwzVJK zZ?1JOpJNV~TtMe%L|z=>#z)*dXv*W3abO0sn##_OMke7s#FK|kv04$%o_`1&;hJs> zoFez72m;3~^B|~kRn*PbS}g>=d)lAecP{NJ^P5wu9%G9>5~wwSCBibHK-eZ!2=53d zgl|Mm6V?dyjlCw&jj@6<)W2Q(7#JAz7(^#>&D7V+FG|--EG|e*F3Hj>PfaXKEz7FaY;?i zNi0e%$;{95$;?ajE6q(xEt9VFzWCNG6(_Lj10m+l8HeC0N2$U A#Q*>R delta 43 ycmbQo{FsUB)W2Q(7?>G!8AK*>&763pg^_V`GNTT^0D~X{0|O(25RhbI5C#A!6$!5Z diff --git a/weaver/src/org/aspectj/weaver/AnnotatedElement.java b/weaver/src/org/aspectj/weaver/AnnotatedElement.java new file mode 100644 index 000000000..eae2c1a5c --- /dev/null +++ b/weaver/src/org/aspectj/weaver/AnnotatedElement.java @@ -0,0 +1,19 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver; + +/** + * Represents any element that may have annotations + */ +public interface AnnotatedElement { + boolean hasAnnotation(TypeX ofType); + + // SomeType getAnnotation(TypeX ofType); +} diff --git a/weaver/src/org/aspectj/weaver/Member.java b/weaver/src/org/aspectj/weaver/Member.java index 3f7e9205c..b1186624b 100644 --- a/weaver/src/org/aspectj/weaver/Member.java +++ b/weaver/src/org/aspectj/weaver/Member.java @@ -24,7 +24,7 @@ import java.util.List; import org.aspectj.util.TypeSafeEnum; -public class Member implements Comparable { +public class Member implements Comparable, AnnotatedElement { private final Kind kind; private final TypeX declaringType; @@ -464,6 +464,13 @@ public class Member implements Comparable { else return name; } + /* (non-Javadoc) + * @see org.aspectj.weaver.AnnotatedElement#hasAnnotation(org.aspectj.weaver.TypeX) + */ + public boolean hasAnnotation(TypeX ofType) { + // TODO complete this method + return false; + } // ---- fields 'n' stuff public static final Member[] NONE = new Member[0]; diff --git a/weaver/src/org/aspectj/weaver/Shadow.java b/weaver/src/org/aspectj/weaver/Shadow.java index de2348a4d..85cd0ad87 100644 --- a/weaver/src/org/aspectj/weaver/Shadow.java +++ b/weaver/src/org/aspectj/weaver/Shadow.java @@ -148,6 +148,14 @@ public abstract class Shadow { public abstract Var getThisJoinPointStaticPartVar(); public abstract Var getThisEnclosingJoinPointStaticPartVar(); + // annotation variables + public abstract Var getKindedAnnotationVar(TypeX forAnnotationType); + public abstract Var getWithinAnnotationVar(TypeX forAnnotationType); + public abstract Var getWithinCodeAnnotationVar(TypeX forAnnotationType); + public abstract Var getThisAnnotationVar(TypeX forAnnotationType); + public abstract Var getTargetAnnotationVar(TypeX forAnnotationType); + public abstract Var getArgAnnotationVar(int i, TypeX forAnnotationType); + public abstract Member getEnclosingCodeSignature(); diff --git a/weaver/src/org/aspectj/weaver/TypeX.java b/weaver/src/org/aspectj/weaver/TypeX.java index 05bf35641..3d424618d 100644 --- a/weaver/src/org/aspectj/weaver/TypeX.java +++ b/weaver/src/org/aspectj/weaver/TypeX.java @@ -18,7 +18,7 @@ import java.io.DataOutputStream; import java.io.IOException; import java.util.Iterator; -public class TypeX { +public class TypeX implements AnnotatedElement { /** * This is the bytecode string representation of this Type */ @@ -552,6 +552,11 @@ public class TypeX { return world.resolve(this); } + public boolean hasAnnotation(TypeX ofType) { + //TODO implement TypeX.hasAnnotation + return false; + } + // ---- fields public static final TypeX[] NONE = new TypeX[0]; diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java index c08fc485c..fe32b0aa6 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java @@ -15,8 +15,10 @@ package org.aspectj.weaver.bcel; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import org.aspectj.apache.bcel.Constants; import org.aspectj.apache.bcel.classfile.Field; @@ -868,6 +870,12 @@ public class BcelShadow extends Shadow { private BcelVar thisVar = null; private BcelVar targetVar = null; private BcelVar[] argVars = null; + private Map/**/ kindedAnnotationVars = null; + private Map/**/ thisAnnotationVars = null; + private Map/**/ targetAnnotationVars = null; + private Map/**/[] argAnnotationVars = null; + private Map/**/ withinAnnotationVars = null; + private Map/**/ withincodeAnnotationVars = null; public Var getThisVar() { if (!hasThis()) { @@ -876,18 +884,48 @@ public class BcelShadow extends Shadow { initializeThisVar(); return thisVar; } + public Var getThisAnnotationVar(TypeX forAnnotationType) { + if (!hasThis()) { + throw new IllegalStateException("no this"); + } + initializeThisAnnotationVars(); + return (Var) thisAnnotationVars.get(forAnnotationType); + } public Var getTargetVar() { if (!hasTarget()) { throw new IllegalStateException("no target"); } initializeTargetVar(); return targetVar; + } + public Var getTargetAnnotationVar(TypeX forAnnotationType) { + if (!hasTarget()) { + throw new IllegalStateException("no target"); } - public Var getArgVar(int i) { + initializeTargetAnnotationVars(); + return (Var) targetAnnotationVars.get(forAnnotationType); + } + public Var getArgVar(int i) { initializeArgVars(); return argVars[i]; - } - + } + public Var getArgAnnotationVar(int i,TypeX forAnnotationType) { + initializeArgAnnotationVars(); + return (Var) argAnnotationVars[i].get(forAnnotationType); + } + public Var getKindedAnnotationVar(TypeX forAnnotationType) { + initializeKindedAnnotationVars(); + return (Var) kindedAnnotationVars.get(forAnnotationType); + } + public Var getWithinAnnotationVar(TypeX forAnnotationType) { + initializeWithinAnnotationVars(); + return (Var) withinAnnotationVars.get(forAnnotationType); + } + public Var getWithinCodeAnnotationVar(TypeX forAnnotationType) { + initializeWithinCodeAnnotationVars(); + return (Var) withincodeAnnotationVars.get(forAnnotationType); + } + // reflective thisJoinPoint support private BcelVar thisJoinPointVar = null; private boolean isThisJoinPointLazy; @@ -1227,6 +1265,50 @@ public class BcelShadow extends Shadow { // System.out.println("initialized: " + this + " thisVar = " + thisVar); } + public void initializeThisAnnotationVars() { + if (thisAnnotationVars != null) return; + thisAnnotationVars = new HashMap(); + // populate.. + } + public void initializeTargetAnnotationVars() { + if (targetAnnotationVars != null) return; + if (getKind().isTargetSameAsThis()) { + if (hasThis()) initializeThisAnnotationVars(); + targetAnnotationVars = thisAnnotationVars; + } else { + targetAnnotationVars = new HashMap(); + // populate. + } + } + public void initializeArgAnnotationVars() { + if (argAnnotationVars != null) return; + int numArgs = getArgCount(); + argAnnotationVars = new Map[numArgs]; + for (int i = 0; i < argAnnotationVars.length; i++) { + argAnnotationVars[i] = new HashMap(); + // populate + } + } + public void initializeKindedAnnotationVars() { + if (kindedAnnotationVars != null) return; + kindedAnnotationVars = new HashMap(); + // by determining what "kind" of shadow we are, we can find out the + // annotations on the appropriate element (method, field, constructor, type). + // Then create one BcelVar entry in the map for each annotation, keyed by + // annotation type (TypeX). + + } + public void initializeWithinAnnotationVars() { + if (withinAnnotationVars != null) return; + withinAnnotationVars = new HashMap(); + // populate + } + public void initializeWithinCodeAnnotationVars() { + if (withincodeAnnotationVars != null) return; + withincodeAnnotationVars = new HashMap(); + // populate + } + // ---- weave methods diff --git a/weaver/src/org/aspectj/weaver/patterns/AndAnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/AndAnnotationTypePattern.java new file mode 100644 index 000000000..3d4eb11e9 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/patterns/AndAnnotationTypePattern.java @@ -0,0 +1,83 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver.patterns; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.aspectj.util.FuzzyBoolean; +import org.aspectj.weaver.AnnotatedElement; +import org.aspectj.weaver.ISourceContext; + +/** + * @author colyer + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class AndAnnotationTypePattern extends AnnotationTypePattern { + + private AnnotationTypePattern left; + private AnnotationTypePattern right; + + public AndAnnotationTypePattern(AnnotationTypePattern left, AnnotationTypePattern right) { + this.left = left; + this.right = right; + setLocation(left.getSourceContext(), left.getStart(), right.getEnd()); + } + + public FuzzyBoolean matches(AnnotatedElement annotated) { + return left.matches(annotated).and(right.matches(annotated)); + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.AnnotationTypePattern#resolveBindings(org.aspectj.weaver.patterns.IScope, org.aspectj.weaver.patterns.Bindings, boolean) + */ + public AnnotationTypePattern resolveBindings(IScope scope, + Bindings bindings, boolean allowBinding) { + left = left.resolveBindings(scope,bindings,allowBinding); + right =right.resolveBindings(scope,bindings,allowBinding); + return this; + } + + public static AnnotationTypePattern read(DataInputStream s, ISourceContext context) throws IOException { + AnnotationTypePattern p = new AndAnnotationTypePattern( + AnnotationTypePattern.read(s,context), + AnnotationTypePattern.read(s,context)); + p.readLocation(context,s); + return p; + } + + public void write(DataOutputStream s) throws IOException { + s.writeByte(AnnotationTypePattern.AND); + left.write(s); + right.write(s); + writeLocation(s); + } + + public boolean equals(Object obj) { + if (!(obj instanceof AndAnnotationTypePattern)) return false; + AndAnnotationTypePattern other = (AndAnnotationTypePattern) obj; + return (left.equals(other.left) && right.equals(other.right)); + } + + public int hashCode() { + int result = 17; + result = result*37 + left.hashCode(); + result = result*37 + right.hashCode(); + return result; + } + + public String toString() { + return "(" + left.toString() + " && " + right.toString() + ")"; + } + +} diff --git a/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java index c055692fe..bb94f602d 100644 --- a/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java @@ -33,7 +33,7 @@ public class AndTypePattern extends TypePattern { private TypePattern left, right; public AndTypePattern(TypePattern left, TypePattern right) { - super(false); //??? we override all methods that care about includeSubtypes + super(false,false); //??? we override all methods that care about includeSubtypes this.left = left; this.right = right; setLocation(left.getSourceContext(), left.getStart(), right.getEnd()); diff --git a/weaver/src/org/aspectj/weaver/patterns/AnnotationPatternList.java b/weaver/src/org/aspectj/weaver/patterns/AnnotationPatternList.java new file mode 100644 index 000000000..140e83f42 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/patterns/AnnotationPatternList.java @@ -0,0 +1,133 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver.patterns; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.List; + +import org.aspectj.weaver.ISourceContext; +import org.aspectj.weaver.IntMap; + +/** + * @author colyer + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class AnnotationPatternList extends PatternNode { + + private AnnotationTypePattern[] typePatterns; + int ellipsisCount = 0; + + public static final AnnotationPatternList EMPTY = + new AnnotationPatternList(new AnnotationTypePattern[] {}); + + public static final AnnotationPatternList ANY = + new AnnotationPatternList(new AnnotationTypePattern[] {AnnotationTypePattern.ELLIPSIS}); + + public AnnotationPatternList() { + typePatterns = new AnnotationTypePattern[0]; + ellipsisCount = 0; + } + + public AnnotationPatternList(AnnotationTypePattern[] arguments) { + this.typePatterns = arguments; + for (int i=0; i 0) buf.append(", "); + if (type == AnnotationTypePattern.ELLIPSIS) { + buf.append(".."); + } else { + buf.append(type.toString()); + } + } + buf.append(")"); + return buf.toString(); + } + + public boolean equals(Object other) { + if (!(other instanceof AnnotationPatternList)) return false; + AnnotationPatternList o = (AnnotationPatternList)other; + int len = o.typePatterns.length; + if (len != this.typePatterns.length) return false; + for (int i=0; i VERSION) { + throw new BCException("BindingAnnotationTypePattern was written by a more recent version of AspectJ"); + } + AnnotationTypePattern ret = new BindingAnnotationTypePattern(TypeX.read(s),s.readShort()); + ret.readLocation(context,s); + return ret; + } +} diff --git a/weaver/src/org/aspectj/weaver/patterns/BindingPattern.java b/weaver/src/org/aspectj/weaver/patterns/BindingPattern.java new file mode 100644 index 000000000..1b5bab357 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/patterns/BindingPattern.java @@ -0,0 +1,19 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver.patterns; + +import org.aspectj.weaver.IHasPosition; + +/** + * Marker interface for BindingTypePattern and BindingAnnotationTypePattern + */ +public interface BindingPattern extends IHasPosition { + int getFormalIndex(); +} diff --git a/weaver/src/org/aspectj/weaver/patterns/BindingTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/BindingTypePattern.java index 87a7b524d..937563c79 100644 --- a/weaver/src/org/aspectj/weaver/patterns/BindingTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/BindingTypePattern.java @@ -21,16 +21,16 @@ import org.aspectj.weaver.ISourceContext; import org.aspectj.weaver.IntMap; import org.aspectj.weaver.TypeX; -public class BindingTypePattern extends ExactTypePattern { +public class BindingTypePattern extends ExactTypePattern implements BindingPattern { private int formalIndex; - public BindingTypePattern(TypeX type, int index) { - super(type, false); + public BindingTypePattern(TypeX type, int index,boolean isVarArgs) { + super(type, false,isVarArgs); this.formalIndex = index; } - public BindingTypePattern(FormalBinding binding) { - this(binding.getType(), binding.getIndex()); + public BindingTypePattern(FormalBinding binding, boolean isVarArgs) { + this(binding.getType(), binding.getIndex(),isVarArgs); } public int getFormalIndex() { @@ -53,21 +53,22 @@ public class BindingTypePattern extends ExactTypePattern { out.writeByte(TypePattern.BINDING); type.write(out); out.writeShort((short)formalIndex); + out.writeBoolean(isVarArgs); writeLocation(out); } public static TypePattern read(DataInputStream s, ISourceContext context) throws IOException { - TypePattern ret = new BindingTypePattern(TypeX.read(s), s.readShort()); + TypePattern ret = new BindingTypePattern(TypeX.read(s), s.readShort(), s.readBoolean()); ret.readLocation(context, s); return ret; } public TypePattern remapAdviceFormals(IntMap bindings) { if (!bindings.hasKey(formalIndex)) { - return new ExactTypePattern(type, false); + return new ExactTypePattern(type, false, isVarArgs); } else { int newFormalIndex = bindings.get(formalIndex); - return new BindingTypePattern(type, newFormalIndex); + return new BindingTypePattern(type, newFormalIndex, isVarArgs); } } diff --git a/weaver/src/org/aspectj/weaver/patterns/Bindings.java b/weaver/src/org/aspectj/weaver/patterns/Bindings.java index 7fd02c179..cf9e660a5 100644 --- a/weaver/src/org/aspectj/weaver/patterns/Bindings.java +++ b/weaver/src/org/aspectj/weaver/patterns/Bindings.java @@ -19,19 +19,19 @@ import org.aspectj.weaver.BCException; public class Bindings { public static final Bindings NONE = new Bindings(0); - private BindingTypePattern[] bindings; + private BindingPattern[] bindings; - public Bindings(BindingTypePattern[] bindings) { + public Bindings(BindingPattern[] bindings) { this.bindings = bindings; } public Bindings(int count) { - this(new BindingTypePattern[count]); + this(new BindingPattern[count]); } - public void register(BindingTypePattern binding, IScope scope) { + public void register(BindingPattern binding, IScope scope) { int index = binding.getFormalIndex(); - BindingTypePattern existingBinding = bindings[index]; + BindingPattern existingBinding = bindings[index]; if (existingBinding != null) { scope.message(IMessage.ERROR, existingBinding, binding, "multiple bindings" + index + ", " + binding); @@ -53,8 +53,8 @@ public class Bindings { * signals an error if one has a binding and other doesn't */ public void checkEquals(Bindings other, IScope scope) { - BindingTypePattern[] b1 = this.bindings; - BindingTypePattern[] b2 = other.bindings; + BindingPattern[] b1 = this.bindings; + BindingPattern[] b2 = other.bindings; int len = b1.length; if (len != b2.length) { throw new BCException("INSANE"); @@ -102,7 +102,7 @@ public class Bindings { // int len = bindings.length; // boolean[] a = new boolean[len]; // System.arraycopy(bindings, 0, a, 0, len); - return new Bindings((BindingTypePattern[])bindings.clone()); + return new Bindings((BindingPattern[])bindings.clone()); } public void checkAllBound(IScope scope) { diff --git a/weaver/src/org/aspectj/weaver/patterns/ExactAnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/ExactAnnotationTypePattern.java new file mode 100644 index 000000000..3db7d0030 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/patterns/ExactAnnotationTypePattern.java @@ -0,0 +1,122 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver.patterns; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.aspectj.bridge.IMessage; +import org.aspectj.util.FuzzyBoolean; +import org.aspectj.weaver.AnnotatedElement; +import org.aspectj.weaver.BCException; +import org.aspectj.weaver.ISourceContext; +import org.aspectj.weaver.TypeX; + +/** + * Matches an annotation of a given type + */ +public class ExactAnnotationTypePattern extends AnnotationTypePattern { + + protected TypeX annotationType; + protected String formalName; + + /** + * + */ + public ExactAnnotationTypePattern(TypeX annotationType) { + this.annotationType = annotationType; + } + + public ExactAnnotationTypePattern(String formalName) { + this.formalName = formalName; + // will be turned into BindingAnnotationTypePattern during resolution + } + + public FuzzyBoolean matches(AnnotatedElement annotated) { + return (annotated.hasAnnotation(annotationType) ? + FuzzyBoolean.YES : FuzzyBoolean.NO); + } + + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.AnnotationTypePattern#resolveBindings(org.aspectj.weaver.patterns.IScope, org.aspectj.weaver.patterns.Bindings, boolean) + */ + public AnnotationTypePattern resolveBindings(IScope scope, + Bindings bindings, boolean allowBinding) { + if (formalName != null) { + FormalBinding formalBinding = scope.lookupFormal(formalName); + if (formalBinding != null) { + if (bindings == null) { + scope.message(IMessage.ERROR, this, "negation doesn't allow binding"); + return this; + } + if (!allowBinding) { + scope.message(IMessage.ERROR, this, + "name binding only allowed in @pcds, args, this, and target"); + return this; + } + + BindingAnnotationTypePattern binding = new BindingAnnotationTypePattern(formalBinding); + binding.copyLocationFrom(this); + bindings.register(binding, scope); + + return binding; + } else { + scope.message(IMessage.ERROR,this,"unbound formal " + formalName); + return this; + } + } else { + return this; + } + } + + private static byte VERSION = 1; // rev if serialisation form changes + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.PatternNode#write(java.io.DataOutputStream) + */ + public void write(DataOutputStream s) throws IOException { + s.writeByte(AnnotationTypePattern.EXACT); + s.writeByte(VERSION); + annotationType.write(s); + writeLocation(s); + } + + public static AnnotationTypePattern read(DataInputStream s,ISourceContext context) throws IOException { + AnnotationTypePattern ret; + byte version = s.readByte(); + if (version > VERSION) { + throw new BCException("ExactAnnotationTypePattern was written by a newer version of AspectJ"); + } + ret = new ExactAnnotationTypePattern(TypeX.read(s)); + ret.readLocation(context,s); + return ret; + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (!(obj instanceof ExactAnnotationTypePattern)) return false; + ExactAnnotationTypePattern other = (ExactAnnotationTypePattern) obj; + return (other.annotationType.equals(annotationType)); + } + + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return annotationType.hashCode(); + } + + public String toString() { + return "@" + annotationType.toString(); + } +} diff --git a/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java index aa77747bf..36917a297 100644 --- a/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java @@ -63,8 +63,8 @@ public class ExactTypePattern extends TypePattern { } - public ExactTypePattern(TypeX type, boolean includeSubtypes) { - super(includeSubtypes); + public ExactTypePattern(TypeX type, boolean includeSubtypes,boolean isVarArgs) { + super(includeSubtypes,isVarArgs); this.type = type; } @@ -151,22 +151,32 @@ public class ExactTypePattern extends TypePattern { public boolean equals(Object other) { if (!(other instanceof ExactTypePattern)) return false; ExactTypePattern o = (ExactTypePattern)other; - return o.type.equals(this.type); + return (o.type.equals(this.type) && o.annotationPattern.equals(this.annotationPattern)); } public int hashCode() { - return type.hashCode(); + int result = 17; + result = 37*result + type.hashCode(); + result = 37*result + annotationPattern.hashCode(); + return result; } - + + private static final byte EXACT_VERSION = 1; // rev if changed public void write(DataOutputStream out) throws IOException { out.writeByte(TypePattern.EXACT); + out.writeByte(EXACT_VERSION); type.write(out); out.writeBoolean(includeSubtypes); + out.writeBoolean(isVarArgs); + annotationPattern.write(out); writeLocation(out); } public static TypePattern read(DataInputStream s, ISourceContext context) throws IOException { - TypePattern ret = new ExactTypePattern(TypeX.read(s), s.readBoolean()); + byte version = s.readByte(); + if (version > EXACT_VERSION) throw new BCException("ExactTypePattern was written by a more recent version of AspectJ"); + TypePattern ret = new ExactTypePattern(TypeX.read(s), s.readBoolean(), s.readBoolean()); + ret.setAnnotationTypePattern(AnnotationTypePattern.read(s,context)); ret.readLocation(context, s); return ret; } diff --git a/weaver/src/org/aspectj/weaver/patterns/KindedAnnotationPointcut.java b/weaver/src/org/aspectj/weaver/patterns/KindedAnnotationPointcut.java new file mode 100644 index 000000000..08960c228 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/patterns/KindedAnnotationPointcut.java @@ -0,0 +1,186 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ + +package org.aspectj.weaver.patterns; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.aspectj.bridge.ISourceLocation; +import org.aspectj.bridge.Message; +import org.aspectj.util.FuzzyBoolean; +import org.aspectj.weaver.ISourceContext; +import org.aspectj.weaver.IntMap; +import org.aspectj.weaver.ResolvedTypeX; +import org.aspectj.weaver.Shadow; +import org.aspectj.weaver.ShadowMunger; +import org.aspectj.weaver.TypeX; +import org.aspectj.weaver.ast.Literal; +import org.aspectj.weaver.ast.Test; +import org.aspectj.weaver.ast.Var; + +/** + * A KindedAnnotationPointcut matches iff the kind of a join point + * matches the kind of the pointcut (with no distinction between + * method and constructor for call and execution), AND if the + * member (field, method or constructor) has an annotation of the + * given type. + */ +public class KindedAnnotationPointcut extends NameBindingPointcut { + + private Shadow.Kind kind; + private AnnotationTypePattern type; + private ShadowMunger munger = null; // only set after concretization + + public KindedAnnotationPointcut(Shadow.Kind kind, AnnotationTypePattern type) { + super(); + this.kind = kind; + this.type = type; + this.pointcutKind = Pointcut.ATKINDED; + } + + public KindedAnnotationPointcut(Shadow.Kind kind, AnnotationTypePattern type, ShadowMunger munger) { + this(kind,type); + this.munger = munger; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#fastMatch(org.aspectj.weaver.patterns.FastMatchInfo) + */ + public FuzzyBoolean fastMatch(FastMatchInfo info) { + if (info.getKind() != null) { + if (info.getKind() != kind) { + // no distinction between method and constructors + if ((info.getKind() == Shadow.ConstructorExecution) && + kind == Shadow.MethodExecution) { + return FuzzyBoolean.MAYBE; + } + if ((info.getKind() == Shadow.ConstructorCall) && + kind == Shadow.MethodCall) { + return FuzzyBoolean.MAYBE; + } + } else { + return FuzzyBoolean.NO; + } + } + return FuzzyBoolean.MAYBE; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#match(org.aspectj.weaver.Shadow) + */ + public FuzzyBoolean match(Shadow shadow) { + if (!couldMatch(shadow)) return FuzzyBoolean.NO; + return type.matches(shadow.getSignature()); + } + + private boolean couldMatch(Shadow shadow) { + Shadow.Kind kindToMatch = shadow.getKind(); + if (kindToMatch == Shadow.ConstructorExecution) kindToMatch = Shadow.MethodExecution; + if (kindToMatch == Shadow.ConstructorCall) kindToMatch = Shadow.MethodCall; + return (kindToMatch == kind); + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#resolveBindings(org.aspectj.weaver.patterns.IScope, org.aspectj.weaver.patterns.Bindings) + */ + protected void resolveBindings(IScope scope, Bindings bindings) { + type = type.resolveBindings(scope,bindings,true); + // must be either a Var, or an annotation type pattern + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#resolveBindingsFromRTTI() + */ + protected void resolveBindingsFromRTTI() { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#concretize1(org.aspectj.weaver.ResolvedTypeX, org.aspectj.weaver.IntMap) + */ + protected Pointcut concretize1(ResolvedTypeX inAspect, IntMap bindings) { + AnnotationTypePattern newType = type.remapAdviceFormals(bindings); + Pointcut ret = new KindedAnnotationPointcut(kind, newType, bindings.getEnclosingAdvice()); + ret.copyLocationFrom(this); + return ret; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#findResidue(org.aspectj.weaver.Shadow, org.aspectj.weaver.patterns.ExposedState) + */ + public Test findResidue(Shadow shadow, ExposedState state) { + if (!couldMatch(shadow)) return Literal.FALSE; + + if (type instanceof BindingAnnotationTypePattern) { + BindingAnnotationTypePattern btp = (BindingAnnotationTypePattern)type; + TypeX annotationType = btp.annotationType; + Var var = shadow.getKindedAnnotationVar(annotationType); + if (var == null) return Literal.FALSE; + // Check if we have already bound something to this formal + if (state.get(btp.getFormalIndex())!=null) { + ISourceLocation pcdSloc = getSourceLocation(); + ISourceLocation shadowSloc = shadow.getSourceLocation(); + Message errorMessage = new Message( + "Cannot use @pointcut to match at this location and bind a formal to type '"+var.getType()+ + "' - the formal is already bound to type '"+state.get(btp.getFormalIndex()).getType()+"'"+ + ". The secondary source location points to the problematic binding.", + shadowSloc,true,new ISourceLocation[]{pcdSloc}); + shadow.getIWorld().getMessageHandler().handleMessage(errorMessage); + state.setErroneousVar(btp.getFormalIndex()); + } + state.set(btp.getFormalIndex(),var); + } + return Literal.TRUE; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.PatternNode#write(java.io.DataOutputStream) + */ + public void write(DataOutputStream s) throws IOException { + s.writeByte(Pointcut.ATKINDED); + kind.write(s); + type.write(s); + writeLocation(s); + } + + public static Pointcut read(DataInputStream s, ISourceContext context) throws IOException { + Shadow.Kind kind = Shadow.Kind.read(s); + AnnotationTypePattern type = AnnotationTypePattern.read(s, context); + KindedAnnotationPointcut ret = new KindedAnnotationPointcut(kind, type); + ret.readLocation(context, s); + return ret; + } + + public boolean equals(Object other) { + if (!(other instanceof KindedAnnotationPointcut)) return false; + KindedAnnotationPointcut o = (KindedAnnotationPointcut)other; + return o.kind == this.kind && o.type.equals(this.type); + } + + public int hashCode() { + int result = 17; + result = 37*result + kind.hashCode(); + result = 37*result + type.hashCode(); + return result; + } + + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append(kind.getSimpleName()); + buf.append("("); + buf.append(type.toString()); + buf.append(")"); + return buf.toString(); + } + +} diff --git a/weaver/src/org/aspectj/weaver/patterns/NotAnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/NotAnnotationTypePattern.java new file mode 100644 index 000000000..e55df2508 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/patterns/NotAnnotationTypePattern.java @@ -0,0 +1,74 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver.patterns; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.aspectj.util.FuzzyBoolean; +import org.aspectj.weaver.AnnotatedElement; +import org.aspectj.weaver.ISourceContext; + +public class NotAnnotationTypePattern extends AnnotationTypePattern { + + private AnnotationTypePattern negatedPattern; + + public NotAnnotationTypePattern(AnnotationTypePattern pattern) { + this.negatedPattern = pattern; + setLocation(pattern.getSourceContext(), pattern.getStart(), pattern.getEnd()); + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.AnnotationTypePattern#matches(org.aspectj.weaver.AnnotatedElement) + */ + public FuzzyBoolean matches(AnnotatedElement annotated) { + return negatedPattern.matches(annotated).not(); + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.AnnotationTypePattern#resolveBindings(org.aspectj.weaver.patterns.IScope, org.aspectj.weaver.patterns.Bindings, boolean) + */ + public AnnotationTypePattern resolveBindings(IScope scope, + Bindings bindings, boolean allowBinding) { + negatedPattern = negatedPattern.resolveBindings(scope,bindings,allowBinding); + return this; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.PatternNode#write(java.io.DataOutputStream) + */ + public void write(DataOutputStream s) throws IOException { + s.writeByte(AnnotationTypePattern.NOT); + negatedPattern.write(s); + writeLocation(s); + } + + public static AnnotationTypePattern read(DataInputStream s, ISourceContext context) throws IOException { + AnnotationTypePattern ret = new NotAnnotationTypePattern(AnnotationTypePattern.read(s,context)); + ret.readLocation(context,s); + return ret; + } + + public boolean equals(Object obj) { + if (!(obj instanceof NotAnnotationTypePattern)) return false; + NotAnnotationTypePattern other = (NotAnnotationTypePattern) obj; + return other.negatedPattern.equals(negatedPattern); + } + + public int hashCode() { + int result = 17 + 37*negatedPattern.hashCode(); + return result; + } + + public String toString() { + return "!" + negatedPattern.toString(); + } +} diff --git a/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java index 68a719c73..17a402e91 100644 --- a/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java @@ -34,7 +34,7 @@ public class NotTypePattern extends TypePattern { private TypePattern pattern; public NotTypePattern(TypePattern pattern) { - super(false); //??? we override all methods that care about includeSubtypes + super(false,false); //??? we override all methods that care about includeSubtypes this.pattern = pattern; setLocation(pattern.getSourceContext(), pattern.getStart(), pattern.getEnd()); } diff --git a/weaver/src/org/aspectj/weaver/patterns/OrAnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/OrAnnotationTypePattern.java new file mode 100644 index 000000000..bd6414d39 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/patterns/OrAnnotationTypePattern.java @@ -0,0 +1,77 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver.patterns; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.aspectj.util.FuzzyBoolean; +import org.aspectj.weaver.AnnotatedElement; +import org.aspectj.weaver.ISourceContext; + +public class OrAnnotationTypePattern extends AnnotationTypePattern { + + private AnnotationTypePattern left; + private AnnotationTypePattern right; + + public OrAnnotationTypePattern(AnnotationTypePattern left, AnnotationTypePattern right) { + this.left = left; + this.right = right; + setLocation(left.getSourceContext(), left.getStart(), right.getEnd()); + } + + public FuzzyBoolean matches(AnnotatedElement annotated) { + return left.matches(annotated).or(right.matches(annotated)); + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.AnnotationTypePattern#resolveBindings(org.aspectj.weaver.patterns.IScope, org.aspectj.weaver.patterns.Bindings, boolean) + */ + public AnnotationTypePattern resolveBindings(IScope scope, + Bindings bindings, boolean allowBinding) { + left = left.resolveBindings(scope,bindings,allowBinding); + right =right.resolveBindings(scope,bindings,allowBinding); + return this; + } + + public static AnnotationTypePattern read(DataInputStream s, ISourceContext context) throws IOException { + AnnotationTypePattern p = new OrAnnotationTypePattern( + AnnotationTypePattern.read(s,context), + AnnotationTypePattern.read(s,context)); + p.readLocation(context,s); + return p; + } + + public void write(DataOutputStream s) throws IOException { + s.writeByte(AnnotationTypePattern.OR); + left.write(s); + right.write(s); + writeLocation(s); + } + + public boolean equals(Object obj) { + if (!(obj instanceof OrAnnotationTypePattern)) return false; + OrAnnotationTypePattern other = (OrAnnotationTypePattern) obj; + return (left.equals(other.left) && right.equals(other.right)); + } + + public int hashCode() { + int result = 17; + result = result*37 + left.hashCode(); + result = result*37 + right.hashCode(); + return result; + } + + public String toString() { + return "(" + left.toString() + " || " + right.toString() + ")"; + } + +} diff --git a/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java index da53ad6e5..6a423e03c 100644 --- a/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java @@ -33,7 +33,7 @@ public class OrTypePattern extends TypePattern { private TypePattern left, right; public OrTypePattern(TypePattern left, TypePattern right) { - super(false); //??? we override all methods that care about includeSubtypes + super(false,false); //??? we override all methods that care about includeSubtypes this.left = left; this.right = right; setLocation(left.getSourceContext(), left.getStart(), right.getEnd()); diff --git a/weaver/src/org/aspectj/weaver/patterns/PatternParser.java b/weaver/src/org/aspectj/weaver/patterns/PatternParser.java index 062f17b21..8a4324bf9 100644 --- a/weaver/src/org/aspectj/weaver/patterns/PatternParser.java +++ b/weaver/src/org/aspectj/weaver/patterns/PatternParser.java @@ -19,9 +19,13 @@ import java.util.List; import org.aspectj.weaver.ISourceContext; import org.aspectj.weaver.Member; import org.aspectj.weaver.Shadow; +import org.aspectj.weaver.TypeX; //XXX doesn't handle errors for extra tokens very well (sometimes ignores) public class PatternParser { + + private static final String AT = "@"; + private ITokenSource tokenSource; private ISourceContext sourceContext; @@ -185,6 +189,13 @@ public class PatternParser { eat(")"); return p; } + if (maybeEat(AT)) { + int startPos = tokenSource.peek().getStart(); + Pointcut p = parseAnnotationPointcut(); + int endPos = tokenSource.peek(-1).getEnd(); + p.setLocation(sourceContext, startPos, endPos); + return p; + } int startPos = tokenSource.peek().getStart(); Pointcut p = parseSinglePointcut(); int endPos = tokenSource.peek(-1).getEnd(); @@ -227,7 +238,8 @@ public class PatternParser { new SignaturePattern(Member.ADVICE, ModifiersPattern.ANY, TypePattern.ANY, TypePattern.ANY, NamePattern.ANY, TypePatternList.ANY, - ThrowsPattern.ANY)); + ThrowsPattern.ANY, + AnnotationTypePattern.ANY)); } else if (kind.equals("handler")) { parseIdentifier(); eat("("); TypePattern typePat = parseTypePattern(); @@ -245,7 +257,7 @@ public class PatternParser { return new KindedPointcut(Shadow.StaticInitialization, new SignaturePattern(Member.STATIC_INITIALIZATION, ModifiersPattern.ANY, TypePattern.ANY, typePat, NamePattern.ANY, TypePatternList.EMPTY, - ThrowsPattern.ANY)); + ThrowsPattern.ANY,AnnotationTypePattern.ANY)); } else if (kind.equals("preinitialization")) { parseIdentifier(); eat("("); SignaturePattern sig = parseConstructorSignaturePattern(); @@ -256,6 +268,61 @@ public class PatternParser { } } + public Pointcut parseAnnotationPointcut() { + int start = tokenSource.getIndex(); + IToken t = tokenSource.peek(); + String kind = parseIdentifier(); + tokenSource.setIndex(start); + if (kind.equals("execution") || kind.equals("call") || + kind.equals("get") || kind.equals("set") || + kind.equals("adviceexecution") || + kind.equals("initialization") || + kind.equals("preinitialization") || + kind.equals("staticinitialization")) { + return parseKindedAnnotationPointcut(); + } else if (kind.equals("args")) { + return parseArgsAnnotationPointcut(); + } else if (kind.equals("this") || kind.equals("target")) { + return parseThisOrTargetAnnotationPointcut(); + } else if (kind.equals("within")) { + return parseWithinAnnotationPointcut(); + } else if (kind.equals("withincode")) { + return parseWithinCodeAnnotationPointcut(); + } throw new ParserException("@pointcut name expected, but found " + kind, t); + } + + private Pointcut parseKindedAnnotationPointcut() { + String kind = parseIdentifier(); + Shadow.Kind shadowKind = null; + if (kind.equals("execution")) { + shadowKind = Shadow.MethodExecution; // also matches cons execution + } else if (kind.equals("call")) { + shadowKind = Shadow.MethodCall; // also matches cons call + } else if (kind.equals("get")) { + shadowKind = Shadow.FieldGet; + } else if (kind.equals("set")) { + shadowKind = Shadow.FieldSet; + } else if (kind.equals("adviceexecution")) { + shadowKind = Shadow.AdviceExecution; + } else if (kind.equals("initialization")) { + shadowKind = Shadow.Initialization; + } else if (kind.equals("preinitialization")) { + shadowKind = Shadow.PreInitialization; + } else if (kind.equals("staticinitialization")) { + shadowKind = Shadow.StaticInitialization; + } else { + throw new ParserException(("bad kind: " + kind), tokenSource.peek()); + } + eat("("); + if (maybeEat(")")) { + throw new ParserException("expecting @AnnotationName or parameter, but found ')'", tokenSource.peek()); + } + AnnotationTypePattern type = parseAnnotationNameOrVarTypePattern(); + eat(")"); + return new KindedAnnotationPointcut(shadowKind,type); + } + + private SignaturePattern parseConstructorSignaturePattern() { SignaturePattern ret = parseMethodOrConstructorSignaturePattern(); if (ret.getKind() == Member.CONSTRUCTOR) return ret; @@ -306,6 +373,38 @@ public class PatternParser { return new ThisOrTargetPointcut(kind.equals("this"), type); } + private Pointcut parseThisOrTargetAnnotationPointcut() { + String kind = parseIdentifier(); + eat("("); + if (maybeEat(")")) { + throw new ParserException("expecting @AnnotationName or parameter, but found ')'", tokenSource.peek()); + } + AnnotationTypePattern type = parseAnnotationNameOrVarTypePattern(); + eat(")"); + return new ThisOrTargetAnnotationPointcut(kind.equals("this"),type); + } + + private Pointcut parseWithinAnnotationPointcut() { + String kind = parseIdentifier(); + eat("("); + if (maybeEat(")")) { + throw new ParserException("expecting @AnnotationName or parameter, but found ')'", tokenSource.peek()); + } + AnnotationTypePattern type = parseAnnotationNameOrVarTypePattern(); + eat(")"); + return new WithinAnnotationPointcut(type); + } + + private Pointcut parseWithinCodeAnnotationPointcut() { + String kind = parseIdentifier(); + eat("("); + if (maybeEat(")")) { + throw new ParserException("expecting @AnnotationName or parameter, but found ')'", tokenSource.peek()); + } + AnnotationTypePattern type = parseAnnotationNameOrVarTypePattern(); + eat(")"); + return new WithinCodeAnnotationPointcut(type); + } /** * Method parseArgsPointcut. @@ -316,7 +415,12 @@ public class PatternParser { TypePatternList arguments = parseArgumentsPattern(); return new ArgsPointcut(arguments); } - + + private Pointcut parseArgsAnnotationPointcut() { + parseIdentifier(); + AnnotationPatternList arguments = parseArgumentsAnnotationPattern(); + return new ArgsAnnotationPointcut(arguments); + } private Pointcut parseReferencePointcut() { TypePattern onType = parseTypePattern(); @@ -378,23 +482,109 @@ public class PatternParser { } public TypePattern parseTypePattern() { - TypePattern p = parseAtomicTypePattern(); + AnnotationTypePattern ap = null; + TypePattern tp = null; + PatternNode p = parseAtomicPattern(); + if (isAnnotationPattern(p)) { + ap = completeAnnotationPattern((AnnotationTypePattern)p); + IToken tok = tokenSource.peek(); + PatternNode typepat = parseTypePattern(); + if (isAnnotationPattern(p)) { + throw new ParserException("Duplicate annotation pattern",tok); + } else { + tp = (TypePattern) typepat; + tp.setAnnotationTypePattern(ap); + } + } else { + tp = (TypePattern)p; + } if (maybeEat("&&")) { - p = new AndTypePattern(p, parseNotOrTypePattern()); + tp = new AndTypePattern(tp, parseNotOrTypePattern()); } if (maybeEat("||")) { - p = new OrTypePattern(p, parseTypePattern()); + tp = new OrTypePattern(tp, parseTypePattern()); } + return tp; + } + + private AnnotationTypePattern completeAnnotationPattern(AnnotationTypePattern p) { + if (maybeEat("&&")) { + return new AndAnnotationTypePattern(p,parseNotOrAnnotationPattern()); + } + if (maybeEat("||")) { + return new OrAnnotationTypePattern(p,parseAnnotationTypePattern(false)); + } + return p; + } + + private AnnotationTypePattern parseNotOrAnnotationPattern() { + AnnotationTypePattern p = parseAnnotationTypePattern(false); + if (maybeEat("&&")) { + p = new AndAnnotationTypePattern(p,parseAnnotationTypePattern(false)); + } + return p; + } + + private AnnotationTypePattern parseAnnotationTypePattern(boolean isOptional) { + IToken tok = tokenSource.peek(); + PatternNode p = parseAtomicPattern(); + if (!isAnnotationPattern(p)) { + if (isOptional) return null; + throw new ParserException("Expecting annotation pattern",tok); + } + AnnotationTypePattern ap = (AnnotationTypePattern) p; + if (maybeEat("&&")) { + ap = new AndAnnotationTypePattern(ap, parseNotOrAnnotationPattern()); + } + + if (maybeEat("||")) { + ap = new OrAnnotationTypePattern(ap, parseAnnotationTypePattern(false)); + } + return ap; + } + + private AnnotationTypePattern parseAnnotationNameOrVarTypePattern() { + AnnotationTypePattern p = null; + int startPos = tokenSource.peek().getStart(); + if (maybeEat(AT)) { + StringBuffer annotationName = new StringBuffer(); + annotationName.append(parseIdentifier()); + while (maybeEat(".")) { + annotationName.append(parseIdentifier()); + } + TypeX type = TypeX.forName(annotationName.toString()); + p = new ExactAnnotationTypePattern(type); + } else { + String formal = parseIdentifier(); + p = new ExactAnnotationTypePattern(formal); // will get replaced when bindings resolved + } + int endPos = tokenSource.peek(-1).getEnd(); + p.setLocation(sourceContext,startPos,endPos); return p; } private TypePattern parseNotOrTypePattern() { - TypePattern p = parseAtomicTypePattern(); + AnnotationTypePattern ap = null; + TypePattern tp = null; + PatternNode p = parseAtomicPattern(); + if (isAnnotationPattern(p)) { + ap = completeAnnotationPattern((AnnotationTypePattern)p); + IToken tok = tokenSource.peek(); + PatternNode typepat = parseTypePattern(); + if (isAnnotationPattern(p)) { + throw new ParserException("Duplicate annotation pattern",tok); + } else { + tp = (TypePattern) typepat; + tp.setAnnotationTypePattern(ap); + } + } else { + tp = (TypePattern) p; + } if (maybeEat("&&")) { - p = new AndTypePattern(p, parseTypePattern()); + tp = new AndTypePattern(tp, parseTypePattern()); } - return p; + return tp; } private TypePattern parseAtomicTypePattern() { @@ -416,6 +606,40 @@ public class PatternParser { return p; } + private PatternNode parseAtomicPattern() { + if (maybeEat("!")) { + PatternNode p = parseAtomicPattern(); + if (isAnnotationPattern(p)) { + return new NotAnnotationTypePattern((AnnotationTypePattern)p); + } else { + return new NotTypePattern((TypePattern)p); + } + } + if (maybeEat("(")) { + TypePattern p = parseTypePattern(); + eat(")"); + return p; + } + if (maybeEat(AT)) { + StringBuffer annotationName = new StringBuffer(); + annotationName.append(parseIdentifier()); + while (maybeEat(".")) { + annotationName.append(parseIdentifier()); + } + TypeX type = TypeX.forName(annotationName.toString()); + return new ExactAnnotationTypePattern(type); + } + int startPos = tokenSource.peek().getStart(); + TypePattern p = parseSingleTypePattern(); + int endPos = tokenSource.peek(-1).getEnd(); + p.setLocation(sourceContext, startPos, endPos); + return p; + } + + private boolean isAnnotationPattern(PatternNode p) { + return (p instanceof AnnotationTypePattern); + } + public TypePattern parseSingleTypePattern() { List names = parseDottedNamePattern(); // new ArrayList(); @@ -617,6 +841,28 @@ public class PatternParser { return new TypePatternList(patterns); } + public AnnotationPatternList parseArgumentsAnnotationPattern() { + List patterns = new ArrayList(); + eat("("); + if (maybeEat(")")) { + return new AnnotationPatternList(); + } + + do { + if (maybeEat(".")) { + eat("."); + patterns.add(AnnotationTypePattern.ELLIPSIS); + } else if (maybeEat("*")) { + patterns.add(AnnotationTypePattern.ANY); + } else { + patterns.add(parseAnnotationNameOrVarTypePattern()); + } + } while (maybeEat(",")); + eat(")"); + return new AnnotationPatternList(patterns); + } + + public ThrowsPattern parseOptionalThrowsPattern() { IToken t = tokenSource.peek(); if (t.isIdentifier() && t.getString().equals("throws")) { @@ -638,6 +884,7 @@ public class PatternParser { public SignaturePattern parseMethodOrConstructorSignaturePattern() { int startPos = tokenSource.peek().getStart(); + AnnotationTypePattern annotationPattern = maybeParseAnnotationPattern(); ModifiersPattern modifiers = parseModifiersPattern(); TypePattern returnType = parseTypePattern(); @@ -679,7 +926,7 @@ public class PatternParser { TypePatternList parameterTypes = parseArgumentsPattern(); ThrowsPattern throwsPattern = parseOptionalThrowsPattern(); - SignaturePattern ret = new SignaturePattern(kind, modifiers, returnType, declaringType, name, parameterTypes, throwsPattern); + SignaturePattern ret = new SignaturePattern(kind, modifiers, returnType, declaringType, name, parameterTypes, throwsPattern, annotationPattern); int endPos = tokenSource.peek(-1).getEnd(); ret.setLocation(sourceContext, startPos, endPos); return ret; @@ -703,6 +950,7 @@ public class PatternParser { public SignaturePattern parseFieldSignaturePattern() { int startPos = tokenSource.peek().getStart(); + AnnotationTypePattern annotationPattern = maybeParseAnnotationPattern(); ModifiersPattern modifiers = parseModifiersPattern(); TypePattern returnType = parseTypePattern(); TypePattern declaringType = parseTypePattern(); @@ -717,7 +965,7 @@ public class PatternParser { } } SignaturePattern ret = new SignaturePattern(Member.FIELD, modifiers, returnType, - declaringType, name, TypePatternList.ANY, ThrowsPattern.ANY); + declaringType, name, TypePatternList.ANY, ThrowsPattern.ANY,annotationPattern); int endPos = tokenSource.peek(-1).getEnd(); ret.setLocation(sourceContext, startPos, endPos); @@ -822,6 +1070,18 @@ public class PatternParser { } } + public AnnotationTypePattern maybeParseAnnotationPattern() { + AnnotationTypePattern ret = null; + int start = tokenSource.getIndex(); + ret = parseAnnotationTypePattern(true); + if (ret == null) { + // failed to find one... + tokenSource.setIndex(start); + ret = AnnotationTypePattern.ANY; + } + return ret; + } + public boolean peek(String token) { IToken next = tokenSource.peek(); return next.getString() == token; diff --git a/weaver/src/org/aspectj/weaver/patterns/Pointcut.java b/weaver/src/org/aspectj/weaver/patterns/Pointcut.java index 4f8ddba3f..2babd0c33 100644 --- a/weaver/src/org/aspectj/weaver/patterns/Pointcut.java +++ b/weaver/src/org/aspectj/weaver/patterns/Pointcut.java @@ -124,6 +124,7 @@ public abstract class Pointcut extends PatternNode implements PointcutExpression public static final byte HANDLER = 13; public static final byte IF_TRUE = 14; public static final byte IF_FALSE = 15; + public static final byte ATKINDED = 16; public static final byte NONE = 20; @@ -241,7 +242,7 @@ public abstract class Pointcut extends PatternNode implements PointcutExpression case HANDLER: ret = HandlerPointcut.read(s, context); break; case IF_TRUE: ret = IfPointcut.makeIfTruePointcut(RESOLVED); break; case IF_FALSE: ret = IfPointcut.makeIfFalsePointcut(RESOLVED); break; - + case ATKINDED: ret = KindedAnnotationPointcut.read(s, context); break; case NONE: ret = makeMatchesNothing(RESOLVED); break; default: throw new BCException("unknown kind: " + kind); diff --git a/weaver/src/org/aspectj/weaver/patterns/ThisOrTargetAnnotationPointcut.java b/weaver/src/org/aspectj/weaver/patterns/ThisOrTargetAnnotationPointcut.java new file mode 100644 index 000000000..c2b10b065 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/patterns/ThisOrTargetAnnotationPointcut.java @@ -0,0 +1,97 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver.patterns; + +import java.io.DataOutputStream; +import java.io.IOException; + +import org.aspectj.util.FuzzyBoolean; +import org.aspectj.weaver.IntMap; +import org.aspectj.weaver.ResolvedTypeX; +import org.aspectj.weaver.Shadow; +import org.aspectj.weaver.ast.Test; + +/** + * @author colyer + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class ThisOrTargetAnnotationPointcut extends NameBindingPointcut { + + private boolean isThis; + private AnnotationTypePattern type; + + /** + * + */ + public ThisOrTargetAnnotationPointcut(boolean isThis, AnnotationTypePattern type) { + super(); + this.isThis = isThis; + this.type = type; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#fastMatch(org.aspectj.weaver.patterns.FastMatchInfo) + */ + public FuzzyBoolean fastMatch(FastMatchInfo info) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#match(org.aspectj.weaver.Shadow) + */ + public FuzzyBoolean match(Shadow shadow) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#resolveBindings(org.aspectj.weaver.patterns.IScope, org.aspectj.weaver.patterns.Bindings) + */ + protected void resolveBindings(IScope scope, Bindings bindings) { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#resolveBindingsFromRTTI() + */ + protected void resolveBindingsFromRTTI() { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#concretize1(org.aspectj.weaver.ResolvedTypeX, org.aspectj.weaver.IntMap) + */ + protected Pointcut concretize1(ResolvedTypeX inAspect, IntMap bindings) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#findResidue(org.aspectj.weaver.Shadow, org.aspectj.weaver.patterns.ExposedState) + */ + public Test findResidue(Shadow shadow, ExposedState state) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.PatternNode#write(java.io.DataOutputStream) + */ + public void write(DataOutputStream s) throws IOException { + // TODO Auto-generated method stub + + } + +} diff --git a/weaver/src/org/aspectj/weaver/patterns/TypePattern.java b/weaver/src/org/aspectj/weaver/patterns/TypePattern.java index 0e0496ad2..0596bb1e9 100644 --- a/weaver/src/org/aspectj/weaver/patterns/TypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/TypePattern.java @@ -51,9 +51,20 @@ public abstract class TypePattern extends PatternNode { protected boolean includeSubtypes; + protected boolean isVarArgs = false; + protected AnnotationTypePattern annotationPattern = AnnotationTypePattern.ANY; - protected TypePattern(boolean includeSubtypes) { + protected TypePattern(boolean includeSubtypes,boolean isVarArgs) { this.includeSubtypes = includeSubtypes; + this.isVarArgs = isVarArgs; + } + + protected TypePattern(boolean includeSubtypes) { + this(includeSubtypes,false); + } + + public void setAnnotationTypePattern(AnnotationTypePattern annPatt) { + this.annotationPattern = annPatt; } //XXX non-final for Not, && and || @@ -66,18 +77,19 @@ public abstract class TypePattern extends PatternNode { } public abstract FuzzyBoolean matchesInstanceof(ResolvedTypeX type); - public final FuzzyBoolean matches(ResolvedTypeX type, MatchKind kind) { + FuzzyBoolean typeMatch = null; //??? This is part of gracefully handling missing references if (type == ResolvedTypeX.MISSING) return FuzzyBoolean.NO; if (kind == STATIC) { - return FuzzyBoolean.fromBoolean(matchesStatically(type)); + typeMatch = FuzzyBoolean.fromBoolean(matchesStatically(type)); + return typeMatch.and(annotationPattern.matches(type)); } else if (kind == DYNAMIC) { //System.err.println("matching: " + this + " with " + type); - FuzzyBoolean ret = matchesInstanceof(type); + typeMatch = matchesInstanceof(type); //System.err.println(" got: " + ret); - return ret; + return typeMatch.and(annotationPattern.matches(type)); } else { throw new IllegalArgumentException("kind must be DYNAMIC or STATIC"); } @@ -142,6 +154,7 @@ public abstract class TypePattern extends PatternNode { } protected abstract boolean matchesExactly(ResolvedTypeX type); + protected boolean matchesSubtypes(ResolvedTypeX type) { //System.out.println("matching: " + this + " to " + type); if (matchesExactly(type)) { @@ -189,6 +202,7 @@ public abstract class TypePattern extends PatternNode { public TypePattern resolveBindings(IScope scope, Bindings bindings, boolean allowBinding, boolean requireExactType) { + annotationPattern = annotationPattern.resolveBindings(scope,bindings,allowBinding); return this; } @@ -267,7 +281,7 @@ class EllipsisTypePattern extends TypePattern { * @param includeSubtypes */ public EllipsisTypePattern() { - super(false); + super(false,false); } /** @@ -314,7 +328,7 @@ class AnyTypePattern extends TypePattern { * @param includeSubtypes */ public AnyTypePattern() { - super(false); + super(false,false); } /** @@ -376,7 +390,7 @@ class AnyTypePattern extends TypePattern { class NoTypePattern extends TypePattern { public NoTypePattern() { - super(false); + super(false,false); } /** diff --git a/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java index fa2e644f9..e9b1b4536 100644 --- a/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java @@ -24,6 +24,7 @@ import org.aspectj.bridge.Message; import org.aspectj.bridge.MessageUtil; import org.aspectj.util.FileUtil; import org.aspectj.util.FuzzyBoolean; +import org.aspectj.weaver.BCException; import org.aspectj.weaver.ISourceContext; import org.aspectj.weaver.ResolvedTypeX; import org.aspectj.weaver.TypeX; @@ -38,7 +39,7 @@ public class WildTypePattern extends TypePattern { int dim; WildTypePattern(NamePattern[] namePatterns, boolean includeSubtypes, int dim) { - super(includeSubtypes); + super(includeSubtypes,false); this.namePatterns = namePatterns; this.dim = dim; ellipsisCount = 0; @@ -332,12 +333,14 @@ public class WildTypePattern extends TypePattern { public TypePattern resolveBindings(IScope scope, Bindings bindings, boolean allowBinding, boolean requireExactType) { - if (isStar()) { + if (isStar() && (annotationPattern == AnnotationTypePattern.ANY)) { if (dim == 0) { // pr72531 return TypePattern.ANY; //??? loses source location } } + annotationPattern = annotationPattern.resolveBindings(scope,bindings,allowBinding); + String simpleName = maybeGetSimpleName(); if (simpleName != null) { FormalBinding formalBinding = scope.lookupFormal(simpleName); @@ -352,7 +355,7 @@ public class WildTypePattern extends TypePattern { return this; } - BindingTypePattern binding = new BindingTypePattern(formalBinding); + BindingTypePattern binding = new BindingTypePattern(formalBinding,isVarArgs); binding.copyLocationFrom(this); bindings.register(binding, scope); @@ -396,7 +399,7 @@ public class WildTypePattern extends TypePattern { } } else { if (dim != 0) type = TypeX.makeArray(type, dim); - TypePattern ret = new ExactTypePattern(type, includeSubtypes); + TypePattern ret = new ExactTypePattern(type, includeSubtypes,isVarArgs); ret.copyLocationFrom(this); return ret; } @@ -450,7 +453,7 @@ public class WildTypePattern extends TypePattern { } else { TypeX type = TypeX.forName(clazz.getName()); if (dim != 0) type = TypeX.makeArray(type,dim); - TypePattern ret = new ExactTypePattern(type, includeSubtypes); + TypePattern ret = new ExactTypePattern(type, includeSubtypes,isVarArgs); ret.copyLocationFrom(this); return ret; } @@ -517,7 +520,7 @@ public class WildTypePattern extends TypePattern { for (int i=0; i < len; i++) { if (!o.namePatterns[i].equals(this.namePatterns[i])) return false; } - return true; + return (o.annotationPattern.equals(this.annotationPattern)); } public int hashCode() { @@ -525,6 +528,7 @@ public class WildTypePattern extends TypePattern { for (int i = 0, len = namePatterns.length; i < len; i++) { result = 37*result + namePatterns[i].hashCode(); } + result = 37*result + annotationPattern.hashCode(); return result; } @@ -537,11 +541,14 @@ public class WildTypePattern extends TypePattern { return matchesExactlyByName(type.getName()); } + + private static final byte VERSION = 1; // rev on change /** * @see org.aspectj.weaver.patterns.PatternNode#write(DataOutputStream) */ public void write(DataOutputStream s) throws IOException { s.writeByte(TypePattern.WILD); + s.writeByte(VERSION); s.writeShort(namePatterns.length); for (int i = 0; i < namePatterns.length; i++) { namePatterns[i].write(s); @@ -553,9 +560,14 @@ public class WildTypePattern extends TypePattern { FileUtil.writeStringArray(knownMatches, s); FileUtil.writeStringArray(importedPrefixes, s); writeLocation(s); + annotationPattern.write(s); } public static TypePattern read(DataInputStream s, ISourceContext context) throws IOException { + byte version = s.readByte(); + if (version > VERSION) { + throw new BCException("WildTypePattern was written by a more recent version of AspectJ, cannot read"); + } int len = s.readShort(); NamePattern[] namePatterns = new NamePattern[len]; for (int i=0; i < len; i++) { @@ -567,6 +579,7 @@ public class WildTypePattern extends TypePattern { ret.knownMatches = FileUtil.readStringArray(s); ret.importedPrefixes = FileUtil.readStringArray(s); ret.readLocation(context, s); + ret.setAnnotationTypePattern(AnnotationTypePattern.read(s,context)); return ret; } diff --git a/weaver/src/org/aspectj/weaver/patterns/WithinAnnotationPointcut.java b/weaver/src/org/aspectj/weaver/patterns/WithinAnnotationPointcut.java new file mode 100644 index 000000000..c9194f2b5 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/patterns/WithinAnnotationPointcut.java @@ -0,0 +1,94 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver.patterns; + +import java.io.DataOutputStream; +import java.io.IOException; + +import org.aspectj.util.FuzzyBoolean; +import org.aspectj.weaver.IntMap; +import org.aspectj.weaver.ResolvedTypeX; +import org.aspectj.weaver.Shadow; +import org.aspectj.weaver.ast.Test; + +/** + * @author colyer + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class WithinAnnotationPointcut extends NameBindingPointcut { + + private AnnotationTypePattern type; + /** + * + */ + public WithinAnnotationPointcut(AnnotationTypePattern type) { + super(); + this.type = type; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#fastMatch(org.aspectj.weaver.patterns.FastMatchInfo) + */ + public FuzzyBoolean fastMatch(FastMatchInfo info) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#match(org.aspectj.weaver.Shadow) + */ + public FuzzyBoolean match(Shadow shadow) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#resolveBindings(org.aspectj.weaver.patterns.IScope, org.aspectj.weaver.patterns.Bindings) + */ + protected void resolveBindings(IScope scope, Bindings bindings) { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#resolveBindingsFromRTTI() + */ + protected void resolveBindingsFromRTTI() { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#concretize1(org.aspectj.weaver.ResolvedTypeX, org.aspectj.weaver.IntMap) + */ + protected Pointcut concretize1(ResolvedTypeX inAspect, IntMap bindings) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#findResidue(org.aspectj.weaver.Shadow, org.aspectj.weaver.patterns.ExposedState) + */ + public Test findResidue(Shadow shadow, ExposedState state) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.PatternNode#write(java.io.DataOutputStream) + */ + public void write(DataOutputStream s) throws IOException { + // TODO Auto-generated method stub + + } + +} diff --git a/weaver/src/org/aspectj/weaver/patterns/WithinCodeAnnotationPointcut.java b/weaver/src/org/aspectj/weaver/patterns/WithinCodeAnnotationPointcut.java new file mode 100644 index 000000000..ad36ea073 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/patterns/WithinCodeAnnotationPointcut.java @@ -0,0 +1,94 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver.patterns; + +import java.io.DataOutputStream; +import java.io.IOException; + +import org.aspectj.util.FuzzyBoolean; +import org.aspectj.weaver.IntMap; +import org.aspectj.weaver.ResolvedTypeX; +import org.aspectj.weaver.Shadow; +import org.aspectj.weaver.ast.Test; + +/** + * @author colyer + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class WithinCodeAnnotationPointcut extends NameBindingPointcut { + + private AnnotationTypePattern type; + /** + * + */ + public WithinCodeAnnotationPointcut(AnnotationTypePattern type) { + super(); + this.type = type; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#fastMatch(org.aspectj.weaver.patterns.FastMatchInfo) + */ + public FuzzyBoolean fastMatch(FastMatchInfo info) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#match(org.aspectj.weaver.Shadow) + */ + public FuzzyBoolean match(Shadow shadow) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#resolveBindings(org.aspectj.weaver.patterns.IScope, org.aspectj.weaver.patterns.Bindings) + */ + protected void resolveBindings(IScope scope, Bindings bindings) { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#resolveBindingsFromRTTI() + */ + protected void resolveBindingsFromRTTI() { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#concretize1(org.aspectj.weaver.ResolvedTypeX, org.aspectj.weaver.IntMap) + */ + protected Pointcut concretize1(ResolvedTypeX inAspect, IntMap bindings) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.Pointcut#findResidue(org.aspectj.weaver.Shadow, org.aspectj.weaver.patterns.ExposedState) + */ + public Test findResidue(Shadow shadow, ExposedState state) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.patterns.PatternNode#write(java.io.DataOutputStream) + */ + public void write(DataOutputStream s) throws IOException { + // TODO Auto-generated method stub + + } + +} diff --git a/weaver/testdata/dummyAspect.jar b/weaver/testdata/dummyAspect.jar index e2e964d62788472a26fa39122ff0d155f57b2451..5f2cec94b3f496cbbd453008d48d8fd91996e88e 100644 GIT binary patch delta 599 zcmV-d0;v7B2Gj-(P)h>@6aWYS2moDOhLH_?16^H)k&GjMQeAJ;FciIBvTo}(R>lSl zB*dhG1`nxLG#(g2np*aN%7->+U-IHOmn|WUE5`{N4@mHjctYZVAHa_SuHA}8CAD;X zeLw7TuI*pHfBXah4{kG9?dHSb{c4VsYVou4xnm($`GTfP4a;mvTcNZ4u)y!A`W*(8|CGuKi8QH~$-(lsOO|R0t zHV%?qCtD}fY{V2_femn=LEbT2ri4~pUT-GUpmZ-xDnd6V3)5O$vU z9hqFBI+0TQU9P$RTqMyb!+}&EvJst_`D2zBT`c_aL-07%o}e%8Ys_?L_GU`#`?Fuk zwgGUDa6))T_(b?j_yRljW=xZ}2#y2r7f?$b2M7q^=3e^&007Mc002-+0Rj{N6aWYS l2moDOhLfuTLk(SBhA{}?=3e^&007OC`vNuwxdH$H002#B5^n$i delta 569 zcmV-90>=H+2Db(cP)h>@6aWYS2mqyk6Oj#k1Eqiyk&GjMl3h>KKoo}GL%RzsAPa(u z7e*nwaTyWZQIG(oPrj!o;8Cm5CSr0DqKvX4tsRTBmvE z%=u`~)0z4C>-!G?9&QsB4$I;2<9>0jq@D#4+OZgkZX(jN?yDfSQHRic5~Y!TN^rIw zoDkfDEL4ksXrS4Gi#ft_KT6fhau}%mtq2lDSnX$0Bqt(|j6V*#dJq+arGBOB9${0& zvJODE*~cj{6a^nW@LTE|(LOZ7Z5|Ix00PnuvOEOn*Ze}Jt^ zxLcFE>U)r-T3vFhGjTtv-gbVIH7YPRS0tGcF49YSmp2W;B~?pnZ&7Gtnlnw8KPYa!L24V zH*5fZV;VD7ah*vfTn&EKZ2dY{1HGxs#2=>#X&vYqZt{Ec^cV9My8|2@J@)ySqVq!e z6SETyP)h>@6aWYS2moSThLH_?17lr=vyKHG0}BHL6aWYS2moVUhLMaZ ze{D}3RTO?MyUW6`Z5R4NQA=CJc6sTpRIyrUD_uZKw}r9@(rz@D*$d2eI#t~Hh!Kd=+SGp2#6RM{P|v+HVOe%-Fx}+roH=ve&vWj~pMU@Q8-O(KFeG!c z^P`?yaf(^n^(&r;gORkvS9!+f&T?jIf3YM?8ApWS2rrpEmSf2YZrP-o7a+Yl&UFVwPOYWFt(vjO6mh@XjOj~)s%n(WS&M`!@ZjqD^ zYCoNa3Fygnp=rG#BjJl4so_ zY#z~}6F91zM{$h8%N5IKIHSUIoomnDta}D~iWdgO&`|L_!%`|}L`7P5CTIC_IOlrH z8Sa;HC7O z3NJlcT(wkZ(+!^85OT#WjtSG|e;zqpvJeYsel7$C;cIc zrpoKkQ4NwN$x}N{kfa6g;{s`ZpmU;Q8y{+~ZTc%CrY(~F(dURRMEdf-;PMlUZRkR( zElh^Fv|=0+6u;`BU)uwnoA~4pB%fh&q2uf(lH0iPfiH=<~K1_W8NL~3&tj< ze@8639$BxkFx2-%jm1eVC;l0l7PfI~3o{!vCUN97H;YfT1Hz{^=)fHPKW_ASqn}q1 zP!E6@i|9OKv8o!XP^jnPqe6a@wV0000300RKf0002Z2mk;80EBObZU6uP delta 1400 zcmY+EYd8}M9LAT;+1LmhR#9OtVK#SGqNB*>T5cI;oRs5MMl55wr*dn_vk}GImM(HH z*QgdDHeH5Oa?so>xePh_a-MqM5AXB-pa1*yR|C(6OF0vOAOrxi?aE8=94Q)bI~aAq z1N1p3q8oBcSuhwOtRHN_@~a(W@d@r_6x_1vjEV9Lzyrk0=owoM8MzpZX<9*GMIBwc z;B9l^*ymj`YBHxO%=NPLt;<^}q5|F?yzo}XtcFuRrRZC8+xH)9D-YUsaK{v^IcA2Y z^G(L(Cm#B=O{SY6UGCDDQ=#)Cy-sMlYs!J~%UGpPZZ-W8y3|~vNwq>uuOck%s?q8?#(9^Q?D44JNqzQxO79o-XnQ$3#przXA6@1=cL4@_)F7z_HjqeEncVcs zn(0YwbySt;wA!<*E^8eNCWDdEsjD)!ik%6?6PI5KTExeCwTcbqStErLg{Aa=fd1>| zp}6!;JQZQfZT7CErN*Bw3?{8#h#fT*c$gb%I~Lt9@NZ;PY8Gpt50YwW=I)U#PpI=4 z7qPq42b0HV3c18gL}BL~jk4j;jLVdG8&M|l7s)Onh{+pa1ZZO{x>!(8icTU1iZS&) zRqq-|QHeH9_KwuaO9`UTvk*;=YUj51->U+^g+!;>SUeE~@g*SY=`@FZjzei(Hp zkeoLT^Kso6rj@6`I=3|UriKmK3{(GRr<47%*4P7!iJyZYSMSlyRWfs0qJ-C{SbsX7 z&^zo=!_hOkU&ZpbtAk6~g?kd*2}QUF7iT2weM@lGxbB3;H<#l>UUnR4-!5b)HT4x; zpw%c%ozS6=H*#NB&wAya3VW+nxk*OL1%@c)!J3oAa@k>Lr=@dIhVO7Xc3nBnJwhMJ zveG`rd}DkIn|`z&zUzf?H{X$jA1s+OS9naGDTx?u2VFt*sjkf6zKfbm9qt-aQRkj& zH5vCKJkUeOz|rgZ<8G<{8o!YB?U-!E@F$@MIAM-88qpz)GrH{dJh)19lvBn26II=d zlT2RPZm|Rg!s^D4hXTKf3@6Vlyxy(phNKGEttAtCx@L*tn#_8e?WcDjKV zhe^o|U__aF+%~aE(<;wGWd`HMvIb1r zQdUgQQ(ElU%IX=tAA$ES2~I-U`h>O*DRGZKuiF4?-&j6Z74&;nb)?$pB$HQ@Z`-s> z+*IqIfG3uN=tIM-QBr!f*fj24|Dq$Hf4E=i&eW67Z`M#2J$j|m4 DKihg@ diff --git a/weaver/testdata/ltw-aspects.jar b/weaver/testdata/ltw-aspects.jar index de62d46cb134777ece1a9dd194b354ab8d4b4bef..68d0680232414836f5912054309b54646bc09b9c 100644 GIT binary patch delta 1259 zcmV@6aWYS2moSThLH_?17clrQyQ{K`=TlHw)bKa&NqML(7v7`r?Z-cBYQwKj2Ge6gmT1X6&2J z_(!Q{_lA6s)G;$Bd+zS}o$s^z*Wb^62N1(&3@xeU)k!Ze3>gGtXwUIo9=Eu?6<^%Q z>D>Us1)ej1qNZ)iS#DYdS0s7C6ATwqW$EQ@*LlDWO`GlhE> z9K+d^X^Vxz&W3Q8)h0tn$}zaL!d+8+7dM+HwCMTEl=%&@>9`_V zayL2}-5e1&Z;XtMF^u>7p%cR){E~T4iv!^n167G5g z@8SJc+`=UFmqiGw+3DtC=u(|m>X>rFFkJtiokdamLW`RWXDI5*LAz3~<#OpgTW$+d z5J3CV%AiH8Ywp-&oNx96N}DHSDIUuDBCC2?5w52_sF!wML={fpDn;8!H*o{P>S80VTUCPAX8LcTUAi&pYnWC> zYvfn7{e;ln!KY~7*E<1{>>%#E#`rsbOxBiH=oRKPm>V(7*Z$X@~9;AE34G0Iwb+y4G>+ z2m`~1c)cTjh#QA^>kx^dj)~te)qvHq!@WMJ=&<6FnAR@$VFt4#rGjYFQZ3|vyc+IS z;y%D_I=iDW%KVUa1?W1!-9OQOjQO>Wi37ABVd*(-{X$1f8*I>uKE%B$_!Vsu2p=H* z2bvn61fEnO!s?}}LiFf;;*Zg=c7)}p_-MZh62yw;R`IdUW#tR0k);CE=D&#rv_DM^ z>eVCMZDCo?s^ePOgwhOrLG&em*dSPAxk9y^5_O2aA`(Pj2VPw6Z;8Gm`iAIHQT`Fu zRK8eA^Lnx9z$ZlCGBeF3&&<%{pZ5g0d*91*LwFfK?73;No2i@} zp3BOZL9cN}3QuMg)^m-~Oy#|xo0{sXX9#rX0#igAM30GnAbL(|r;@NRKB57lVPv$I zDuth_=BMWQ7f?$F2+#uvvx)=&02>Ja08mQ-0u%rg00;mG0AgK+lQ9KD4q{z~G0+1D Vvx)=&02>LDf(0`MMg;%>008e)Xfpr+ delta 1223 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 F008T+dw&1` diff --git a/weaver/testdata/ltw-dwaspects.jar b/weaver/testdata/ltw-dwaspects.jar index 09274e5d9d690e3146ae14a676202c5e794f93df..1274055c662682be7ec7db1415e82e2b1f462db4 100644 GIT binary patch delta 871 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 I#OWXLe^-m!Q~&?~ delta 4527 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 diff --git a/weaver/testdata/ltw-peraspects.jar b/weaver/testdata/ltw-peraspects.jar index ae6adc1b3914883fd69dbc7f184b774c08445702..a3384f42294800f247bbffe500c681a1743606e6 100644 GIT binary patch delta 1457 zcmY+Ec{CIV9LFaNLk8>0AVZisgmK@aj3bR0#A;c)`*vUZ`@Y}%zVGk-e!o9I{UTfuFxG~bPZ9t+l9vaW0w(ev z87=A6=O}qNlOzU0NcyHGV~5Adw^N>sTi+7@a^elgq6}cANE>H)cRiDzOiQ%cWmzbAHquMU@|u5 zR>bA;!2aOGtHMiMV$Nywm2tFs#nN3iKa0>nYUR3iz-2gkhVQ5vb}v7I$f+y$c0&8> zIU5o7DiGNq%b6VEgXLBs6sl*)OvY62?!av^l-ndcd2eX6iIJt6R0s|5n|5c_D~~N^ zfvHlca~>?q&VALai0Al;Q+5-{!WLWp?bpH`6!9{tF&);Gc-Rp61B{v3@_62sB2Vgx zB@#4>7?um>I+{`70LoOLUG-(~g|Gz7qM+n!znAnLX8Z(%gxQqMG(G(a+&RM(xEvh!x|WO!$QJrf`l|xPh!BeQrPlQ$h7K|$Xh!b2@>Y43gHU)1(1m!8{G-%ZqRVW zxYT#Yy3oEfhwJ-PQ0Xats9Ce6vdOe1Nae6#Nl%7TXgMcQw^E|6xOilOD}uoRo!2s~ z*Ku2=VEigRxK^K5^l3YdUWPXtPhYUB;z3H`oDyY+El4e|-^K}@L}d=$*z1- z3JQ)fV4g9B7HNwaU+7i95YJh>XM7c>3yH)09D=@WAsH}V)iaqY2jNN94$g1X$w1c+m9;}9@ z4x@U5TzaGTvdrUbO==)jmFi6u?;bnT)>`mTdXnI!VrZ4DZDZ=3r`(RX&b>Twa2#tR z09rH%=bh&R0Jwqxz`r~M{sYAO^WbAVl7RmRNeksiT{%Le_V+hpfbWZR6wnUNSntqq zU%xO-ubcR=Fs#l0zG!DQ*{Wq9?JXWP^!sB#9*~lwDvh-P^8YpFJ<`aLC;y%P1g1`y AH2?qr delta 1399 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 delta 2375 zcmV-N3Apy574Q@dP)h>@6aWYS2mq*n6Oj#k1E_!#k&GsP+g95~6y1ZJNLIxq=F*l@ z0>MeZL^hE05^gP!P#_LaOd(F%rh_~NIkM!+G70bfioW%weQw$sR#+=}?`!|3?HP#x z#$Kznmo(PQnSJ)&I&=Kz->+T+NWo)h&1`Nj3EOtJUC+)dU<{o_zR%ND-?Gzlp2rU| zR>fBkVNgncqEg|zf+3y>Vr=g0rnA0hIlEH~m!~bq@@E+$!y{V^(FHdzbSO|YM4>V0 zL7ssi(Vz-l$0b~jp#^OW?HS7vtJTtu@HY959i(tgZf|kVlFuiTQGd^>$mlxOlv^ni z3Ey@YQm(g~;+3*6{bK65;QPW$Jrw?)o4+San|s`Uw_N8e8$-uADF+o_loa%k2Dj=n zbcZ@EH@zacoXnkFhPVLAVa99GYVEUtl^=KWvs~K@+HGnnR7=JTu&rU z0~6zk!kD-_F?NS!PM#PV9AkNcr~W53S)*BO%9LL*^fx(8+rc2WkR?OsQN6I#(w-=P z*ffz|2MQjkSW;zgQHb&?FVV*9|MA8bY+k958(-raI`9|f6+G4O9lpI#j3+P+ zC{mMx9Su2{RNtkb9T?(;Fst%Js31NA+K?5+fVon2XHc+^Z&1LhgZa+8cr->r@k9GT9g0-QGO zpkHH;;%JIO=3;;nz6{nudI6}s!;65{Bj zv4gHQMCg8rKon>+GTF;0x;p>{K}ygCijq6KkFcJ6iH#bzUgCq~?`W@KpdMa-tAh{v zBYnGQHbxq*or7)-pnndM1M|md$sJ-SGg`y-$jmP=l6@1aqecxQKcfE_qq$=kIpYYo z5Ajj_lNzRK`0Nm$zxkns^(9~b^v_=*51I8ENs!W1v=gTe;&z3y#;KuqQd8={9C`x2 z$uKiL&(o-4l7x1WhBn;BJ=_mgxDH{F+>X%d_op5kf#<;BF><;1Z^2>i5&`yD_6 zpE0y$mR6>`qA+9-jG?o@cX-m`_GWTny`Xmk3>SZR!HAi*DQCE8m0XeLB~LJ1%v7b9 zwp?eIuUjI;a7l?5g_||)O-o3}zH57u+Xg|}GZlLz7@9OJrS>L6AU?Rv(42PiB-No6 zIG#-F;|L-MhtY&H5wxJSjkvQ6=NlLg;vB=-jA@Jc()PM=m((UhG~*cDTIQ~)zRR1f zliGiD1Q(U^W^|Exxn+6`eaig0*l=7CtGF8*i*1aG8`nq2#~CK#e&{7>TFH#*$yCO1 zH9n)SUlCiAh(li#iD^n`S9uiHIMH9P%?+73klH3}? zu+lKXzy?D|oWLKO`Y-&b!jDm3Nyk5<){UP=kn9^6SF&#&w^4nLf_R%DSX3L99l?JM z71}$P2&oC_s4sjF?^3#XK7S%J$KkF;@E+c8$4yL8e_4c}nw@MOhHlk)m5!-448yhm z*;y2|FSM}1aE79;9kkv?Emz1su;rE@1rY=hQe!ns_D-3bcYHn5PRY*SzHf-4YQi8g z3_}en)bLX9J7hkLIV{knv&B7MryhU&HEmiAcvsnpaMmfghL|zcphl{V$O{Zt8^ofs zVU%Reki1~d%2qEoQsSCBWN=eZE&Cgs`#z-|TZ;R#aZXqCqN*Zrg+ghjYqkktb!!pV zqtZ-kE4|xjm##zl8ljcZ8u=9+zaVsP=qWn)^iF^zqr{!p7=MSU>#B@QmXUugLxj!x20IA{VjUbF0zGeRLjT@i}chp(CaZ zHfcp4;-flvuQmyU_mTYrEzOStkLnO%^%tr`^yz)#kI=Mwh^43ac&`r9ie=5M;1gQ+ z>;8TkS;_zD^tZ5p_NRq@b_#Y!SeCQmxK>_6za;t^YzVBmTAoH69HM`3hy>BMffrW# zd!iqRz9V{A7JrCUl`2-zwpOk;@F~$(n3glTUR-doW3su9#qrxJ*8m6YrR|nm_n$Ukdp5f}NyDQAn zS_ooo3)A_r;()+h9jsjiE#WXXw`3?ptzC}H|7Dl5<#t4&HwEcERO%7|m8OD{-5y!d zUF#S{RrR}7hMR#0bELZ}&l`#iRCnjvwh&oycb$(9HqUY8BFX0;@FhG!&FM@V2^kO` z4fNrXhu0fK7m|s@I5D|tpdv_Gw5yCAY5 zU0y;+mp*Ev6S_KoD_X2%w>+G)gqM$Verq_7h+uZP0m0Eg#5Q>F ztIboE&b~wDnA->2*>CmI)e8hBPnuEPi{hJBpExC+z~UAuNJa<%B*J&dX{5ws1*Jn| z;oD44$E(e3d#7bAzcMbyuEgYIC5DXK?5d2TRy@i?7-~EwTwN{sHvMsb-M^?PRYa?%xux08#;y9?UpZY}q;z4(?J)NYM!I&? zV`u>Vj`RC`os6(=Pdn(qzVMIQU!B^$GR|2TcwOKuLr~%*hl5>tiOJdt=woLVxaMOd z$IcWnHNe_gK{(z@HOqT!ya3R-4{e8OvC0{ zbWa|S^Yc6#1l-L-C@F~F#S|%YA~(HXm|UIv)x87CSG(f2k$gX2(#U5lUyH9t)XJ9j znjWMS*;1(}Rmmk)$%M~*-P%-Tgqrsdr#Ig2noI_V#x0AF2&wOZG?6Nlv6?StQMA9^ z?df~T$gZyY^|N`?13CcWV@5|U5B=={U9)vHhkFbGtY2dn4s?hT+9Y8X@N=9W>cHEK z(3)53kpB@AKWfSB{PnSiJ53Z$wtk+GB3+0G*&7M3m#igC?cYF zI>CgrlwR-V(;yh;a4m*HDD6hm)~%=BLIW*8t2O*%IocW;!gUvno$CF=QkUQ;D#h;~ zkGJMRktPlHDl&jnKmWyr56BxTQ#1TJ1NN%y?eX;2q;reFqG^T$>NK!qPg=mZ?gO1zMc3ghvp@ai8+{pBG8rc4CmY6br+La{G7Y-Y-q=dv(^T@E ziQ(2swBjHh|I(xjmJ?Ogb4hVi)`*%NAP1sJ>6AB*z5RoF&_#osPoAPX#Ua*G5-;dLE1K3RnZ{JU70MEF;m zTuCMIKS(9|hg7XUq{?)h?CN?vu2=GkfHcZ+0&n9j8#>s#(7O;FLSQ(>36FdZPXu3r z<)PA%w)eqLuji|Jke+(Z4k5B&%}t;0=gyPe0w~{)oPcJ6G==%i2qVmRWT{g6yE9>; z;Ab)pJMPmk3{jiGb9P30MNw$%U^@Zug^6)z0LM<4z_}`Sj-RIr{@eQ*Bx^murMP^d z*OcK#=WkLQVSdwITm4e0RFg6CYH+!Wjt=$TS7<)QG>b@4+ z9?uZ+bTqeg`)qU3MU9-Bm8>D1q_)kZLnv>ksLsLQxjyYMPY8^7bNp1`w~4}xL7MMn zxRhm@Y0d^d8TPEY2KgC~5z-%*C*jc!rQ($$TUYa+e;?F;FKxf8P-gJSixR_lQ64W~ zNM1u8D$~Is4y>~7?gF*SQ3%^aJKCwM+nKBx{8rPgO7C$;BrUYm5j1|sk%!oH%pWxA zj!gk4EP!O6qGeG91qFd}%#%%r`I?T+ezqL_V=b-MSI+LZ)qdVTuaP>tXx_Obkt3L; zv3mk%=aC{<4t06(K8yvAzTk!ZYf(q5+mfU)klsAXHj1ERYGVWe@o64Pv5>rQ24(|U zB@f~(L#W^d`|E*~$rU7mS=gvV&25&UtfE}o>|F*%H#)AB<|Qxz;o33pdvitYSMXDa zbs{GPM=aDi5yVrxR@#HUM;(o9rh_t71q}@aekCmrHlJB*y3>DSILh8Y5gB$5^k|4~ zs!BQJNqO1d^tb0Tt6VrRBRLsTSy8-V+(U)FC_+4||)|Mi;UxBkKg6D2T;~?e7Y)W@qB1bTJ3y^-^Ec3y>a2!7 z917(XRL*PRr9RGYLBvS~5jcs;(ec)}>*#&Mdz^RauC=1mu^bKEBv#>a+)M&DlGQnc zm`P|74_jq{KtP`vAN%^qd#lxDO9~^ZcpY9J$8>L<1&i9gY2=p}0EPvQ|OdHUyQ%8r;++N#3 zvHW4SrGol=FV>4_T$vS&l1R@7a!J0ZZeXt5863D#;CkDjs=ZtxqRa5~V}wb?QBDfz zs||Trh{8IPP6p|`4qgF}QHd!BdN%yvEx~!zWi<}L{YL`3lbud{Vv6_}-D_jzMS1!v z4GP}bGc&cJ8=mJDctUge-1KkNi;nBLj~l=NNI+;g_am2>6Sk@3*j5qZk8MW9!JqD% zIwRLp$eI{hH@)rWb(M1f^Ci}k?kX;`6DymCk*V0$-w&s?h7?&F$y=2;yM-oWH@YKH z2a;pwz8MWlVg$ht#d@@+?xkR`ndJI07S30`Gb6gQ zTfyZ9q|8=I{(Yonyx9jPBqyqe?|~0o==787ygs3SqmZ;O#+uJboJD?guN$*J)eZ8W zqIhKfSv)fRk(rGfzqwSR{kaGAbWh&(U{15ks@*+4r!rpX_is^Or7Ln`rdxM}Egi+e>WH72mliEy*6ln$lC7aS1zjwYkQkB{V z#p7qVCai>eoXtv4Zu&E`73M{YLLEeeh-Nu^*@dsnIWlytYg z*zQ<1V@6NJZ&sdf#*wo`-`+T^M)(zGqrMjW=7p3^bjk6BgGRp&#j)>%!BOZjFjR#T8<3$Z7A_-yPtW4LlUM18@mp z%2Im@^?k1n!k+F9ltO*>_F3=_-8m0Jn7O{&m)HGx_JzDJs)dS2dojFCQpi$aZ&QLx zm>C~i;6U5^J4s)uhjsa?Q>QG0b3^Rtv!PKRBu-A(8xdhlYKsnQ!#l!dIb-&P(ETGz zN4Jwc>P9g4{SFM_O0IJJqT4oe(jy^zzSY*V7uTw}Ekja(OZQ4^Ct)jxv0TU|v&Q8#0+3_lHm_^ykuNPqEo?h} z2$s8ZZC3i`sngaeW_SEvoaFi|v?HdkGpn_y*tV$d97j^jWyo zF)8!5SL&hJgDw8(LxbgXKM)TiF~y?fgpLrQ`76CO$;Q#uz#$ZKbeK85x>G}s5c%cC zuI5;CCk2xIWdPm7PD*S^7N~ZJd6#fCS?f343Fpr3qoqS;*;^*%Ps<->0JjieOcIwv zBd9v`1ksgU|LlB$Wa;IKr&eb*cTw8Pu36gFCgXPXnCMtQTUF+$Ot|HX{ry7g zoTUPDtre9S(u@$lr9-=K#A9jTdyJs|l-IEXQam2w&bJ$s-_^V(Y98kVvY7r)ua#&us@ERNe^`IuO*O++=ks;uLj z=6s#sGTG&45fjlR(aus)|1x`L-FUj>ZZh}24GV2JSgfg)$m2@|bxJYVX+Qb5G)r2s zFT}{c>}EY0qwlrna&DhFRRh;6@|I@(XUY(BcWD>2$NK@#UzNr?#}TvRnxgs*trB`! z!e1M5j3#rHrOq4Rg;9OCXXhNI`HC3U4>b}|4i8Fn_wi5X8y--!#CRYiqgg4XgJ9r_ zl1FkV?-8={fJ!jv%^P;_IMBNk=X(?Th+t>J% zjDW48Ptp58B?gjo>%OWY6PJF`&Nchh0mKM^hOOoV>f7Xr@RhIgD6c~fK4EKnyDSHb zQ=#VN@Zhp2Q!3*27pS>d-2X_@uYfP^kA8?U>C12kx;_aH{w^E-Vx4g;7BP+lf-dhE z(#4K!QN+CH+EO`eRQx(K&Gg-~lvAS+dn`6#mf9%IK7-7VFrjx^R@oC?EKgZz-BAef zq|M~Ial2=eW58Bnz#yunM^GbB@iTT;4nTeDl{528v!27Clr&;`cF>}Cd|mE^vD7+2q|B#oG}9X|Nfw@^QgOvF?99k1hrQmxVrcL)mwuLX zy#650fN3-h}Dws>rYwD{2>N))0{^On=57Z&XP0S~* z!~?0&;*fYZFwt^mV14hk1&6`Zqug(NI?W%v7^Um9muSK<9>&x=smnt~W`^1Fh3;GUniZ4y{=5TfiySVNb zU;RdHp+)G&b)rj1fdO!_u&VHXTqkTCDy%;pv!BhZACB2yGs{-->s{|YXYJ?gbM|@El`$|$(QvLBEQo|3?Ux`$!$eb&)t2H> zRF%7@BBiP*C#$8+t0MQK7Y*$|1=$Bu=HVT>rOdGH8;3jgyH-2JMoTaqOjh z8Ta-Xq-xyrU>@UCeeoG5c|sz7AM!iW@BFKuf1n?FIREYYBatquC-l%(_@ppCt&#FaJ43AzCuY8_d5kT*(=-uG zUftsGB5$E}&H!t}s>rXXINRZyfr>ix$(mKE$wm)ND`E`im&P6IX3Losm4Sf*naH{< zL^UTQ{{5!#JQ1IB5LClxOP@{>okV(aRwB&GYHpOUj5uaB z0|IM@d+U97PpB0fID3rB ztDNxIj$kR2L(_%5ceH#}Q6nQG53>okwM@@OkDEN@qF}+HB+CbB4V#YN0{T8I&0U^| zv|;O@E%N^urDZGYoBjO6rPxi#z@qnf2 zP7tR>M&GX$97ZwgN9Y{Y)0AwaR?ZMifObBrf!HVBk=Zy&*}ujMZdoN7PqaXpt;B4n z#d5rSieo{y1Cx$+(6vfHr+Ye9>sU6u-J7dQvKxVPOD%u-CKDA#MNA5;Pq^|Ix<`Xl#+rX2EDQNqf@U3?Vt@j<{)gW*W_*D77y_H z=x=h3Q2~2X)VsREN%djvEtFocdJ?aBVT>dwSXmyDtd{)(yPw5USJtQut;WR3t+!US zq!T}+MELai!6Cw-J0*dXnW)J>Ekqp_WN#ydN~|NuX6lUvds4=l#lG2Ga%r!GB)|0S zb&(kNX!_QdO3Hn=O){9APMU^9S zM@70h&DobK^0ipR++feSgTP$DZ0)fDvx`O!)BRVsJfQ^gm|w`)$V@EIOC0Z-nwde{ zE{3PHNNJq&T1y#`L@aHW=_7nRsN6&U1cDnN(ac@XB`BXX|2M1(Y4C z^t;XA9Je=M3V+UoE$9$ znLBub=g5Zq!zW?i0dEd@Is=`v!w1=#C5QdURDurbpe9o0qBgSn2g1-0Tya zCmuH>L;l$C!B?rn+%u$nzx4dM9@Ph6`1>T=5fV6-UfTO1W|Nyq8za8TqJ&s`a+Hpo zq5;_B&KH`=Sqm<$bHR|l2vY3EV=CO9O6$;5U7X7K%l;e$QA@6UrNlet_hVn%wT1Jl z;wug%{IZ%kyF*XSDIc~IzRi(zD6X&1yilZcTquwMmcEa6{)j-9e806o7hHu}WVna9 zM0Tuu{GrBwZ}Hm@MeKmSl>mMFfH$EMO+lV76q2&KupXs0wqS(TT0g?Gi@8H_3KKZh z!!)j-7wvTU7RF$xBd%;jaHeqhfk4Iy_f2v=mv}|v(gWsVv;{TAui6d|j5n$;{DUu0 zizcJ9!r>c|rdF=+RK;#{Tx@7p#ZzfujJsY~>MXHM8|wHUp0j@SmugL`4`I;r8?Tz^ ztD6_2P3tkPurGH``GEF%pUT;KFi36&<6B8Qt6!zfE*<16e40qz*GFmk_G#A1(kUs2 zR$q_e*rO>&(IPolE$VdZCr7nL@KhRoPbQxM@l>(ZL4lXGqMfMsP~UpK8VFqbyQaq2 z+rD-!of@CLI9(5X`uwRI0bK98bschtd*cdC7?!Qo!+}TZ`6-O2 zsewU2Ovc*fy22Fc%a?^3!?INB#A=P|U9%VkI;SDbK8pU@Qk~kl;RsEhEk4wZ7CkcL ztXdT+%IXbm^{}ySwNG-bjtzc?Pg$@%wWv#Wo<^H#uAU-AlH9#wIgMP%4{EwI1hs5~ zm1xR-8>ID)RVg`e{dxQNtMa zH(V{)Tc%4gSnD+!7>o309}l3*y^)d23PsO?=L_&nP{6ern`+Qj%zR0}Vf#lU+Xtun zWX&Mk4iwQWP4iJy6V~COsB#&wldub|Cn$h9=b%8^|N$1wP35*!C-oxu-OKEx6=ob2D>1r?l`bqZ;7n=%eMXAu`C{YR#c2}@nl7&Sc~er8M?G) zx?5PC{S^wadOHnotk~QI6+r9STGmo%iSCal7NR9D$wvaXNkho^8eYBOyae<9kUgu@ zXL7TAT)0a>bn)mZkKOQ#l;A>+(qsFLv0Kag3@tRqF@Eng4EdMSqV$ri>~joU!%myJ zGrWT^773OURy~xuD%rmzgHO~bB}YYi9VvlniMg}4%(mQ~Rez7M0kLKDhe7%@FcAUV72Gfw7R&Qg3}n0rJyi2c)Ko1_oL*zd@x(!1VqBY_ z=PSmFjW}p%0P;VXAI5*19~LP)3uy;OS9ceP&|gOAsfLR3m8jPoPH+Zc#eDjn6tgST>sUS_QB%h5q`V4vFpKovnm9Sf=H9YM zgm1`4c&s!qD7}DX9(E>^mx<$ahMG+Z*tQ4uiEX!ShiRnScsq1}ZDgjGm|EVH;nu4r z?a3#c_bQaiAW#pKM$I0V$3qYqr@bNtfU#*6kr}u&R6M|&VlYhiq7jYefWQR-w6tIb z6cr;Mk(UQO&UA_rv@^6+TZfJcM|K|NH4rg-b9HO>=fIbUrK`p>KG}|4zWYM6%@wQ5 zlZ#YO2T$rdmq+4t7_m{ufugp6Tm6Set(c4P-w!R^#mnsz^mc1nNX*k>dFGZ<`HW4lz<+eZolL_oOC)m z?Y0rO4|_HuPOY?jxmft6LHlhb*+m{;k~OH29jL9z->B{hUYzHqdSwV`I+_L4%$zdM z)X8nc<#84I>}pu(uiwRRnIE(S_`333ss*1Rro2|xK^Q|Va)nCw0s zvoM^?FP0v1Y#G#}J+<*~5A66dlJxOzWW#@q|IkTk8^;yrt^W_+`Txs%-_?zZRAS_M z?VB2!*5m7MT8x%5X+yKC>(xKkvs(xxb-FQ)M9iCV;6&m(Z_7v2Rj`ltgLl$>2mI5; zvP>PnmX}A9-CSc*t!8^7#X`0EppuQZW_MYYeFv+fmoY>%U4=sWhpo6p?eK1$ z8^ZZ?%W>8Sf>(TkI_~IIK~$vsooO)5C25bamgH%<_ytf{W?KIUp5=0urmG0d^KyOZ zlx;>Q=Ux+&juY)UVN-RqkFQIK+pYj7po>2w+8Z0cPym$CDH%~=qX^g}8N2ih-d9-O zz0yGw)Hh!Jxzh`WvWjo$Ya9?hZgX!^)7(PY+RtA3rZb%8ml!a;(aELo-ry| z6%3zBUF8BF{ZD(*&x@F>7sTQ}m)pN{p#4ORM2hrBzMdi1NmH*Z@pMjUGajQA{l;PSwiRIRF>C2AG{0z%ko~>v5_a zx`rEj(gc+iLTIx=7+!`__Bm^NrVmS&mL7%KKGAq}Ar_LMTSNfj%S)s{^eewC%s7EP ztbrZ70Arj#gTr;|QQUbS{h@p8x3MKG_nK#%02Owe0uP=D0Xc;_st3rkrt?{&U-+@V zqV}v0`Na2SY0@pbnmItmJNvHRcxv41r^=Di8v_Tf63eV_&=ac@iGAv6+Y?5Zq<=?}~$Qs;Z@sHfGc#5m3eb3fEPhK2fi*7;I>I1^*3?SXpsNJeG zDhSr6XriQL#>riFzx73n!%9fTY#mc1Am^NR3H2e7ZC$cs)KkDepEW=6rUJM=dZTui zKZ7zn%WM_99hy6@@kGYRIHoq-`6=54ZSXdbMJ@ipGyI4h)j{>=(haxB;w!R=n66ZVCwMx)3Xf&3t6k>^Wt&$t) zq-Z~DP`{Rku4_>LjQ>@U`W@xhg2;6#>1PC9b^laY`W@+4cX6%TpD}W!^WTvEQt|H) zzaEZ^KmWh#4dVR^;@_s^cer2o{C~n}1O5c}_xbue+^<{KKjDzK{si~;vGF_Huetpv eUq*!gh5K#SQ&+~ic})xURl~Si79qE<-~JEO>?F$o diff --git a/weaver/testdata/megatrace0easy.jar b/weaver/testdata/megatrace0easy.jar index 7b1682e85a41994e10a381f675fa05b637091845..34f42987e2370e6187a0146e3e14278c4c52561b 100644 GIT binary patch delta 2932 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 diff --git a/weaver/testdata/megatrace0hard.jar b/weaver/testdata/megatrace0hard.jar index 06fa9b91c7d057b8bddf861d52ab8ded5787faff..b7fc01a1d96f4346b0b27d9f7d1e5872897ae3a2 100644 GIT binary patch delta 2864 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 delta 2743 zcmZ8jc{J1w7anUfmSPZUVl*i0FdD>5iL&q6W+WMVwozHK{2IJS_DPnkW8X&ELun{m zCi@;Uvab;#RA2q`oxbnhbI(2J-h0kH=bq=D=gAao7vMC}XJY0Bfq#3^Bc3GAV5Z-R zxWg(7BvSO+uX08HGISuBPDx5;|Fh6+;AQcg`UBr3 zcI7Smgt>G>I+q;&QJ$&oy7f7AMjp-a8MO#!XWH;7GI#u9mQ!IHCD7{lL2~`2zQclk)giNj-cGD|$OB+}ESg;q17E+SA27edEDV2D@spG*04S966!iK;M76}Eh zTfe-+61;!N-I<+RP*&J?Pk1SNC+l9{WgM{Imr4T(M2Ph-s@yQ^C~}-kGtGxbynQA% z2avfx2w1B4Ifd$qPs7hJpD|8*wvr8XjoziQ9dvFy_0RytQMV9U7Q`a4V)lu^m0p1z zL5Y5Kw+nH-6|-sXc9`AfC(d^EYmRXX@&r4agrFj<*}kytp+C9$tPop5SJLck((D}L zN>{-~0q%ynwwJzqvHdG&%MODNDe+E@fP+hI%yw)RQrXudrNVEu+7n|1QG)q%jv3gY zVg41~)uVS&tMm!V-~`3V?NiD}diwA!1zl}cwY{Q(X4m46-HshTB@^|Q4%Lzs+ed*` z&f%^umo~zrUgWz@*W#?sL7z0oU#iB*jK`ld9FNRmR4q4ZeyW=zBQ33SA$pn-sC=LM zK%b8=u*s!TDvz=Wa;WgOyk%{rpz

-+kV9P!9r&89th^@^5lY$lS}vx-D~qU-{vU z?Sl$_GCSpHTX*lVdF=SeMTav|GBI7&GRx+}=cAJcnouH3k@{tfUT63ebpIWd>o{k zZZ4RLjKZ+@N~`QuOSZu6c*mDgKI(5DJ!`(`b_3oNniHm+C%`wZb@GPS4}j5v6wHQ1 z&xsnPx`)`wj>lIt&(4-%5^juQTi10ddJLI7;58VAel3fDuwXs&VIK(Apg&b1O{;nL z7_35%ZcR^2et$aqDG&0Y3nj6qD{QVF1arr6OdNwDMW3 z`s*M=jgtKZmr949^NhbftweY{!iv<{&rI(V^zy~yehOozejRSU72WFUg!rWw+?`3m zD|iZ$$#ujByNah1&H~`_fELV>>#^IpbJjzqRb*^a?A4h@V1Rc^CPU<-Yf0j zuD7vmt<|5&U9Cyky6f3oAwrHEz8iDYiB=<+#=70o zsHAnCixi#QLLZ;PFJcc;9+>i#JWGB+s1ZQ26k7$bYR7Wr7r;sGCXc(EJ=fVf)z$q| zrn7UWe(*I|$-26jR($>@yHVaRq`3ClvZofmaLk6t0hIDjMW5o!-yhCxb1hfOe_~86 z$wEyDZ0k4n22L0hE8dHcl1w%n*z3L!@IGqN)}sym&T7Ho!k9JfX~u#_TZ5nQXxVWY zrQ%_C>SXl!HSGCn!soaz5+ho2hs;VWmaGpczE(hP}zDOCB_XvKM-x zs5VWe%hg}D512^QlpQZsgP4$aLi1U%02Fx4nulP{Yg@;Gg9)HxoAz4xvDBa)LS|Y| z2H2Uf9PV<7a(LgrvsCOj=iI(o&)-ycBbo->@A#_jWBO0H>d53~i6b|kouCo$Zg*jT znFe;2Me-DSsWoI8-&FF(Ni3Wc|GpzL+tczKWs6AiPu7G`C0-sDUeB7=!j{$uiIKU- zAW;Wl2ico-JZf4TrV7pO4L6|O7Xtz4~xknC+vo=))U?(6FlC&q%+O_dP$zzNQiNuH{vF z1~0C)+`J^=AQ$I2esW{9X{y&q;xHKogbAnl)ft6K+X?K13aX;Vt(~lu|7E%Ni_{6g+ zU2->fJ!Zz|2M3Pe%!K+b#>?pe?X=-SfEUNmugJQPZ25Sb zNRPu_W<5Q3u{?!tkJab5j2&2&1fb|m{{w?^nt)AHA&&6YvHPwrw&HRVI)AD3UIqcU zBQoEHRO__x(^rG~h3k`%6gk1s^hcqJqGKY+05bGQvgKtJ)y&Km(wnq+QEfv=^jkRG z+iX9>^2tvgUZ+N_W^64AV}84TAF}N-f#ZN>=tP)k&T|rJXSLEoAq*&Cc;z~z;}qve zwCpg%p)E0s<$_KdZ&nlIk0G&Vv4EESF?cN0fzGRd)x4)IpiDXTXA3FfRk$A11#Nu% zuk1ms1czwCivuRhUAS-mzdEZ4BzAe+=lL9x%Np|v&hcb3{B(5(mec`i<_FS?Vn@gj z32>i*lr;M&d3RX*#c~e)L_}bK{$i465*m+v5?B4}J8XkCJ2DjH^ibZ&Y>0osesIdO zHP~;f#m@Bd6p>UBQ6*`+U5(smc0x444z)^ay&hhffKN!K8`l&tTz}O12he?ZN^$P4%)S Udj;(884y3wg#*dT#r~)G9|*%4CjbBd diff --git a/weaver/testdata/megatraceNoweave.jar b/weaver/testdata/megatraceNoweave.jar index 695b6ed553c51683858297df866f402a6da1a629..0630eceb0e16af1d1032ab31642fa0dae446f696 100644 GIT binary patch delta 2548 zcmY*bcQhLc7Y`Dv_IS2hC7M2JD^)>hYd^a*)GDnAYSj#_y#;BlP@_RmwQ7%-+QhEC z8_&$M8fx{^bH4Mv_uYGb=iYPgJ@@|gJNLK9mB`I#tVadp0MK4J3>KBj7)*5)(qI%| zq@Fj2Imac*2^F9$#=Ohlli|A03++8400_of|#Z z`XetvxcPkZgORb9ySiM~Xd<)cd&GQ$NqbO`ZRT^ZLu#4avEP#S@DGANLGAP5g1TKO z)l+UgN;QnzJ6Sc+!|w7dZ6Tnboje+u=rdY%xOsROKXxRt!7@ExpmN)>VXBx<0}GwH zhIS8l08&A{@upm%laOGK5#oKo?bVc74-crUmX}_5?AQhd1!4up!33VlVhm0iZ`*nE zT6rGAOF^ot$4Z`tVXAbxk)k!Qg5ujq$2)#L9v;2`L!rDJzxm)<@Y|RmnO&p>eApWG ze1Kf!#@BV^DJx-hJe!<3^F{LUQF;SO3(HQN#LSFpiMJxt4;6FcB&zz35qCDPNrgM# zwdB=Xql0&&xfSgprsK79g-FB8`_A?n#m}0dpN*{B%^3Je$qqEXi(_s46PO955xWV6 z%+2qN3(Zh|hRe`uHF9VDLYun7Y@$R)BoFd7lG`;S4sn_|>Idi)p%>Extf{X7+2@ z_PrKR4^NiTJop(fshpgV>h?0DBVZ?(0oEYIVv05kfU!>ps{f=k#R*_gi$&&AJebE; zHVHJO>yAM*PYbACAmVbr9F;p~embaM**x?qVqBa(X^3b=#wAUC+P3 zHGKd@(=>1lsZt8l4`CaOoATMFg)hwO=XTcr<17b<9UcC(3ps+3LROhhndiGZ z+{HW`U4O#(RV;0IVRiC8IHo$w?3g|4qyvli6(ozOS(Rzq=1sT)AAVdV{g1nETpF91 zZT9&wF1P>io$|a}zCza$CK_m@KS$>kDPN@0rgNew-llzm7BA2+EHEU9eJK03!y5iA zMyB6hlU-7wRIb`kRdqNZW({pUjpZg^22LjeyXvf!3Q42Nif40Mqli(NvUvZr7 zfY)|9>ZQ`JxI@5d9(&Zznpyd#m@E0#8G$|DYxkRA^Y+`eGGmHJE7efZ8R6YSg(m?K z_nL$AR7)xbADEu~ExaAQxUP zQ|`X2cfY8nlkmh$>>kQ~hGnHYiu~B1H5+}oKD}l`Y%mZOy*N)w-y!VuUl26gk&1Nt zxJr|CAht`i7gz5G80&IADb|1(J-{P&q~r8U#=Aa&h{q3oP3`Ssd12Eis;uR-i} zB^0ka;SN!|(9aXO&;005mgAY*P90W__9AJ*X%fUwKg6o*s>#71U5J-{gq$C3-fe1f zHR{NaOM0Q?ZH88BFH4Sf|A=OI3(yMEAf)(;J3*FVzf6_*1Jl;iYONJ3;sJbZ-(W_x zX)#_yUh3F47JO5*!^O@qI8xhkz34ksdZDTJv+cSosrmk8}yiiW*VjD4ziL zNXYOY{^^u}jY^_@+TAGDn;#*z(CSylT$Q0MNJDMe8Kx$QqS;<0jmh)+WgAVR3rGcrGtWtQXYAz^kCHnTTys9IU#W^_uYf4=bguL_d|<(`xQ{^w+r z#l-BKz+4_oX6dDH8ENKD8_Iu<*& z=ahmf6(i~CJo*+dAV~&t*z4R1qTSZ}ltWATCM`q`=iOrCc#{_{Np7UU@!?{@7_5mq zwQs+m@=)RNQ$zTj2h7($qJ0-Lbd{}vP4I^BmmbO%x#OX7JEefYzSF*Ey>iFG|p>6X~=7ALccnzEo8xH r002;N1^z4iWAoIh*@BR(mH*x-^Y3$<{|sMc6=_x1z|<@Bzl#3>@dC&L delta 2500 zcmZ8jS5y;-5)GZu5}Fb*AkrbBO79?|^kzT;NE3_@+6JT=dMF_vp$G&;x>A%9Km?T{ zz1I~)2vU?1KwP@G`aa&IG2L+;O1ao^DsA` zT~bvifZiOID4sETMLZk6j)X#=M2j!w zy|>7qg&%t>Dgee>snKQiYu4T69u+X`XqBfy0uSgp-_DPNAXLCUYCq0<0Gfi&ZG%uSp{6faqYubMBdi3fI4V1?! zTaWF?`hnDe_X7@JY6dpV# zM1{hr&{pBpxp9bQP77KL(p%Uwn~BNUnqYk$aCsIX>H*b|6s1#rT^zI1i-{8#6-WT}Fa-Ohhhk?iyg8jP zM8_>TsZ{Wixg$$MMV&0K^D8Pn0bQ?qONxM*diG6Xa;Iy)Wbk?N0NS#e*E0utLQoH( zv8_Yb$0J(H>L_*mrLfOq47P4Zu;KV!&EfMS$3>2H&|5?bCAnT8 z#rNQ}PMpD*X|YH*r{<~X8*D{@oHeD;Rd~dXez*dz{xPL&u%zbY!qjH<0~t)O%z*tJ zs|Lf$IfsBYfL~uD(>ZqWM9Juh{7BJdf}^27`_}8xC`fdAT}i*U-r^$Sj6qCUqg7;{ z)l_or;2A{tVoZBg#MxP?!%!;TgohLFWZyMD4` zTn2R8)V<{)f2p}|)k!WQm1CRxNadv()ilFPccxs~XxdHGNH6!yt(~t-75r)cO|AmQ zdbP$r8`G_LO-4Mlke}rNLzrgoq_|M-eQ954Gy?QKhISshYfo|-=zrFlg>csN)A}JX zN~uLK-}xxEa^DFnj*a~uTX^(?bG28N{w(2;XH7zNx`*mM<3&0IQ~Y8d+``SDrtD+QLnOf$pg_uS9Y$owZ#Qi_M-rih^?eSMI@`BCoqZE{roFa~TK?nWF$;Po zKkcKD(NFc3X-=me-32-}Ge20WkHdv#yO`N3Gx`uXQ)p#8R<4VgchkNd!`YaZx`cxE zGn+3$sJ@+gq^^24u?p%1LirWV=rwh5IS;a2s{GfBCBMvg5m} z4@th18w9>m(&a0hHbgGr*W`L{(ur!LPh4b@>p@nBjJQPA)CEWou{)sfWi<~vgCBO6&Esw zTX*oOF4Tz2Ngovk$&pu8pX{LL?~*0ou3yUcU3Yt8xfmgxId!bxJ(uit862LtLA&B{ z(l9dP|5^UnN8(V^6n#gVZzDYMNdNFoIqi$$@|b#TXV{1?r#{@eOuLQB3w#%70*N=&s)zr@M}VCzZOXpcZXf^uD++eBHer7u;lZ|HQ?5OE~z> zw%aN3TTTUco)EKPeHzc<`Ud5;k|}G)?dknI)YdhJqkMOp_RBp6EWFRwR7yO&JdLO? zbJQCQv55}aTo3mt5k_Z`JB#~-5b4o1hZ!rFhpmWI2Hv2KyH>WB2_ zXEsT0TWgn{>K-M1V_mUhY}b0@+7DzwAAc&6ZZ$ZH`zE>K)xVvob4F)r!o)1FIDJOX z2ms7*0095`9>f+VIc!*M;M+<^o~Q8HdrL$xS5M7_kdF zbX&66iD!yt!iyZ2CFvMzDZ;Zd=9lNx{#eymiwO7h#Qr?mhw8E%@P(ChvOjcI19z9z z>ARrU@+5Y%Cr0FYrMvN{+`z2-sTN^{Rw_%vQ=jxYvV5!28xfAxB+%rIV31Wqb#q9w4euigB$EuRfr-(kGxT8Tlm(~b|;%_MSQNJ1%d6iY2qDa-@YLX;OyeQBjoqXX^aM8Jnv?dqYgrnOeV%*=mz05-!Go1n za4Q=DZ?hYaxr`-Ux4byUFN4S6n;Ph}b?G{6$p9O1eEU$_jo--?}>~h<)8ka+PfBvdpLQ z;3@WijX3vXqUVd&`$14(TEofwxznYP;} zEfJWBvnPY8`tkdS^Pxr|3j(>I;twX+d~B`~brWb*uLIV0t{|7MeqSq+p|_uVQWna) zVIjEswINr@ZW)O~l~Yz_AH$s``!iiNF3ZMCr#OCV-QYXebI^OUx42=(6viAGC)y#? zE)sFf^jq}pX2(%~(gFbb48KKBL(2pBZ)lRQo3u+-0{{RjzlQjOMfpDwDwLIb%7 diff --git a/weaver/testdata/tracing.jar b/weaver/testdata/tracing.jar index 16fa51c906ed99e837ce0140c0565501aba70693..e3ea96f96042c56831b53360ba75adda8201e4ea 100644 GIT binary patch delta 2441 zcmV;433m3m6oVBFP)h>@6aWYS2mo7MhLH_?16^H)k&GUH-%}e^6#j00kPy=r0!6S& zX&XxjkQ7LEgDblZ%wc+B_GVR&j>wWzE)qgkhNtw*Lw^zvl?P6+(>Sw5oy# z)chM(deJsakry`Cwx*)!#MxGKpo>D`rr`EuUl`pC9Ui+wc!73RW|3jYD|bg?uh}IK*j2bfZd92kuW-U@;_n0lKs#)Q-qda((L2XN3Xo3eWP^1CK zrv*%2xAYFtC`~P+Hkf>f)-R~z!*leG)+VVvMQy}A2DSM#&cKg08qKjVEeNSd5zOy( z)hL(PB3OUB5B1jx6}j-H>a^24pdcxKO%n$nwXI*``B=|B&Npav)fQY@ve$DM zjmKV|C)VGf|9))XAqI!`k>1A`#W45?;|m8%*Jx?DzBK%x9$&I%r5@inCNN2V(fBc@ zBK4sc-I$`DU&Y)-@k$lssD~`{LS9m*h*d_#e_gR;xPjM{y^!)zlQ)|5KS5w0vriFt zpi;qTD%z;j?lTL#T z35OmbSJ!aiWDPTQ4Kr?y$evVx(?`FM%^Jqk{&vzbMk^f{rQhVRyc~|vFGZUBCFj8a z>383s%zJCt<}zr(J;iNN75h;AFAG^_4L!Z&?8K7HE~{&qr{QC~lbtMNt@0kXmn=&Z zW;CG{X7#dBarmlbzvooQqEo0{FL!77cA@!d&`L#-(&Pgii^d5k4pUO7V6OG6ed}eeV-KBz%NrS5V+B zf}eE!2T)4~2!&ZBthxjM06hu-08mQ<1QY-W00;nGU51lh1s{J^OLH4V5dOw`3y~Pd zkA#P#fRfmbk#Nk@Hc4#Rh9vTX$mNtN9T=}h)(Uw?wL9|T!q4CaRB_>w19qxx3Rl4m zs`x`3r~-Os7fUK{*s9*?>FMsTyQh2ikH3HZ1wbC3F(g(FH(YLs1Q!J-OU_wM?erc)WNdtsAzGAG(z#^JrKgJKID-t*Y4qXc3}T3iB?LNwR~Rmr zY)7oNcejPRp@j?sC28^ICUrfK8 zAn4pw?(X*VRJF#Z8E%htrN6e_5SE&~DA9RclkQHQdo9{G^814C2{%7q-LrK;@*!s{ zLe*t;QCLmxa%D@WlM+LJ2cmrFDY2Wt8&p8qR_7OD%fh;AJF2W)!FOjfxQ=WJqqxB^ z+-0puXJ>z*U8@Ne(c2lE3a0eSJzu*X(v0IgC*md8;LyD#K(* zHO4Pk`)Cx=1ny`Llhg%D`e)Q;V;3z*H;;nWedoVR?@cd(yVSTXEoeF!ysJZ-#(NA* z>Z`vH6xGTVRI8+4^tBqpON85L%h9mgYLpKhRTqECwlYW{shjX)Y5`I$1gbvBs+>35 z1=)70O9z%{>HACIeo~LrL`XeDXUH$|LK+WHq@k&E&v$Dk<#U6sCt^5=BVCql*AmON z?(9sEN?to=xD}Glx}<7ZZPnFcFX++$H5+o~V-}^O#K8+xo|tE{h5R$K|( zplpAl^eyT`T2DH0*L1OIjng|tQo1YJP14F}&HRK*KOp&d;yL<{j3h#u1H@f1Hd>-- z=-jdpSjHw!F>+*}2DKw!h^q#y+nCCNSIO;bv|EnSX2}+%?0y(qv@aEA^vNk zZ?!*1GkBfeQA0YUEm|YAjvV97Gvu}gZk>N(eDVZupJ3_)?{|XC`f5Rtn)?7BnlMN3 z5pjJcaNQON-wgQWG?&l(xAk_+yAbLVn3*6MOqO**$bCXrt ze}ylKGnJxj9?~yEN>y3pidUBC=hpJXQ|W%`wI~O#;t$iKMX^`u9t7T~s=Os#QBlHE zRc-6J)>Nf?j7_0*H36HbN%TF@pF}KwVa@cC&Tn0h0CmZ~P)i30-w^En1_S^A)CT|n zP)h*<6aW+e2mlBGTU~~ecnL!eU0sGTg;^x5x�KJqnY_2`fciU4}8=5bXX21ONck z2LJ#K0000000000000000CEKY08M#Ra$#d-E@NzAb8}Ej1qJ{B000930|2@J006TI H00000S51=m delta 2340 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 K25AWZ0001a-)lqw diff --git a/weaver/testsrc/org/aspectj/weaver/TestShadow.java b/weaver/testsrc/org/aspectj/weaver/TestShadow.java index b4ed5ea61..9c1125438 100644 --- a/weaver/testsrc/org/aspectj/weaver/TestShadow.java +++ b/weaver/testsrc/org/aspectj/weaver/TestShadow.java @@ -70,4 +70,46 @@ public class TestShadow extends Shadow { throw new RuntimeException("unimplemented"); } + /* (non-Javadoc) + * @see org.aspectj.weaver.Shadow#getKindedAnnotationVar() + */ + public Var getKindedAnnotationVar(TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.Shadow#getWithinAnnotationVar() + */ + public Var getWithinAnnotationVar(TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.Shadow#getWithinCodeAnnotationVar() + */ + public Var getWithinCodeAnnotationVar(TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.Shadow#getThisAnnotationVar() + */ + public Var getThisAnnotationVar(TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.Shadow#getTargetAnnotationVar() + */ + public Var getTargetAnnotationVar(TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + + /* (non-Javadoc) + * @see org.aspectj.weaver.Shadow#getArgAnnotationVar(int) + */ + public Var getArgAnnotationVar(int i,TypeX annotationType) { + throw new RuntimeException("unimplemented"); + } + } diff --git a/weaver/testsrc/org/aspectj/weaver/patterns/BindingTestCase.java b/weaver/testsrc/org/aspectj/weaver/patterns/BindingTestCase.java index e75479275..455663699 100644 --- a/weaver/testsrc/org/aspectj/weaver/patterns/BindingTestCase.java +++ b/weaver/testsrc/org/aspectj/weaver/patterns/BindingTestCase.java @@ -31,8 +31,8 @@ public class BindingTestCase extends TestCase { public void testResolveBindings() { - BindingTypePattern at = new BindingTypePattern(world.resolve("java.lang.Object"), 0); - BindingTypePattern bt = new BindingTypePattern(world.resolve("java.lang.Object"), 1); + BindingTypePattern at = new BindingTypePattern(world.resolve("java.lang.Object"), 0, false); + BindingTypePattern bt = new BindingTypePattern(world.resolve("java.lang.Object"), 1, false); BindingTypePattern[] all = new BindingTypePattern[] {at, bt}; BindingTypePattern[] none = new BindingTypePattern[] {null, null}; diff --git a/weaver/testsrc/org/aspectj/weaver/patterns/KindedAnnotationPointcutTestCase.java b/weaver/testsrc/org/aspectj/weaver/patterns/KindedAnnotationPointcutTestCase.java new file mode 100644 index 000000000..954746d47 --- /dev/null +++ b/weaver/testsrc/org/aspectj/weaver/patterns/KindedAnnotationPointcutTestCase.java @@ -0,0 +1,27 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation. + * 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 + * + * ******************************************************************/ +package org.aspectj.weaver.patterns; + +import junit.framework.TestCase; + +/** + * @author colyer + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class KindedAnnotationPointcutTestCase extends TestCase { + + public void testParsing() { + PatternParser p = new PatternParser("@call(@String)"); + Pointcut pc = p.parsePointcut(); + assertTrue(pc instanceof KindedAnnotationPointcut); + } +} -- 2.39.5