You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AjcMemberMaker.java 32KB

пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 14 година
пре 15 година
пре 15 година
пре 14 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
пре 15 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. /* *******************************************************************
  2. * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v 2.0
  6. * which accompanies this distribution and is available at
  7. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  8. *
  9. * Contributors:
  10. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver;
  13. import java.lang.reflect.Modifier;
  14. /**
  15. * The AjcMemberMaker is responsible for creating the representations of methods/fields/etc that are placed in both aspects and
  16. * affected target types. It uses the NameMangler class to create the actual names that will be used.
  17. */
  18. public class AjcMemberMaker {
  19. private static final int PUBLIC_STATIC_FINAL = Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL;
  20. private static final int PRIVATE_STATIC = Modifier.PRIVATE | Modifier.STATIC;
  21. private static final int PUBLIC_STATIC = Modifier.PUBLIC | Modifier.STATIC;
  22. private static final int BRIDGE = 0x0040;
  23. private static final int VISIBILITY = Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED;
  24. public static final UnresolvedType CFLOW_STACK_TYPE = UnresolvedType.forName(NameMangler.CFLOW_STACK_TYPE);
  25. public static final UnresolvedType AROUND_CLOSURE_TYPE = UnresolvedType
  26. .forSignature("Lorg/aspectj/runtime/internal/AroundClosure;");
  27. public static final UnresolvedType CONVERSIONS_TYPE = UnresolvedType.forSignature("Lorg/aspectj/runtime/internal/Conversions;");
  28. public static final UnresolvedType NO_ASPECT_BOUND_EXCEPTION = UnresolvedType
  29. .forSignature("Lorg/aspectj/lang/NoAspectBoundException;");
  30. public static ResolvedMember ajcPreClinitMethod(UnresolvedType declaringType) {
  31. return new ResolvedMemberImpl(Member.METHOD, declaringType, PRIVATE_STATIC, NameMangler.AJC_PRE_CLINIT_NAME, "()V");
  32. }
  33. public static ResolvedMember ajcPostClinitMethod(UnresolvedType declaringType) {
  34. return new ResolvedMemberImpl(Member.METHOD, declaringType, PRIVATE_STATIC, NameMangler.AJC_POST_CLINIT_NAME, "()V");
  35. }
  36. public static Member noAspectBoundExceptionInit() {
  37. return new ResolvedMemberImpl(Member.METHOD, NO_ASPECT_BOUND_EXCEPTION, Modifier.PUBLIC, "<init>", "()V");
  38. }
  39. public static Member noAspectBoundExceptionInit2() {
  40. return new ResolvedMemberImpl(Member.METHOD, NO_ASPECT_BOUND_EXCEPTION, Modifier.PUBLIC, "<init>",
  41. "(Ljava/lang/String;Ljava/lang/Throwable;)V");
  42. }
  43. public static Member noAspectBoundExceptionInitWithCause() {
  44. return new ResolvedMemberImpl(Member.METHOD, NO_ASPECT_BOUND_EXCEPTION, Modifier.PUBLIC, "<init>",
  45. "(Ljava/lang/String;Ljava/lang/Throwable;)V");
  46. }
  47. public static ResolvedMember perCflowPush(UnresolvedType declaringType) {
  48. return new ResolvedMemberImpl(Member.METHOD, declaringType, PUBLIC_STATIC, NameMangler.PERCFLOW_PUSH_METHOD, "()V");
  49. }
  50. public static ResolvedMember perCflowField(UnresolvedType declaringType) {
  51. return new ResolvedMemberImpl(Member.FIELD, declaringType, PUBLIC_STATIC, NameMangler.PERCFLOW_FIELD_NAME,
  52. CFLOW_STACK_TYPE.getSignature());
  53. }
  54. public static ResolvedMember perSingletonField(UnresolvedType declaringType) {
  55. return new ResolvedMemberImpl(Member.FIELD, declaringType, PUBLIC_STATIC, NameMangler.PERSINGLETON_FIELD_NAME,
  56. declaringType.getSignature());
  57. }
  58. public static ResolvedMember initFailureCauseField(UnresolvedType declaringType) {
  59. return new ResolvedMemberImpl(Member.FIELD, declaringType, PRIVATE_STATIC, NameMangler.INITFAILURECAUSE_FIELD_NAME,
  60. UnresolvedType.THROWABLE.getSignature());
  61. }
  62. public static ResolvedMember perObjectField(UnresolvedType declaringType, ResolvedType aspectType) {
  63. int modifiers = Modifier.PRIVATE;
  64. if (!UnresolvedType.SERIALIZABLE.resolve(aspectType.getWorld()).isAssignableFrom(aspectType)) {
  65. modifiers |= Modifier.TRANSIENT;
  66. }
  67. return new ResolvedMemberImpl(Member.FIELD, declaringType, modifiers, aspectType,
  68. NameMangler.perObjectInterfaceField(aspectType), UnresolvedType.NONE);
  69. }
  70. // PTWIMPL ResolvedMember for aspect instance field, declared in matched type
  71. public static ResolvedMember perTypeWithinField(UnresolvedType declaringType, ResolvedType aspectType) {
  72. int modifiers = Modifier.PRIVATE | Modifier.STATIC;
  73. if (!isSerializableAspect(aspectType)) {
  74. modifiers |= Modifier.TRANSIENT;
  75. }
  76. return new ResolvedMemberImpl(Member.FIELD, declaringType, modifiers, aspectType,
  77. NameMangler.perTypeWithinFieldForTarget(aspectType), UnresolvedType.NONE);
  78. }
  79. // PTWIMPL ResolvedMember for type instance field, declared in aspect
  80. // (holds typename for which aspect instance exists)
  81. public static ResolvedMember perTypeWithinWithinTypeField(UnresolvedType declaringType, ResolvedType aspectType) {
  82. int modifiers = Modifier.PRIVATE;
  83. if (!isSerializableAspect(aspectType)) {
  84. modifiers |= Modifier.TRANSIENT;
  85. }
  86. return new ResolvedMemberImpl(Member.FIELD, declaringType, modifiers, UnresolvedType.JL_STRING,
  87. NameMangler.PERTYPEWITHIN_WITHINTYPEFIELD, UnresolvedType.NONE);
  88. }
  89. private static boolean isSerializableAspect(ResolvedType aspectType) {
  90. return UnresolvedType.SERIALIZABLE.resolve(aspectType.getWorld()).isAssignableFrom(aspectType);
  91. }
  92. public static ResolvedMember perObjectBind(UnresolvedType declaringType) {
  93. return new ResolvedMemberImpl(Member.METHOD, declaringType, PUBLIC_STATIC | Modifier.SYNCHRONIZED, NameMangler.PEROBJECT_BIND_METHOD,
  94. "(Ljava/lang/Object;)V");
  95. }
  96. // PTWIMPL ResolvedMember for getInstance() method, declared in aspect
  97. public static ResolvedMember perTypeWithinGetInstance(UnresolvedType declaringType) {
  98. // private static a.X ajc$getInstance(java.lang.Class)
  99. ResolvedMemberImpl rm = new ResolvedMemberImpl(Member.METHOD, declaringType, PRIVATE_STATIC, declaringType, // return value
  100. NameMangler.PERTYPEWITHIN_GETINSTANCE_METHOD, new UnresolvedType[] { UnresolvedType.JL_CLASS });
  101. return rm;
  102. }
  103. // PTWIMPL ResolvedMember for getWithinTypeName() method
  104. public static ResolvedMember perTypeWithinGetWithinTypeNameMethod(UnresolvedType declaringType, boolean inJava5Mode) {
  105. // public String getWithinTypeName()
  106. ResolvedMemberImpl rm = new ResolvedMemberImpl(Member.METHOD, declaringType, Modifier.PUBLIC, UnresolvedType.JL_STRING, // return
  107. // value
  108. NameMangler.PERTYPEWITHIN_GETWITHINTYPENAME_METHOD, UnresolvedType.NONE);
  109. return rm;
  110. }
  111. public static ResolvedMember perTypeWithinCreateAspectInstance(UnresolvedType declaringType) {
  112. // public static a.X ajc$createAspectInstance(java.lang.String)
  113. ResolvedMemberImpl rm = new ResolvedMemberImpl(Member.METHOD, declaringType, PUBLIC_STATIC, declaringType, // return value
  114. NameMangler.PERTYPEWITHIN_CREATEASPECTINSTANCE_METHOD,
  115. new UnresolvedType[] { UnresolvedType.forSignature("Ljava/lang/String;") }, new UnresolvedType[] {});
  116. return rm;
  117. }
  118. public static UnresolvedType perObjectInterfaceType(UnresolvedType aspectType) {
  119. return UnresolvedType.forName(aspectType.getName() + "$ajcMightHaveAspect");
  120. }
  121. public static ResolvedMember perObjectInterfaceGet(UnresolvedType aspectType) {
  122. return new ResolvedMemberImpl(Member.METHOD, perObjectInterfaceType(aspectType), Modifier.PUBLIC | Modifier.ABSTRACT,
  123. NameMangler.perObjectInterfaceGet(aspectType), "()" + aspectType.getSignature());
  124. }
  125. public static ResolvedMember perObjectInterfaceSet(UnresolvedType aspectType) {
  126. return new ResolvedMemberImpl(Member.METHOD, perObjectInterfaceType(aspectType), Modifier.PUBLIC | Modifier.ABSTRACT,
  127. NameMangler.perObjectInterfaceSet(aspectType), "(" + aspectType.getSignature() + ")V");
  128. }
  129. // PTWIMPL ResolvedMember for localAspectOf() method, declared in matched type
  130. public static ResolvedMember perTypeWithinLocalAspectOf(UnresolvedType shadowType, UnresolvedType aspectType) {
  131. return new ResolvedMemberImpl(Member.METHOD, shadowType,// perTypeWithinInterfaceType(aspectType),
  132. Modifier.PUBLIC | Modifier.STATIC, NameMangler.perTypeWithinLocalAspectOf(aspectType), "()"
  133. + aspectType.getSignature());
  134. }
  135. public static ResolvedMember perSingletonAspectOfMethod(UnresolvedType declaringType) {
  136. return new ResolvedMemberImpl(Member.METHOD, declaringType, PUBLIC_STATIC, "aspectOf", "()" + declaringType.getSignature());
  137. }
  138. public static ResolvedMember perSingletonHasAspectMethod(UnresolvedType declaringType) {
  139. return new ResolvedMemberImpl(Member.METHOD, declaringType, PUBLIC_STATIC, "hasAspect", "()Z");
  140. }
  141. public static ResolvedMember perCflowAspectOfMethod(UnresolvedType declaringType) {
  142. return perSingletonAspectOfMethod(declaringType);
  143. }
  144. public static ResolvedMember perCflowHasAspectMethod(UnresolvedType declaringType) {
  145. return perSingletonHasAspectMethod(declaringType);
  146. }
  147. public static ResolvedMember perObjectAspectOfMethod(UnresolvedType declaringType) {
  148. return new ResolvedMemberImpl(Member.METHOD, declaringType, PUBLIC_STATIC, "aspectOf", "(Ljava/lang/Object;)"
  149. + declaringType.getSignature());
  150. }
  151. public static ResolvedMember perObjectHasAspectMethod(UnresolvedType declaringType) {
  152. return new ResolvedMemberImpl(Member.METHOD, declaringType, PUBLIC_STATIC, "hasAspect", "(Ljava/lang/Object;)Z");
  153. }
  154. // PTWIMPL ResolvedMember for aspectOf(), declared in aspect
  155. public static ResolvedMember perTypeWithinAspectOfMethod(UnresolvedType declaringType, boolean inJava5Mode) {
  156. UnresolvedType parameterType = null;
  157. if (inJava5Mode) {
  158. parameterType = UnresolvedType.forRawTypeName("java.lang.Class");
  159. } else {
  160. parameterType = UnresolvedType.forSignature("Ljava/lang/Class;");
  161. }
  162. return new ResolvedMemberImpl(Member.METHOD, declaringType, PUBLIC_STATIC, declaringType, "aspectOf",
  163. new UnresolvedType[] { parameterType });
  164. // return new ResolvedMemberImpl(Member.METHOD,
  165. // declaringType, PUBLIC_STATIC, "aspectOf",
  166. // "(Ljava/lang/Class;)" + declaringType.getSignature());
  167. }
  168. /*
  169. * public static ResolvedMember perTypeWithinGetWithinTypeMethod(UnresolvedType declaringType, boolean inJava5Mode) {
  170. * UnresolvedType returnType = null; if (inJava5Mode) { returnType = UnresolvedType.forRawTypeName("java.lang.Class"); } else {
  171. * returnType = UnresolvedType.forSignature("Ljava/lang/Class;"); } return new
  172. * ResolvedMemberImpl(Member.METHOD,declaringType,Modifier.PUBLIC,ResolvedType.JAVA_LANG_STRING,"getWithinType",new
  173. * UnresolvedType[]{}); }
  174. */
  175. // PTWIMPL ResolvedMember for hasAspect(), declared in aspect
  176. public static ResolvedMember perTypeWithinHasAspectMethod(UnresolvedType declaringType, boolean inJava5Mode) {
  177. UnresolvedType parameterType = null;
  178. if (inJava5Mode) {
  179. parameterType = UnresolvedType.forRawTypeName("java.lang.Class");
  180. } else {
  181. parameterType = UnresolvedType.forSignature("Ljava/lang/Class;");
  182. }
  183. return new ResolvedMemberImpl(Member.METHOD, declaringType, PUBLIC_STATIC, UnresolvedType.BOOLEAN, "hasAspect",
  184. new UnresolvedType[] { parameterType });
  185. // return new ResolvedMemberImpl(Member.METHOD,
  186. // declaringType, PUBLIC_STATIC, "hasAspect",
  187. // "(Ljava/lang/Class;)Z");
  188. }
  189. // -- privileged accessors
  190. public static ResolvedMember privilegedAccessMethodForMethod(UnresolvedType aspectType, ResolvedMember method) {
  191. return new ResolvedMemberImpl(Member.METHOD, method.getDeclaringType(), Modifier.PUBLIC
  192. | (Modifier.isStatic(method.getModifiers()) ? Modifier.STATIC : 0), method.getReturnType(),
  193. NameMangler.privilegedAccessMethodForMethod(method.getName(), method.getDeclaringType(), aspectType),
  194. method.getParameterTypes(), method.getExceptions());
  195. }
  196. /**
  197. * Return a resolvedmember representing the synthetic getter for the field. The old style (&lt;1.6.9) is a heavyweight static
  198. * method with a long name. The new style (1.6.9 and later) is short, and reusable across aspects.
  199. *
  200. * @param aspectType the aspect attempting the access
  201. * @param field the field to be accessed
  202. * @param shortSyntax is the old (long) or new (short) style format being used
  203. * @return a resolvedmember representing the synthetic getter
  204. */
  205. public static ResolvedMember privilegedAccessMethodForFieldGet(UnresolvedType aspectType, Member field, boolean shortSyntax) {
  206. UnresolvedType fieldDeclaringType = field.getDeclaringType();
  207. if (shortSyntax) {
  208. UnresolvedType[] args = null;
  209. if (Modifier.isStatic(field.getModifiers())) {
  210. args = ResolvedType.NONE;
  211. } else {
  212. args = new UnresolvedType[] { fieldDeclaringType };
  213. }
  214. StringBuilder name = new StringBuilder("ajc$get$");
  215. name.append(field.getName());
  216. return new ResolvedMemberImpl(Member.METHOD, fieldDeclaringType, PUBLIC_STATIC, field.getReturnType(), name.toString(),
  217. args);
  218. } else {
  219. String getterName = NameMangler.privilegedAccessMethodForFieldGet(field.getName(), fieldDeclaringType, aspectType);
  220. String sig;
  221. if (Modifier.isStatic(field.getModifiers())) {
  222. sig = "()" + field.getReturnType().getSignature();
  223. } else {
  224. sig = "(" + fieldDeclaringType.getSignature() + ")" + field.getReturnType().getSignature();
  225. }
  226. return new ResolvedMemberImpl(Member.METHOD, fieldDeclaringType, PUBLIC_STATIC, getterName, sig);
  227. }
  228. }
  229. /**
  230. * Return a resolvedmember representing the synthetic setter for the field. The old style (&lt;1.6.9) is a heavyweight static
  231. * method with a long name. The new style (1.6.9 and later) is short, not always static, and reusable across aspects.
  232. *
  233. * @param aspectType the aspect attempting the access
  234. * @param field the field to be accessed
  235. * @param shortSyntax is the old or new style format being used
  236. * @return a resolvedmember representing the synthetic setter
  237. */
  238. public static ResolvedMember privilegedAccessMethodForFieldSet(UnresolvedType aspectType, Member field, boolean shortSyntax) {
  239. UnresolvedType fieldDeclaringType = field.getDeclaringType();
  240. if (shortSyntax) {
  241. UnresolvedType[] args = null;
  242. if (Modifier.isStatic(field.getModifiers())) {
  243. args = new UnresolvedType[] { field.getType() };
  244. } else {
  245. args = new UnresolvedType[] { fieldDeclaringType, field.getType() };
  246. }
  247. StringBuilder name = new StringBuilder("ajc$set$");
  248. name.append(field.getName());
  249. return new ResolvedMemberImpl(Member.METHOD, fieldDeclaringType, PUBLIC_STATIC, UnresolvedType.VOID, name.toString(),
  250. args);
  251. } else {
  252. String setterName = NameMangler.privilegedAccessMethodForFieldSet(field.getName(), fieldDeclaringType, aspectType);
  253. String sig;
  254. if (Modifier.isStatic(field.getModifiers())) {
  255. sig = "(" + field.getReturnType().getSignature() + ")V";
  256. } else {
  257. sig = "(" + fieldDeclaringType.getSignature() + field.getReturnType().getSignature() + ")V";
  258. }
  259. return new ResolvedMemberImpl(Member.METHOD, fieldDeclaringType, PUBLIC_STATIC, setterName, sig);
  260. }
  261. }
  262. // --- inline accessors
  263. // ??? can eclipse handle a transform this weird without putting synthetics into the mix
  264. public static ResolvedMember superAccessMethod(UnresolvedType baseType, ResolvedMember method) {
  265. UnresolvedType[] paramTypes = method.getParameterTypes();
  266. // if (!method.isStatic()) {
  267. // paramTypes = UnresolvedType.insert(method.getDeclaringType(), paramTypes);
  268. // }
  269. return new ResolvedMemberImpl(Member.METHOD, baseType, Modifier.PUBLIC, method.getReturnType(),
  270. NameMangler.superDispatchMethod(baseType, method.getName()), paramTypes, method.getExceptions());
  271. }
  272. public static ResolvedMember inlineAccessMethodForMethod(UnresolvedType aspectType, ResolvedMember method) {
  273. UnresolvedType[] paramTypes = method.getParameterTypes();
  274. if (!Modifier.isStatic(method.getModifiers())) {
  275. paramTypes = UnresolvedType.insert(method.getDeclaringType(), paramTypes);
  276. }
  277. return new ResolvedMemberImpl(Member.METHOD, aspectType,
  278. PUBLIC_STATIC, // ??? what about privileged and super access
  279. // ???Modifier.PUBLIC | (method.isStatic() ? Modifier.STATIC : 0),
  280. method.getReturnType(),
  281. NameMangler.inlineAccessMethodForMethod(method.getName(), method.getDeclaringType(), aspectType), paramTypes,
  282. method.getExceptions());
  283. }
  284. public static ResolvedMember inlineAccessMethodForFieldGet(UnresolvedType aspectType, Member field) {
  285. String sig;
  286. if (Modifier.isStatic(field.getModifiers())) {
  287. sig = "()" + field.getReturnType().getSignature();
  288. } else {
  289. sig = "(" + field.getDeclaringType().getSignature() + ")" + field.getReturnType().getSignature();
  290. }
  291. return new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC, // Modifier.PUBLIC | (field.isStatic() ?
  292. // Modifier.STATIC : 0),
  293. NameMangler.inlineAccessMethodForFieldGet(field.getName(), field.getDeclaringType(), aspectType), sig);
  294. }
  295. public static ResolvedMember inlineAccessMethodForFieldSet(UnresolvedType aspectType, Member field) {
  296. String sig;
  297. if (Modifier.isStatic(field.getModifiers())) {
  298. sig = "(" + field.getReturnType().getSignature() + ")V";
  299. } else {
  300. sig = "(" + field.getDeclaringType().getSignature() + field.getReturnType().getSignature() + ")V";
  301. }
  302. return new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC, // Modifier.PUBLIC | (field.isStatic() ?
  303. // Modifier.STATIC : 0),
  304. NameMangler.inlineAccessMethodForFieldSet(field.getName(), field.getDeclaringType(), aspectType), sig);
  305. }
  306. // --- runtimeLibrary api stuff
  307. public static Member cflowStackPeekInstance() {
  308. return new MemberImpl(Member.METHOD, CFLOW_STACK_TYPE, 0, "peekInstance", "()Ljava/lang/Object;");
  309. }
  310. public static Member cflowStackPushInstance() {
  311. return new MemberImpl(Member.METHOD, CFLOW_STACK_TYPE, 0, "pushInstance", "(Ljava/lang/Object;)V");
  312. }
  313. public static Member cflowStackIsValid() {
  314. return new MemberImpl(Member.METHOD, CFLOW_STACK_TYPE, 0, "isValid", "()Z");
  315. }
  316. public static Member cflowStackInit() {
  317. return new MemberImpl(Member.CONSTRUCTOR, CFLOW_STACK_TYPE, 0, "<init>", "()V");
  318. }
  319. public static Member aroundClosurePreInitializationField() {
  320. return new MemberImpl(Member.FIELD, AROUND_CLOSURE_TYPE, 0, "preInitializationState", "[Ljava/lang/Object;");
  321. }
  322. public static Member aroundClosurePreInitializationGetter() {
  323. return new MemberImpl(Member.METHOD, AROUND_CLOSURE_TYPE, 0, "getPreInitializationState", "()[Ljava/lang/Object;");
  324. }
  325. public static ResolvedMember preIntroducedConstructor(UnresolvedType aspectType, UnresolvedType targetType,
  326. UnresolvedType[] paramTypes) {
  327. return new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC_FINAL, UnresolvedType.OBJECTARRAY,
  328. NameMangler.preIntroducedConstructor(aspectType, targetType), paramTypes);
  329. }
  330. public static ResolvedMember postIntroducedConstructor(UnresolvedType aspectType, UnresolvedType targetType,
  331. UnresolvedType[] paramTypes) {
  332. return new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC_FINAL, UnresolvedType.VOID,
  333. NameMangler.postIntroducedConstructor(aspectType, targetType), UnresolvedType.insert(targetType, paramTypes));
  334. }
  335. public static ResolvedMember itdAtDeclareParentsField(ResolvedType targetType, UnresolvedType itdType, UnresolvedType aspectType) {
  336. return new ResolvedMemberImpl(Member.FIELD, targetType, Modifier.PRIVATE, itdType, NameMangler.itdAtDeclareParentsField(
  337. aspectType, itdType), ResolvedType.NONE);
  338. }
  339. public static ResolvedMember interConstructor(ResolvedType targetType, ResolvedMember constructor, UnresolvedType aspectType) {
  340. //
  341. // ResolvedType targetType,
  342. // UnresolvedType[] argTypes,
  343. // int modifiers)
  344. // {
  345. ResolvedMember ret = new ResolvedMemberImpl(Member.CONSTRUCTOR, targetType, Modifier.PUBLIC, UnresolvedType.VOID, "<init>",
  346. constructor.getParameterTypes(), constructor.getExceptions());
  347. // System.out.println("ret: " + ret + " mods: " + Modifier.toString(modifiers));
  348. if (Modifier.isPublic(constructor.getModifiers())) {
  349. return ret;
  350. }
  351. while (true) {
  352. ret = addCookieTo(ret, aspectType);
  353. if (targetType.lookupMemberNoSupers(ret) == null) {
  354. return ret;
  355. }
  356. }
  357. }
  358. public static ResolvedMember interFieldInitializer(ResolvedMember field, UnresolvedType aspectType) {
  359. return new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC, NameMangler.interFieldInitializer(aspectType,
  360. field.getDeclaringType(), field.getName()), Modifier.isStatic(field.getModifiers()) ? "()V" : "("
  361. + field.getDeclaringType().getSignature() + ")V");
  362. }
  363. private static int makePublicNonFinal(int modifiers) {
  364. return (modifiers & ~VISIBILITY & ~Modifier.FINAL) | Modifier.PUBLIC;
  365. }
  366. private static int makeNonFinal(int modifiers) {
  367. return (modifiers & ~Modifier.FINAL);
  368. }
  369. /**
  370. * This static method goes on the aspect that declares the inter-type field
  371. */
  372. public static ResolvedMember interFieldSetDispatcher(ResolvedMember field, UnresolvedType aspectType) {
  373. ResolvedMember rm = new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC, UnresolvedType.VOID,
  374. NameMangler.interFieldSetDispatcher(aspectType, field.getDeclaringType(), field.getName()), Modifier.isStatic(field
  375. .getModifiers()) ? new UnresolvedType[] { field.getReturnType() } : new UnresolvedType[] {
  376. field.getDeclaringType(), field.getReturnType() });
  377. rm.setTypeVariables(field.getTypeVariables());
  378. return rm;
  379. }
  380. /**
  381. * This static method goes on the aspect that declares the inter-type field
  382. */
  383. public static ResolvedMember interFieldGetDispatcher(ResolvedMember field, UnresolvedType aspectType) {
  384. ResolvedMember rm = new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC, field.getReturnType(),
  385. NameMangler.interFieldGetDispatcher(aspectType, field.getDeclaringType(), field.getName()), Modifier.isStatic(field
  386. .getModifiers()) ? UnresolvedType.NONE : new UnresolvedType[] { field.getDeclaringType() },
  387. UnresolvedType.NONE);
  388. rm.setTypeVariables(field.getTypeVariables());
  389. return rm;
  390. }
  391. // private static int makeFieldModifiers(int declaredModifiers) {
  392. // int ret = Modifier.PUBLIC;
  393. // if (Modifier.isTransient(declaredModifiers)) ret |= Modifier.TRANSIENT;
  394. // if (Modifier.isVolatile(declaredModifiers)) ret |= Modifier.VOLATILE;
  395. // return ret;
  396. // }
  397. /**
  398. * This field goes on the class the field is declared onto. Field names for ITDs onto interfaces are handled below.
  399. */
  400. public static ResolvedMember interFieldClassField(ResolvedMember field, UnresolvedType aspectType, boolean newStyle) {
  401. int modifiers = (newStyle ? makeNonFinal(field.getModifiers()) : makePublicNonFinal(field.getModifiers()));
  402. String name = null;
  403. if (newStyle) {
  404. name = field.getName();
  405. } else {
  406. name = NameMangler.interFieldClassField(field.getModifiers(), aspectType, field.getDeclaringType(), field.getName());
  407. }
  408. return new ResolvedMemberImpl(Member.FIELD, field.getDeclaringType(), modifiers, field.getReturnType(), name,
  409. UnresolvedType.NONE, UnresolvedType.NONE);
  410. }
  411. /**
  412. * This field goes on top-most implementers of the interface the field is declared onto
  413. */
  414. public static ResolvedMember interFieldInterfaceField(ResolvedMember field, UnresolvedType onClass, UnresolvedType aspectType, boolean newStyle) {
  415. String name = null;
  416. if (newStyle) {
  417. name = field.getName();
  418. } else {
  419. name = NameMangler.interFieldInterfaceField(aspectType, field.getDeclaringType(), field.getName());
  420. }
  421. return new ResolvedMemberImpl(Member.FIELD, onClass, makePublicNonFinal(field.getModifiers()), field.getReturnType(),
  422. name, UnresolvedType.NONE, UnresolvedType.NONE);
  423. }
  424. /**
  425. * This instance method goes on the interface the field is declared onto as well as its top-most implementors
  426. */
  427. public static ResolvedMember interFieldInterfaceSetter(ResolvedMember field, ResolvedType onType, UnresolvedType aspectType) {
  428. int modifiers = Modifier.PUBLIC;
  429. if (onType.isInterface()) {
  430. modifiers |= Modifier.ABSTRACT;
  431. }
  432. ResolvedMember rm = new ResolvedMemberImpl(Member.METHOD, onType, modifiers, UnresolvedType.VOID,
  433. NameMangler.interFieldInterfaceSetter(aspectType, field.getDeclaringType(), field.getName()),
  434. new UnresolvedType[] { field.getReturnType() }, UnresolvedType.NONE);
  435. rm.setTypeVariables(field.getTypeVariables());
  436. return rm;
  437. }
  438. /**
  439. * This instance method goes on the interface the field is declared onto as well as its top-most implementors
  440. */
  441. public static ResolvedMember interFieldInterfaceGetter(ResolvedMember field, ResolvedType onType, UnresolvedType aspectType) {
  442. int modifiers = Modifier.PUBLIC;
  443. if (onType.isInterface()) {
  444. modifiers |= Modifier.ABSTRACT;
  445. }
  446. ResolvedMember rm = new ResolvedMemberImpl(Member.METHOD, onType, modifiers, field.getReturnType(),
  447. NameMangler.interFieldInterfaceGetter(aspectType, field.getDeclaringType(), field.getName()), UnresolvedType.NONE,
  448. UnresolvedType.NONE);
  449. rm.setTypeVariables(field.getTypeVariables());
  450. return rm;
  451. }
  452. /**
  453. * This method goes on the target type of the inter-type method. (and possibly the topmost-implementors, if the target type is
  454. * an interface). The implementation will call the interMethodDispatch method on the aspect.
  455. */
  456. public static ResolvedMember interMethod(ResolvedMember meth, UnresolvedType aspectType, boolean onInterface) {
  457. if (Modifier.isPublic(meth.getModifiers()) && !onInterface) {
  458. return meth;
  459. }
  460. int modifiers = makePublicNonFinal(meth.getModifiers());
  461. if (onInterface) {
  462. modifiers |= Modifier.ABSTRACT;
  463. }
  464. ResolvedMemberImpl rmi = new ResolvedMemberImpl(Member.METHOD, meth.getDeclaringType(), modifiers, meth.getReturnType(),
  465. NameMangler.interMethod(meth.getModifiers(), aspectType, meth.getDeclaringType(), meth.getName()),
  466. meth.getParameterTypes(), meth.getExceptions());
  467. rmi.setParameterNames(meth.getParameterNames());
  468. rmi.setTypeVariables(meth.getTypeVariables());
  469. return rmi;
  470. }
  471. /**
  472. * This method goes on the target type of the inter-type method. (and possibly the topmost-implementors, if the target type is
  473. * an interface). The implementation will call the interMethodDispatch method on the aspect.
  474. */
  475. public static ResolvedMember interMethodBridger(ResolvedMember meth, UnresolvedType aspectType, boolean onInterface) {
  476. // if (Modifier.isPublic(meth.getModifiers()) && !onInterface)
  477. // return meth;
  478. int modifiers = makePublicNonFinal(meth.getModifiers()) | BRIDGE;
  479. if (onInterface) {
  480. modifiers |= Modifier.ABSTRACT;
  481. }
  482. ResolvedMemberImpl rmi = new ResolvedMemberImpl(Member.METHOD, meth.getDeclaringType(), modifiers, meth.getReturnType(),
  483. NameMangler.interMethod(meth.getModifiers(), aspectType, meth.getDeclaringType(), meth.getName()),
  484. meth.getParameterTypes(), meth.getExceptions());
  485. rmi.setTypeVariables(meth.getTypeVariables());
  486. return rmi;
  487. }
  488. /**
  489. * Sometimes the intertyped method requires a bridge method alongside it. For example if the method 'N SomeI&lt;N&gt;.m()' is put onto
  490. * an interface 'interface I&lt;N extends Number&gt;' and then a concrete implementation is 'class C implements I&lt;Float&gt;' then the ITD
  491. * on the interface will be 'Number m()', whereas the ITD on the 'topmostimplementor' will be 'Float m()'. A bridge method needs
  492. * to be created in the topmostimplementor 'Number m()' that delegates to 'Float m()'
  493. */
  494. public static ResolvedMember bridgerToInterMethod(ResolvedMember meth, UnresolvedType aspectType) {
  495. int modifiers = makePublicNonFinal(meth.getModifiers());
  496. ResolvedMemberImpl rmi = new ResolvedMemberImpl(Member.METHOD, aspectType, modifiers, meth.getReturnType(),
  497. NameMangler.interMethod(meth.getModifiers(), aspectType, meth.getDeclaringType(), meth.getName()),
  498. meth.getParameterTypes(), meth.getExceptions());
  499. rmi.setTypeVariables(meth.getTypeVariables());
  500. return rmi;
  501. }
  502. /**
  503. * This static method goes on the declaring aspect of the inter-type method. The implementation calls the interMethodBody()
  504. * method on the aspect.
  505. */
  506. public static ResolvedMember interMethodDispatcher(ResolvedMember meth, UnresolvedType aspectType) {
  507. UnresolvedType[] paramTypes = meth.getParameterTypes();
  508. if (!Modifier.isStatic(meth.getModifiers())) {
  509. paramTypes = UnresolvedType.insert(meth.getDeclaringType(), paramTypes);
  510. }
  511. ResolvedMemberImpl rmi = new ResolvedMemberImpl(Member.METHOD, aspectType, PUBLIC_STATIC, meth.getReturnType(),
  512. NameMangler.interMethodDispatcher(aspectType, meth.getDeclaringType(), meth.getName()), paramTypes,
  513. meth.getExceptions());
  514. rmi.setParameterNames(meth.getParameterNames());
  515. rmi.setTypeVariables(meth.getTypeVariables());
  516. return rmi;
  517. }
  518. /**
  519. * This method goes on the declaring aspect of the inter-type method. It contains the real body of the ITD method.
  520. */
  521. public static ResolvedMember interMethodBody(ResolvedMember meth, UnresolvedType aspectType) {
  522. UnresolvedType[] paramTypes = meth.getParameterTypes();
  523. if (!Modifier.isStatic(meth.getModifiers())) {
  524. paramTypes = UnresolvedType.insert(meth.getDeclaringType(), paramTypes);
  525. }
  526. int modifiers = PUBLIC_STATIC;
  527. if (Modifier.isStrict(meth.getModifiers())) {
  528. modifiers |= Modifier.STRICT;
  529. }
  530. ResolvedMemberImpl rmi = new ResolvedMemberImpl(Member.METHOD, aspectType, modifiers, meth.getReturnType(),
  531. NameMangler.interMethodBody(aspectType, meth.getDeclaringType(), meth.getName()), paramTypes, meth.getExceptions());
  532. rmi.setParameterNames(meth.getParameterNames());
  533. rmi.setTypeVariables(meth.getTypeVariables());
  534. return rmi;
  535. }
  536. private static ResolvedMember addCookieTo(ResolvedMember ret, UnresolvedType aspectType) {
  537. UnresolvedType[] params = ret.getParameterTypes();
  538. UnresolvedType[] freshParams = UnresolvedType.add(params, aspectType);
  539. return new ResolvedMemberImpl(ret.getKind(), ret.getDeclaringType(), ret.getModifiers(), ret.getReturnType(),
  540. ret.getName(), freshParams, ret.getExceptions());
  541. }
  542. public static ResolvedMember toObjectConversionMethod(UnresolvedType fromType) {
  543. if (fromType.isPrimitiveType()) {
  544. String name = fromType.toString() + "Object";
  545. return new ResolvedMemberImpl(Member.METHOD, CONVERSIONS_TYPE, PUBLIC_STATIC, UnresolvedType.OBJECT, name,
  546. new UnresolvedType[] { fromType }, UnresolvedType.NONE);
  547. } else {
  548. return null;
  549. }
  550. }
  551. public static Member interfaceConstructor(ResolvedType resolvedTypeX) {
  552. // AMC next two lines should not be needed when sig for generic type is changed
  553. ResolvedType declaringType = resolvedTypeX;
  554. if (declaringType.isRawType()) {
  555. declaringType = declaringType.getGenericType();
  556. }
  557. return new ResolvedMemberImpl(Member.CONSTRUCTOR, declaringType, Modifier.PUBLIC, "<init>", "()V");
  558. }
  559. // -- common types we use. Note: Java 5 dependand types are refered to as String
  560. public final static UnresolvedType ASPECT_ANNOTATION = UnresolvedType.forSignature("Lorg/aspectj/lang/annotation/Aspect;");
  561. public final static UnresolvedType BEFORE_ANNOTATION = UnresolvedType.forSignature("Lorg/aspectj/lang/annotation/Before;");
  562. public final static UnresolvedType AROUND_ANNOTATION = UnresolvedType.forSignature("Lorg/aspectj/lang/annotation/Around;");
  563. public final static UnresolvedType AFTERRETURNING_ANNOTATION = UnresolvedType
  564. .forSignature("Lorg/aspectj/lang/annotation/AfterReturning;");
  565. public final static UnresolvedType AFTERTHROWING_ANNOTATION = UnresolvedType
  566. .forSignature("Lorg/aspectj/lang/annotation/AfterThrowing;");
  567. public final static UnresolvedType AFTER_ANNOTATION = UnresolvedType.forSignature("Lorg/aspectj/lang/annotation/After;");
  568. public final static UnresolvedType POINTCUT_ANNOTATION = UnresolvedType.forSignature("Lorg/aspectj/lang/annotation/Pointcut;");
  569. public final static UnresolvedType DECLAREERROR_ANNOTATION = UnresolvedType
  570. .forSignature("Lorg/aspectj/lang/annotation/DeclareError;");
  571. public final static UnresolvedType DECLAREWARNING_ANNOTATION = UnresolvedType
  572. .forSignature("Lorg/aspectj/lang/annotation/DeclareWarning;");
  573. public final static UnresolvedType DECLAREPRECEDENCE_ANNOTATION = UnresolvedType
  574. .forSignature("Lorg/aspectj/lang/annotation/DeclarePrecedence;");
  575. // public final static UnresolvedType DECLAREIMPLEMENTS_ANNOTATION =
  576. // UnresolvedType.forSignature("Lorg/aspectj/lang/annotation/DeclareImplements;");
  577. public final static UnresolvedType DECLAREPARENTS_ANNOTATION = UnresolvedType
  578. .forSignature("Lorg/aspectj/lang/annotation/DeclareParents;");
  579. public final static UnresolvedType DECLAREMIXIN_ANNOTATION = UnresolvedType
  580. .forSignature("Lorg/aspectj/lang/annotation/DeclareMixin;");
  581. public final static UnresolvedType TYPEX_JOINPOINT = UnresolvedType.forSignature("Lorg/aspectj/lang/JoinPoint;");
  582. public final static UnresolvedType TYPEX_PROCEEDINGJOINPOINT = UnresolvedType
  583. .forSignature("Lorg/aspectj/lang/ProceedingJoinPoint;");
  584. public final static UnresolvedType TYPEX_STATICJOINPOINT = UnresolvedType
  585. .forSignature("Lorg/aspectj/lang/JoinPoint$StaticPart;");
  586. public final static UnresolvedType TYPEX_ENCLOSINGSTATICJOINPOINT = UnresolvedType
  587. .forSignature("Lorg/aspectj/lang/JoinPoint$EnclosingStaticPart;");
  588. }