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 28KB

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