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

21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
18 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
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. }