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

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. }