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.

MemberImpl.java 27KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799
  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 v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver;
  13. import java.lang.reflect.Modifier;
  14. import java.util.ArrayList;
  15. import java.util.Collection;
  16. import java.util.HashSet;
  17. import java.util.Iterator;
  18. import java.util.List;
  19. public class MemberImpl implements Comparable, Member {
  20. protected MemberKind kind;
  21. protected String name;
  22. protected UnresolvedType declaringType;
  23. protected int modifiers;
  24. protected UnresolvedType returnType;
  25. protected UnresolvedType[] parameterTypes;
  26. private final String signature;
  27. private String paramSignature;
  28. // OPTIMIZE move out of the member!
  29. private boolean reportedCantFindDeclaringType = false;
  30. private boolean reportedUnresolvableMember = false;
  31. public AnnotationX[] getAnnotations() {
  32. throw new IllegalStateException("Cannot answer getAnnotations() for MemberImpl "+this.toString());
  33. }
  34. /**
  35. * All the signatures that a join point with this member as its signature has.
  36. * The fact that this has to go on MemberImpl and not ResolvedMemberImpl says a lot about
  37. * how broken the Member/ResolvedMember distinction currently is.
  38. */
  39. private JoinPointSignatureIterator joinPointSignatures = null;
  40. public MemberImpl(
  41. MemberKind kind,
  42. UnresolvedType declaringType,
  43. int modifiers,
  44. String name,
  45. String signature)
  46. {
  47. this.kind = kind;
  48. this.declaringType = declaringType;
  49. this.modifiers = modifiers;
  50. this.name = name;
  51. if (kind!=STATIC_INITIALIZATION && name!=null && name.equals("<clinit>")) {
  52. throw new RuntimeException("!");
  53. }
  54. this.signature = signature;
  55. if (kind == FIELD) {
  56. this.returnType = UnresolvedType.forSignature(signature);
  57. this.parameterTypes = UnresolvedType.NONE;
  58. } else {
  59. Object[] returnAndParams = signatureToTypes(signature,false);
  60. this.returnType = (UnresolvedType) returnAndParams[0];
  61. this.parameterTypes = (UnresolvedType[]) returnAndParams[1];
  62. // always safe not to do this ?!?
  63. // String oldsig=new String(signature);
  64. // signature = typesToSignature(returnType,parameterTypes,true);
  65. }
  66. }
  67. public MemberImpl(
  68. MemberKind kind,
  69. UnresolvedType declaringType,
  70. int modifiers,
  71. UnresolvedType returnType,
  72. String name,
  73. UnresolvedType[] parameterTypes)
  74. {
  75. super();
  76. this.kind = kind;
  77. this.declaringType = declaringType;
  78. this.modifiers = modifiers;
  79. if (name!=null && name.equals("<clinit>") && kind!=STATIC_INITIALIZATION) {
  80. throw new RuntimeException("!");
  81. }
  82. this.returnType = returnType;
  83. this.name = name;
  84. this.parameterTypes = parameterTypes;
  85. if (kind == FIELD) {
  86. this.signature = returnType.getErasureSignature();
  87. } else {
  88. this.signature = typesToSignature(returnType, parameterTypes,true);
  89. }
  90. }
  91. /* (non-Javadoc)
  92. * @see org.aspectj.weaver.Member#resolve(org.aspectj.weaver.World)
  93. */
  94. public ResolvedMember resolve(World world) {
  95. return world.resolve(this);
  96. }
  97. // ---- utility methods
  98. /** returns an Object[] pair of UnresolvedType, UnresolvedType[] representing return type,
  99. * argument types parsed from the JVM bytecode signature of a method. Yes,
  100. * this should actually return a nice statically-typed pair object, but we
  101. * don't have one of those.
  102. *
  103. * <blockquote><pre>
  104. * UnresolvedType.signatureToTypes("()[Z")[0].equals(Type.forSignature("[Z"))
  105. * UnresolvedType.signatureToTypes("(JJ)I")[1]
  106. * .equals(UnresolvedType.forSignatures(new String[] {"J", "J"}))
  107. * </pre></blockquote>
  108. *
  109. * @param signature the JVM bytecode method signature string we want to break apart
  110. * @return a pair of UnresolvedType, UnresolvedType[] representing the return types and parameter types.
  111. */
  112. public static String typesToSignature(UnresolvedType returnType, UnresolvedType[] paramTypes, boolean useRawTypes) {
  113. StringBuffer buf = new StringBuffer();
  114. buf.append("(");
  115. for (int i = 0, len = paramTypes.length; i < len; i++) {
  116. if (paramTypes[i].isParameterizedType() && useRawTypes) buf.append(paramTypes[i].getErasureSignature());
  117. else if (paramTypes[i].isTypeVariableReference() && useRawTypes) buf.append(paramTypes[i].getErasureSignature());
  118. else buf.append(paramTypes[i].getSignature());
  119. }
  120. buf.append(")");
  121. if (returnType.isParameterizedType() && useRawTypes) buf.append(returnType.getErasureSignature());
  122. else if (returnType.isTypeVariableReference() && useRawTypes) buf.append(returnType.getErasureSignature());
  123. else buf.append(returnType.getSignature());
  124. return buf.toString();
  125. }
  126. /**
  127. * Returns "(<signaturesOfParamTypes>,...)" - unlike the other typesToSignature
  128. * that also includes the return type, this one just deals with the parameter types.
  129. */
  130. public static String typesToSignature(UnresolvedType[] paramTypes) {
  131. StringBuffer buf = new StringBuffer();
  132. buf.append("(");
  133. for(int i=0;i<paramTypes.length;i++) {
  134. buf.append(paramTypes[i].getSignature());
  135. }
  136. buf.append(")");
  137. return buf.toString();
  138. }
  139. /**
  140. * returns an Object[] pair of UnresolvedType, UnresolvedType[] representing return type,
  141. * argument types parsed from the JVM bytecode signature of a method. Yes,
  142. * this should actually return a nice statically-typed pair object, but we
  143. * don't have one of those.
  144. *
  145. * <blockquote><pre>
  146. * UnresolvedType.signatureToTypes("()[Z")[0].equals(Type.forSignature("[Z"))
  147. * UnresolvedType.signatureToTypes("(JJ)I")[1]
  148. * .equals(UnresolvedType.forSignatures(new String[] {"J", "J"}))
  149. * </pre></blockquote>
  150. *
  151. * @param signature the JVM bytecode method signature string we want to break apart
  152. * @return a pair of UnresolvedType, UnresolvedType[] representing the return types and parameter types.
  153. */
  154. private static Object[] signatureToTypes(String sig,boolean keepParameterizationInfo) {
  155. List l = new ArrayList();
  156. int i = 1;
  157. boolean hasAnyAnglies = sig.indexOf('<')!=-1;
  158. while (true) {
  159. char c = sig.charAt(i);
  160. if (c == ')') break; // break out when the hit the ')'
  161. int start = i;
  162. while (c == '[') c = sig.charAt(++i);
  163. if (c == 'L' || c == 'P') {
  164. int nextSemicolon = sig.indexOf(';',start);
  165. int firstAngly = (hasAnyAnglies?sig.indexOf('<',start):-1);
  166. if (!hasAnyAnglies || firstAngly == -1 || firstAngly>nextSemicolon) {
  167. i = nextSemicolon + 1;
  168. l.add(UnresolvedType.forSignature(sig.substring(start, i)));
  169. } else {
  170. // generics generics generics
  171. // Have to skip to the *correct* ';'
  172. boolean endOfSigReached = false;
  173. int posn = firstAngly;
  174. int genericDepth=0;
  175. while (!endOfSigReached) {
  176. switch (sig.charAt(posn)) {
  177. case '<': genericDepth++;break;
  178. case '>': genericDepth--;break;
  179. case ';': if (genericDepth==0) endOfSigReached=true;break;
  180. default:
  181. }
  182. posn++;
  183. }
  184. // posn now points to the correct nextSemicolon :)
  185. i=posn;
  186. l.add(UnresolvedType.forSignature(sig.substring(start,i)));
  187. }
  188. } else if (c=='T') { // assumed 'reference' to a type variable, so just "Tname;"
  189. int nextSemicolon = sig.indexOf(';',start);
  190. String nextbit = sig.substring(start,nextSemicolon);
  191. l.add(UnresolvedType.forSignature(nextbit));
  192. i=nextSemicolon+1;
  193. } else {
  194. i++;
  195. l.add(UnresolvedType.forSignature(sig.substring(start, i)));
  196. }
  197. }
  198. UnresolvedType[] paramTypes = (UnresolvedType[]) l.toArray(new UnresolvedType[l.size()]);
  199. UnresolvedType returnType = UnresolvedType.forSignature(sig.substring(i+1, sig.length()));
  200. return new Object[] { returnType, paramTypes };
  201. }
  202. // ---- factory methods
  203. public static MemberImpl field(String declaring, int mods, String name, String signature) {
  204. return field(declaring, mods, UnresolvedType.forSignature(signature), name);
  205. }
  206. public static Member field(UnresolvedType declaring, int mods, String name, UnresolvedType type) {
  207. return new MemberImpl(FIELD, declaring, mods, type, name, UnresolvedType.NONE);
  208. }
  209. public static MemberImpl method(UnresolvedType declaring, int mods, String name, String signature) {
  210. Object[] pair = signatureToTypes(signature,false);
  211. return method(declaring, mods, (UnresolvedType) pair[0], name, (UnresolvedType[]) pair[1]);
  212. }
  213. public static MemberImpl monitorEnter() {
  214. return new MemberImpl(MONITORENTER,UnresolvedType.OBJECT,Modifier.STATIC,ResolvedType.VOID,"<lock>",UnresolvedType.ARRAY_WITH_JUST_OBJECT);
  215. }
  216. public static MemberImpl monitorExit() {
  217. return new MemberImpl(MONITOREXIT,UnresolvedType.OBJECT,Modifier.STATIC,ResolvedType.VOID,"<unlock>",UnresolvedType.ARRAY_WITH_JUST_OBJECT);
  218. }
  219. public static Member pointcut(UnresolvedType declaring, String name, String signature) {
  220. Object[] pair = signatureToTypes(signature,false);
  221. return pointcut(declaring, 0, (UnresolvedType) pair[0], name, (UnresolvedType[]) pair[1]);
  222. }
  223. private static MemberImpl field(String declaring, int mods, UnresolvedType ty, String name) {
  224. return new MemberImpl(FIELD, UnresolvedType.forName(declaring), mods, ty, name, UnresolvedType.NONE);
  225. }
  226. public static MemberImpl method(UnresolvedType declTy, int mods, UnresolvedType rTy, String name, UnresolvedType[] paramTys) {
  227. return new MemberImpl(
  228. //??? this calls <clinit> a method
  229. name.equals("<init>") ? CONSTRUCTOR : METHOD,
  230. declTy,
  231. mods,
  232. rTy,
  233. name,
  234. paramTys);
  235. }
  236. private static Member pointcut(UnresolvedType declTy, int mods, UnresolvedType rTy, String name, UnresolvedType[] paramTys) {
  237. return new MemberImpl(
  238. POINTCUT,
  239. declTy,
  240. mods,
  241. rTy,
  242. name,
  243. paramTys);
  244. }
  245. public static ResolvedMemberImpl makeExceptionHandlerSignature(UnresolvedType inType, UnresolvedType catchType) {
  246. return new ResolvedMemberImpl(
  247. HANDLER,
  248. inType,
  249. Modifier.STATIC,
  250. "<catch>",
  251. "(" + catchType.getSignature() + ")V");
  252. }
  253. // ---- things we know without resolution
  254. public boolean equals(Object other) {
  255. if (! (other instanceof Member)) return false;
  256. Member o = (Member) other;
  257. return (getKind() == o.getKind()
  258. && getName().equals(o.getName())
  259. && getSignature().equals(o.getSignature())
  260. && getDeclaringType().equals(o.getDeclaringType()));
  261. }
  262. /**
  263. * Equality is checked based on the underlying signature, so the hash code
  264. * of a member is based on its kind, name, signature, and declaring type. The
  265. * algorithm for this was taken from page 38 of effective java.
  266. */
  267. private volatile int hashCode = 0;
  268. public int hashCode() {
  269. if (hashCode == 0) {
  270. int result = 17;
  271. result = 37*result + getKind().hashCode();
  272. result = 37*result + getName().hashCode();
  273. result = 37*result + getSignature().hashCode();
  274. result = 37*result + getDeclaringType().hashCode();
  275. hashCode = result;
  276. }
  277. return hashCode;
  278. }
  279. /* (non-Javadoc)
  280. * @see org.aspectj.weaver.Member#compareTo(java.lang.Object)
  281. */
  282. public int compareTo(Object other) {
  283. Member o = (Member) other;
  284. int i = getName().compareTo(o.getName());
  285. if (i != 0) return i;
  286. return getSignature().compareTo(o.getSignature());
  287. }
  288. public String toString() {
  289. StringBuffer buf = new StringBuffer();
  290. buf.append(returnType.getName());
  291. buf.append(' ');
  292. buf.append(declaringType.getName());
  293. buf.append('.');
  294. buf.append(name);
  295. if (kind != FIELD) {
  296. buf.append("(");
  297. if (parameterTypes.length != 0) {
  298. buf.append(parameterTypes[0]);
  299. for (int i=1, len = parameterTypes.length; i < len; i++) {
  300. buf.append(", ");
  301. buf.append(parameterTypes[i].getName());
  302. }
  303. }
  304. buf.append(")");
  305. }
  306. return buf.toString();
  307. }
  308. // Overridden by subclasses - a method can be advice
  309. public MemberKind getKind() {
  310. return kind;
  311. }
  312. public UnresolvedType getDeclaringType() { return declaringType; }
  313. public UnresolvedType getReturnType() { return returnType; }
  314. public UnresolvedType getGenericReturnType() { return getReturnType(); }
  315. public UnresolvedType[] getGenericParameterTypes() { return getParameterTypes(); }
  316. public UnresolvedType getType() {
  317. return returnType;
  318. }
  319. public String getName() {
  320. return name;
  321. }
  322. public UnresolvedType[] getParameterTypes() { return parameterTypes; }
  323. public String getSignature() { return signature; }
  324. public int getArity() { return parameterTypes.length; }
  325. public String getParameterSignature() {
  326. if (paramSignature != null) return paramSignature;
  327. StringBuffer sb = new StringBuffer();
  328. sb.append("(");
  329. for (int i = 0; i < parameterTypes.length; i++) {
  330. UnresolvedType tx = parameterTypes[i];
  331. sb.append(tx.getSignature());
  332. }
  333. sb.append(")");
  334. paramSignature = sb.toString();
  335. return paramSignature;
  336. }
  337. /* (non-Javadoc)
  338. * @see org.aspectj.weaver.Member#isCompatibleWith(org.aspectj.weaver.Member)
  339. */
  340. public boolean isCompatibleWith(Member am) {
  341. if (kind != METHOD || am.getKind() != METHOD) return true;
  342. if (! name.equals(am.getName())) return true;
  343. if (! equalTypes(getParameterTypes(), am.getParameterTypes())) return true;
  344. return getReturnType().equals(am.getReturnType());
  345. }
  346. private static boolean equalTypes(UnresolvedType[] a, UnresolvedType[] b) {
  347. int len = a.length;
  348. if (len != b.length) return false;
  349. for (int i = 0; i < len; i++) {
  350. if (!a[i].equals(b[i])) return false;
  351. }
  352. return true;
  353. }
  354. // ---- things we know only with resolution
  355. /* (non-Javadoc)
  356. * @see org.aspectj.weaver.Member#getModifiers(org.aspectj.weaver.World)
  357. */
  358. public int getModifiers(World world) {
  359. ResolvedMember resolved = resolve(world);
  360. if (resolved == null) {
  361. reportDidntFindMember(world);
  362. return 0;
  363. }
  364. return resolved.getModifiers();
  365. }
  366. public UnresolvedType[] getExceptions(World world) {
  367. ResolvedMember resolved = resolve(world);
  368. if (resolved == null) {
  369. reportDidntFindMember(world);
  370. return UnresolvedType.NONE;
  371. }
  372. return resolved.getExceptions();
  373. }
  374. public final boolean isStatic() {
  375. return Modifier.isStatic(modifiers);
  376. }
  377. public final boolean isInterface() {
  378. return Modifier.isInterface(modifiers);
  379. }
  380. public final boolean isPrivate() {
  381. return Modifier.isPrivate(modifiers);
  382. }
  383. public boolean canBeParameterized() {
  384. return false;
  385. }
  386. public final int getCallsiteModifiers() {
  387. return modifiers & ~ Modifier.INTERFACE;
  388. }
  389. public int getModifiers() {
  390. return modifiers;
  391. }
  392. public final String getExtractableName() {
  393. if (kind==CONSTRUCTOR/*name.equals("<init>")*/) return "init$";
  394. else if (kind==STATIC_INITIALIZATION/*name.equals("<clinit>")*/) return "clinit$";
  395. else return name;
  396. }
  397. // public AnnotationX[] getAnnotations() {
  398. // throw new UnsupportedOperationException("You should resolve this member '"+this+"' and call getAnnotations() on the result...");
  399. // }
  400. // ---- fields 'n' stuff
  401. public Collection/*ResolvedType*/ getDeclaringTypes(World world) {
  402. ResolvedType myType = getDeclaringType().resolve(world);
  403. Collection ret = new HashSet();
  404. if (kind == CONSTRUCTOR) {
  405. // this is wrong if the member doesn't exist, but that doesn't matter
  406. ret.add(myType);
  407. } else if (isStatic() || kind == FIELD) {
  408. walkUpStatic(ret, myType);
  409. } else {
  410. walkUp(ret, myType);
  411. }
  412. return ret;
  413. }
  414. private boolean walkUp(Collection acc, ResolvedType curr) {
  415. if (acc.contains(curr)) return true;
  416. boolean b = false;
  417. for (Iterator i = curr.getDirectSupertypes(); i.hasNext(); ) {
  418. b |= walkUp(acc, (ResolvedType)i.next());
  419. }
  420. if (!b && curr.isParameterizedType()) {
  421. b = walkUp(acc,curr.getGenericType());
  422. }
  423. if (!b) {
  424. b = curr.lookupMemberNoSupers(this) != null;
  425. }
  426. if (b) acc.add(curr);
  427. return b;
  428. }
  429. private boolean walkUpStatic(Collection acc, ResolvedType curr) {
  430. if (curr.lookupMemberNoSupers(this) != null) {
  431. acc.add(curr);
  432. return true;
  433. } else {
  434. boolean b = false;
  435. for (Iterator i = curr.getDirectSupertypes(); i.hasNext(); ) {
  436. b |= walkUpStatic(acc, (ResolvedType)i.next());
  437. }
  438. if (!b && curr.isParameterizedType()) {
  439. b = walkUpStatic(acc,curr.getGenericType());
  440. }
  441. if (b) acc.add(curr);
  442. return b;
  443. }
  444. }
  445. // ---- reflective thisJoinPoint stuff
  446. /* (non-Javadoc)
  447. * @see org.aspectj.weaver.Member#getSignatureMakerName()
  448. */
  449. public String getSignatureMakerName() {
  450. // if (getName().equals("<clinit>")) return "makeInitializerSig";
  451. MemberKind kind = getKind();
  452. if (kind == METHOD) {
  453. return "makeMethodSig";
  454. } else if (kind == CONSTRUCTOR) {
  455. return "makeConstructorSig";
  456. } else if (kind == FIELD) {
  457. return "makeFieldSig";
  458. } else if (kind == HANDLER) {
  459. return "makeCatchClauseSig";
  460. } else if (kind == STATIC_INITIALIZATION) {
  461. return "makeInitializerSig";
  462. } else if (kind == ADVICE) {
  463. return "makeAdviceSig";
  464. } else if (kind == MONITORENTER) {
  465. return "makeLockSig";
  466. } else if (kind == MONITOREXIT) {
  467. return "makeUnlockSig";
  468. } else {
  469. throw new RuntimeException("unimplemented");
  470. }
  471. }
  472. /* (non-Javadoc)
  473. * @see org.aspectj.weaver.Member#getSignatureType()
  474. */
  475. public String getSignatureType() {
  476. MemberKind kind = getKind();
  477. // if (getName().equals("<clinit>")) return "org.aspectj.lang.reflect.InitializerSignature";
  478. if (kind == METHOD) {
  479. return "org.aspectj.lang.reflect.MethodSignature";
  480. } else if (kind == CONSTRUCTOR) {
  481. return "org.aspectj.lang.reflect.ConstructorSignature";
  482. } else if (kind == FIELD) {
  483. return "org.aspectj.lang.reflect.FieldSignature";
  484. } else if (kind == HANDLER) {
  485. return "org.aspectj.lang.reflect.CatchClauseSignature";
  486. } else if (kind == STATIC_INITIALIZATION) {
  487. return "org.aspectj.lang.reflect.InitializerSignature";
  488. } else if (kind == ADVICE) {
  489. return "org.aspectj.lang.reflect.AdviceSignature";
  490. } else if (kind == MONITORENTER) {
  491. return "org.aspectj.lang.reflect.LockSignature";
  492. } else if (kind == MONITOREXIT) {
  493. return "org.aspectj.lang.reflect.UnlockSignature";
  494. } else {
  495. throw new RuntimeException("unimplemented");
  496. }
  497. }
  498. /* (non-Javadoc)
  499. * @see org.aspectj.weaver.Member#getSignatureString(org.aspectj.weaver.World)
  500. */
  501. public String getSignatureString(World world) {
  502. if (getName().equals("<clinit>")) return getStaticInitializationSignatureString(world);
  503. //
  504. MemberKind kind = getKind();
  505. if (kind == METHOD) {
  506. return getMethodSignatureString(world);
  507. } else if (kind == CONSTRUCTOR) {
  508. return getConstructorSignatureString(world);
  509. } else if (kind == FIELD) {
  510. return getFieldSignatureString(world);
  511. } else if (kind == HANDLER) {
  512. return getHandlerSignatureString(world);
  513. } else if (kind == STATIC_INITIALIZATION) {
  514. return getStaticInitializationSignatureString(world);
  515. } else if (kind == ADVICE) {
  516. return getAdviceSignatureString(world);
  517. } else if (kind == MONITORENTER || kind == MONITOREXIT) {
  518. return getMonitorSignatureString(world);
  519. } else {
  520. throw new RuntimeException("unimplemented");
  521. }
  522. }
  523. private String getHandlerSignatureString(World world) {
  524. StringBuffer buf = new StringBuffer();
  525. buf.append(makeString(0));
  526. buf.append('-');
  527. //buf.append(getName());
  528. buf.append('-');
  529. buf.append(makeString(getDeclaringType()));
  530. buf.append('-');
  531. buf.append(makeString(getParameterTypes()[0]));
  532. buf.append('-');
  533. String pName = "<missing>";
  534. String[] names = getParameterNames(world);
  535. if (names != null) pName = names[0];
  536. buf.append(pName);
  537. buf.append('-');
  538. return buf.toString();
  539. }
  540. private String getStaticInitializationSignatureString(World world) {
  541. StringBuffer buf = new StringBuffer();
  542. buf.append(makeString(getModifiers(world)));
  543. buf.append('-');
  544. //buf.append(getName());
  545. buf.append('-');
  546. buf.append(makeString(getDeclaringType()));
  547. buf.append('-');
  548. return buf.toString();
  549. }
  550. protected String getAdviceSignatureString(World world) {
  551. StringBuffer buf = new StringBuffer();
  552. buf.append(makeString(getModifiers(world)));
  553. buf.append('-');
  554. buf.append(getName());
  555. buf.append('-');
  556. buf.append(makeString(getDeclaringType()));
  557. buf.append('-');
  558. buf.append(makeString(getParameterTypes()));
  559. buf.append('-');
  560. buf.append(makeString(getParameterNames(world)));
  561. buf.append('-');
  562. buf.append(makeString(getExceptions(world)));
  563. buf.append('-');
  564. buf.append(makeString(getReturnType()));
  565. buf.append('-');
  566. return buf.toString();
  567. }
  568. protected String getMethodSignatureString(World world) {
  569. StringBuffer buf = new StringBuffer();
  570. buf.append(makeString(getModifiers(world)));
  571. buf.append('-');
  572. buf.append(getName());
  573. buf.append('-');
  574. buf.append(makeString(getDeclaringType()));
  575. buf.append('-');
  576. buf.append(makeString(getParameterTypes()));
  577. buf.append('-');
  578. buf.append(makeString(getParameterNames(world)));
  579. buf.append('-');
  580. buf.append(makeString(getExceptions(world)));
  581. buf.append('-');
  582. buf.append(makeString(getReturnType()));
  583. buf.append('-');
  584. return buf.toString();
  585. }
  586. protected String getMonitorSignatureString(World world) {
  587. StringBuffer buf = new StringBuffer();
  588. buf.append(makeString(Modifier.STATIC)); // modifiers
  589. buf.append('-');
  590. buf.append(getName()); // name
  591. buf.append('-');
  592. buf.append(makeString(getDeclaringType())); // Declaring Type
  593. buf.append('-');
  594. buf.append(makeString(getParameterTypes()[0])); // Parameter Types
  595. buf.append('-');
  596. buf.append(""); // Parameter names
  597. buf.append('-');
  598. return buf.toString();
  599. }
  600. protected String getConstructorSignatureString(World world) {
  601. StringBuffer buf = new StringBuffer();
  602. buf.append(makeString(getModifiers(world)));
  603. buf.append('-');
  604. buf.append('-');
  605. buf.append(makeString(getDeclaringType()));
  606. buf.append('-');
  607. buf.append(makeString(getParameterTypes()));
  608. buf.append('-');
  609. buf.append(makeString(getParameterNames(world)));
  610. buf.append('-');
  611. buf.append(makeString(getExceptions(world)));
  612. buf.append('-');
  613. return buf.toString();
  614. }
  615. protected String getFieldSignatureString(World world) {
  616. StringBuffer buf = new StringBuffer();
  617. buf.append(makeString(getModifiers(world)));
  618. buf.append('-');
  619. buf.append(getName());
  620. buf.append('-');
  621. buf.append(makeString(getDeclaringType()));
  622. buf.append('-');
  623. buf.append(makeString(getReturnType()));
  624. buf.append('-');
  625. return buf.toString();
  626. }
  627. protected String makeString(int i) {
  628. return Integer.toString(i, 16);
  629. }
  630. protected String makeString(UnresolvedType t) {
  631. // this is the inverse of the odd behavior for Class.forName w/ arrays
  632. if (t.isArray()) {
  633. // this behavior matches the string used by the eclipse compiler for Foo.class literals
  634. return t.getSignature().replace('/', '.');
  635. } else {
  636. return t.getName();
  637. }
  638. }
  639. protected String makeString(UnresolvedType[] types) {
  640. if (types == null) return "";
  641. StringBuffer buf = new StringBuffer();
  642. for (int i = 0, len=types.length; i < len; i++) {
  643. buf.append(makeString(types[i]));
  644. buf.append(':');
  645. }
  646. return buf.toString();
  647. }
  648. protected String makeString(String[] names) {
  649. if (names == null) return "";
  650. StringBuffer buf = new StringBuffer();
  651. for (int i = 0, len=names.length; i < len; i++) {
  652. buf.append(names[i]);
  653. buf.append(':');
  654. }
  655. return buf.toString();
  656. }
  657. /* (non-Javadoc)
  658. * @see org.aspectj.weaver.Member#getParameterNames(org.aspectj.weaver.World)
  659. */
  660. public String[] getParameterNames(World world) {
  661. ResolvedMember resolved = resolve(world);
  662. if (resolved == null) {
  663. reportDidntFindMember(world);
  664. return null;
  665. }
  666. return resolved.getParameterNames();
  667. }
  668. /**
  669. * All the signatures that a join point with this member as its signature has.
  670. */
  671. public Iterator getJoinPointSignatures(World inAWorld) {
  672. if (joinPointSignatures == null) {
  673. joinPointSignatures = new JoinPointSignatureIterator(this,inAWorld);
  674. }
  675. joinPointSignatures.reset();
  676. return joinPointSignatures;
  677. }
  678. /**
  679. * Raises an [Xlint:cantFindType] message if the declaring type
  680. * cannot be found or an [Xlint:unresolvableMember] message if the
  681. * type can be found (bug 149908)
  682. */
  683. private void reportDidntFindMember(World world) {
  684. if (reportedCantFindDeclaringType || reportedUnresolvableMember) return;
  685. ResolvedType rType = getDeclaringType().resolve(world);
  686. if (rType.isMissing()) {
  687. world.getLint().cantFindType.signal(WeaverMessages.format(WeaverMessages.CANT_FIND_TYPE,rType.getName()),null);
  688. reportedCantFindDeclaringType = true;
  689. } else {
  690. world.getLint().unresolvableMember.signal(getName(),null);
  691. reportedUnresolvableMember = true;
  692. }
  693. }
  694. }