選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

IndeterminateArg.java 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import org.aspectj.testing.Tester;
  2. import org.aspectj.lang.*;
  3. import org.aspectj.lang.reflect.*;
  4. import java.util.Arrays;
  5. /** @testcase PR#764 binding args with single indeterminate prefix and suffix */
  6. public class IndeterminateArg {
  7. public static void main (String[] args) {
  8. Object o1 = new OObject("o1");
  9. Object o2 = new OObject("o2");
  10. Object o3 = new OObject("o3");
  11. String s1 = "s1";
  12. String s2 = "s2";
  13. String s3 = "s3";
  14. SClass c;
  15. c = new SClass();
  16. c = new SClass(s1);
  17. c = new SClass(s1, s2);
  18. c = new SClass(s1, s2, s3);
  19. c.f();
  20. c.f(s1);
  21. c.f(s1, s2);
  22. c.f(s1, s2, s3);
  23. OClass o;
  24. o = new OClass();
  25. o = new OClass(o1);
  26. o = new OClass(s1);
  27. o = new OClass(o1, o2);
  28. o = new OClass(o1, s2);
  29. o = new OClass(s1, o2);
  30. o = new OClass(s1, s2);
  31. o = new OClass(o1, o2, o3);
  32. o = new OClass(o1, o2, s3);
  33. o = new OClass(o1, s2, o3);
  34. o = new OClass(o1, s2, s3);
  35. o = new OClass(s1, o2, o3);
  36. o = new OClass(s1, o2, s3);
  37. o = new OClass(s1, s2, o3);
  38. o = new OClass(s1, s2, s3);
  39. o.f();
  40. o.f(o1);
  41. o.f(s1);
  42. o.f(o1, o2);
  43. o.f(o1, s2);
  44. o.f(s1, o2);
  45. o.f(s1, s2);
  46. o.f(o1, o2, o3);
  47. o.f(o1, o2, s3);
  48. o.f(o1, s2, o3);
  49. o.f(o1, s2, s3);
  50. o.f(s1, o2, o3);
  51. o.f(s1, o2, s3);
  52. o.f(s1, s2, o3);
  53. o.f(s1, s2, s3);
  54. Tester.checkEventsFromFile("IndeterminateArg.events");
  55. }
  56. }
  57. class OObject {
  58. final String s;
  59. OObject(String s) { this.s = s; }
  60. public String toString() { return s; }
  61. }
  62. class T {
  63. static void e(String s) {
  64. Tester.event(s);
  65. }
  66. }
  67. interface C {}
  68. class SClass implements C {
  69. SClass() { T.e("SClass()"); }
  70. SClass(String s1) { T.e("SClass(" + s1 + ")"); }
  71. SClass(String s1, String s2) { T.e("SClass(" + s1 + ", " + s2 + ")"); }
  72. SClass(String s1, String s2, String s3) { T.e("SClass(" + s1 + ", " + s2 + ", " + s3 + ")"); }
  73. void f() { T.e("SClass.f()"); }
  74. void f(String s1) { T.e("SClass.f(" + s1 + ")"); }
  75. void f(String s1, String s2) { T.e("SClass.f(" + s1 + ", " + s2 + ")"); }
  76. void f(String s1, String s2, String s3) { T.e("SClass.f(" + s1 + ", " + s2 + ", " + s3 + ")"); }
  77. }
  78. class OClass implements C {
  79. OClass() { T.e("OClass()"); }
  80. OClass(Object s1) { T.e("OClass(" + s1 + ")"); }
  81. OClass(Object s1, Object s2) { T.e("OClass(" + s1 + ", " + s2 + ")"); }
  82. OClass(Object s1, Object s2, Object s3) { T.e("OClass(" + s1 + ", " + s2 + ", " + s3 + ")"); }
  83. void f() { T.e("OClass.f()"); }
  84. void f(Object s1) { T.e("OClass.f(" + s1 + ")"); }
  85. void f(Object s1, Object s2) { T.e("OClass.f(" + s1 + ", " + s2 + ")"); }
  86. void f(Object s1, Object s2, Object s3) { T.e("OClass.f(" + s1 + ", " + s2 + ", " + s3 + ")"); }
  87. }
  88. aspect A {
  89. String actualTypes(JoinPoint jp) { // XXX gather as utility
  90. Object[] types = jp.getArgs();
  91. StringBuffer sb = new StringBuffer();
  92. sb.append("[");
  93. for (int i = 0; i < types.length; i++) {
  94. sb.append(types[i].getClass().getName());
  95. if ((1+i) < types.length) {
  96. sb.append(", ");
  97. }
  98. }
  99. sb.append("]");
  100. return sb.toString();
  101. }
  102. void check(String pc, JoinPoint jp) {
  103. Class[] types = ((CodeSignature) jp.getSignature()).getParameterTypes();
  104. String name = jp.toLongString() + " " + actualTypes(jp) + ": " + pc;
  105. T.e(name);
  106. }
  107. pointcut safe() : (call(C+.new(..))) ||
  108. (call(* *.*(..)) && target(C));
  109. // XXX should encode slots, range: a0o1 = args(Object); a3o2Start = args(Object, Object, *)
  110. pointcut none() : args();
  111. pointcut o1() : args(Object);
  112. pointcut o2() : args(Object, Object);
  113. pointcut o3() : args(Object, Object, Object);
  114. pointcut o1Start() : args(Object,*);
  115. pointcut o1End() : args(*,Object);
  116. pointcut o2Start() : args(Object, Object,*);
  117. pointcut o2End() : args(*,Object, Object);
  118. pointcut s1() : args(String);
  119. pointcut s2() : args(String, String);
  120. pointcut s3() : args(String, String, String);
  121. pointcut s1Start() : args(String,*);
  122. pointcut s1End() : args(*,String);
  123. pointcut s2Start() : args(String, String,*);
  124. pointcut s2End() : args(*,String, String);
  125. // bind
  126. pointcut bo1(Object o1) : args(o1);
  127. pointcut bo2(Object o1, Object o2) : args(o1, o2);
  128. pointcut bo3(Object o1, Object o2, Object o3) : args(o1, o2, o3);
  129. pointcut bo1Start(Object o1) : args(o1,*);
  130. pointcut bo1End(Object o1) : args(*,o1);
  131. pointcut bo2Start(Object o1, Object o2) : args(o1, o2,*);
  132. pointcut bo2End(Object o1, Object o2) : args(*,o1, o2);
  133. pointcut bs1(String s1) : args(s1);
  134. pointcut bs2(String s1, String s2) : args(s1, s2);
  135. pointcut bs3(String s1, String s2, String s3) : args(s1, s2, s3);
  136. pointcut bs1Start(String s1) : args(s1,*);
  137. pointcut bs1End(String s1) : args(*,s1);
  138. pointcut bs2Start(String s1, String s2) : args(s1, s2,*);
  139. pointcut bs2End(String s1, String s2) : args(*,s1, s2);
  140. before() : safe() && none() { check ("none()", thisJoinPoint); }
  141. before() : safe() && o1() { check ("o1()", thisJoinPoint); }
  142. before() : safe() && o2() { check ("o2()", thisJoinPoint); }
  143. before() : safe() && o3() { check ("o3()", thisJoinPoint); }
  144. before() : safe() && o1Start() { check ("o1Start()", thisJoinPoint); }
  145. before() : safe() && o1End() { check ("o1End()", thisJoinPoint); }
  146. before() : safe() && o2Start() { check ("o2Start()", thisJoinPoint); }
  147. before() : safe() && o2End() { check ("o2End()", thisJoinPoint); }
  148. before() : safe() && s1() { check ("s1()", thisJoinPoint); }
  149. before() : safe() && s2() { check ("s2()", thisJoinPoint); }
  150. before() : safe() && s3() { check ("s3()", thisJoinPoint); }
  151. before() : safe() && s1Start() { check ("s1Start()", thisJoinPoint); }
  152. before() : safe() && s1End() { check ("s1End()", thisJoinPoint); }
  153. before() : safe() && s2Start() { check ("s2Start()", thisJoinPoint); }
  154. before() : safe() && s2End() { check ("s2End()", thisJoinPoint); }
  155. before(Object o1) : safe() && bo1(o1) { check ("bo1()", thisJoinPoint); }
  156. before(Object o1, Object o2) : safe() && bo2(o1, o2) { check ("bo2()", thisJoinPoint); }
  157. before(Object o1, Object o2, Object o3) : safe() && bo3(o1, o2, o3) { check ("bo3()", thisJoinPoint); }
  158. before(Object o1) : safe() && bo1Start(o1) { check ("bo1Start()", thisJoinPoint); }
  159. before(Object o1) : safe() && bo1End(o1) { check ("bo1End()", thisJoinPoint); }
  160. before(Object o1, Object o2) : safe() && bo2Start(o1, o2) { check ("bo2Start()", thisJoinPoint); }
  161. before(Object o1, Object o2) : safe() && bo2End(o1, o2) { check ("bo2End()", thisJoinPoint); }
  162. before(String s1) : safe() && bs1(s1) { check ("bs1()", thisJoinPoint); }
  163. before(String s1, String s2) : safe() && bs2(s1, s2) { check ("bs2()", thisJoinPoint); }
  164. before(String s1, String s2, String s3) : safe() && bs3(s1, s2, s3) { check ("bs3()", thisJoinPoint); }
  165. before(String s1) : safe() && bs1Start(s1) { check ("bs1Start()", thisJoinPoint); }
  166. before(String s1) : safe() && bs1End(s1) { check ("bs1End()", thisJoinPoint); }
  167. before(String s1, String s2) : safe() && bs2Start(s1, s2) { check ("bs2Start()", thisJoinPoint); }
  168. before(String s1, String s2) : safe() && bs2End(s1, s2) { check ("bs2End()", thisJoinPoint); }
  169. }