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.

World.java 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  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 java.util.*;
  14. import org.aspectj.weaver.patterns.*;
  15. import org.aspectj.weaver.patterns.Pointcut;
  16. import org.aspectj.asm.StructureModel;
  17. import org.aspectj.bridge.*;
  18. import org.aspectj.bridge.IMessage.Kind;
  19. public abstract class World {
  20. protected IMessageHandler messageHandler = IMessageHandler.SYSTEM_ERR;
  21. protected Map typeMap = new HashMap(); // Signature to ResolvedType
  22. protected CrosscuttingMembersSet crosscuttingMembersSet = new CrosscuttingMembersSet(this);
  23. protected StructureModel model = null;
  24. protected Lint lint = new Lint(this);
  25. protected boolean XnoInline;
  26. protected World() {
  27. super();
  28. typeMap.put("B", ResolvedTypeX.BYTE);
  29. typeMap.put("S", ResolvedTypeX.SHORT);
  30. typeMap.put("I", ResolvedTypeX.INT);
  31. typeMap.put("J", ResolvedTypeX.LONG);
  32. typeMap.put("F", ResolvedTypeX.FLOAT);
  33. typeMap.put("D", ResolvedTypeX.DOUBLE);
  34. typeMap.put("C", ResolvedTypeX.CHAR);
  35. typeMap.put("Z", ResolvedTypeX.BOOLEAN);
  36. typeMap.put("V", ResolvedTypeX.VOID);
  37. }
  38. public ResolvedTypeX[] resolve(TypeX[] types) {
  39. int len = types.length;
  40. ResolvedTypeX[] ret = new ResolvedTypeX[len];
  41. for (int i=0; i<len; i++) {
  42. ret[i] = resolve(types[i]);
  43. }
  44. return ret;
  45. }
  46. public ResolvedTypeX resolve(TypeX ty) {
  47. return resolve(ty, false);
  48. }
  49. public ResolvedTypeX resolve(TypeX ty, boolean allowMissing) {
  50. //System.out.println("resolve: " + ty + " world " + typeMap.keySet());
  51. String signature = ty.getSignature();
  52. ResolvedTypeX ret = (ResolvedTypeX)typeMap.get(signature);
  53. if (ret != null) return ret;
  54. if (ty.isArray()) {
  55. ret = new ResolvedTypeX.Array(signature, this, resolve(ty.getComponentType(), allowMissing));
  56. } else {
  57. ret = resolveObjectType(ty);
  58. if (!allowMissing && ret == ResolvedTypeX.MISSING) {
  59. //Thread.currentThread().dumpStack();
  60. MessageUtil.error(messageHandler, "can't find type " + ty.getName());
  61. // + " on classpath " + classPath);
  62. }
  63. }
  64. //System.out.println("ret: " + ret);
  65. typeMap.put(signature, ret);
  66. return ret;
  67. }
  68. //XXX helper method might be bad
  69. public ResolvedTypeX resolve(String name) {
  70. return resolve(TypeX.forName(name));
  71. }
  72. protected abstract ResolvedTypeX resolveObjectType(TypeX ty);
  73. protected final boolean isCoerceableFrom(TypeX type, TypeX other) {
  74. return resolve(type).isCoerceableFrom(other);
  75. }
  76. protected final boolean isAssignableFrom(TypeX type, TypeX other) {
  77. return resolve(type).isAssignableFrom(other);
  78. }
  79. public boolean needsNoConversionFrom(TypeX type, TypeX other) {
  80. return resolve(type).needsNoConversionFrom(other);
  81. }
  82. protected final boolean isInterface(TypeX type) {
  83. return resolve(type).isInterface();
  84. }
  85. protected final ResolvedTypeX getSuperclass(TypeX type) {
  86. return resolve(type).getSuperclass();
  87. }
  88. protected final TypeX[] getDeclaredInterfaces(TypeX type) {
  89. return resolve(type).getDeclaredInterfaces();
  90. }
  91. protected final int getModifiers(TypeX type) {
  92. return resolve(type).getModifiers();
  93. }
  94. protected final ResolvedMember[] getDeclaredFields(TypeX type) {
  95. return resolve(type).getDeclaredFields();
  96. }
  97. protected final ResolvedMember[] getDeclaredMethods(TypeX type) {
  98. return resolve(type).getDeclaredMethods();
  99. }
  100. protected final ResolvedMember[] getDeclaredPointcuts(TypeX type) {
  101. return resolve(type).getDeclaredPointcuts();
  102. }
  103. // ---- members
  104. // XXX should we worry about dealing with context and looking up access?
  105. public ResolvedMember resolve(Member member) {
  106. ResolvedTypeX declaring = member.getDeclaringType().resolve(this);
  107. ResolvedMember ret;
  108. if (member.getKind() == Member.FIELD) {
  109. ret = declaring.lookupField(member);
  110. } else {
  111. ret = declaring.lookupMethod(member);
  112. }
  113. if (ret != null) return ret;
  114. return declaring.lookupSyntheticMember(member);
  115. }
  116. protected int getModifiers(Member member) {
  117. ResolvedMember r = resolve(member);
  118. if (r == null) throw new BCException("bad resolve of " + member);
  119. return r.getModifiers();
  120. }
  121. protected String[] getParameterNames(Member member) {
  122. return resolve(member).getParameterNames();
  123. }
  124. protected TypeX[] getExceptions(Member member) {
  125. return resolve(member).getExceptions();
  126. }
  127. // ---- pointcuts
  128. public ResolvedPointcutDefinition findPointcut(TypeX typeX, String name) {
  129. throw new RuntimeException("not implemented yet");
  130. }
  131. /**
  132. * Get the shadow mungers of this world.
  133. *
  134. * @return a list of {@link IShadowMunger}s appropriate for this world.
  135. */
  136. //public abstract List getShadowMungers();
  137. // ---- empty world
  138. public static final World EMPTY = new World() {
  139. public List getShadowMungers() { return Collections.EMPTY_LIST; }
  140. public ResolvedTypeX resolveObjectType(TypeX ty) {
  141. return ResolvedTypeX.MISSING;
  142. }
  143. public Advice concreteAdvice(AjAttribute.AdviceAttribute attribute, Pointcut p, Member m) {
  144. throw new RuntimeException("unimplemented");
  145. }
  146. public ConcreteTypeMunger concreteTypeMunger(ResolvedTypeMunger munger, ResolvedTypeX aspectType) {
  147. throw new RuntimeException("unimplemented");
  148. }
  149. };
  150. public abstract Advice concreteAdvice(
  151. AjAttribute.AdviceAttribute attribute,
  152. Pointcut pointcut,
  153. Member signature);
  154. public final Advice concreteAdvice(
  155. AdviceKind kind,
  156. Pointcut p,
  157. Member signature,
  158. int extraParameterFlags,
  159. IHasSourceLocation loc)
  160. {
  161. AjAttribute.AdviceAttribute attribute =
  162. new AjAttribute.AdviceAttribute(kind, p, extraParameterFlags, loc.getStart(), loc.getEnd(), loc.getSourceContext());
  163. return concreteAdvice(attribute, p, signature);
  164. }
  165. public ConcreteTypeMunger makeCflowStackFieldAdder(ResolvedMember cflowField) {
  166. throw new RuntimeException("unimplemented");
  167. }
  168. public abstract ConcreteTypeMunger concreteTypeMunger(ResolvedTypeMunger munger, ResolvedTypeX aspectType);
  169. /**
  170. * Nobody should hold onto a copy of this message handler, or setMessageHandler won't
  171. * work right.
  172. */
  173. public IMessageHandler getMessageHandler() {
  174. return messageHandler;
  175. }
  176. public void setMessageHandler(IMessageHandler messageHandler) {
  177. this.messageHandler = messageHandler;
  178. }
  179. public void showMessage(
  180. Kind kind,
  181. String message,
  182. ISourceLocation loc1,
  183. ISourceLocation loc2)
  184. {
  185. if (loc1 != null) {
  186. messageHandler.handleMessage(new Message(message, kind, null, loc1));
  187. if (loc2 != null) {
  188. messageHandler.handleMessage(new Message(message, kind, null, loc2));
  189. }
  190. } else {
  191. messageHandler.handleMessage(new Message(message, kind, null, loc2));
  192. }
  193. }
  194. // public void addDeclare(ResolvedTypeX onType, Declare declare, boolean forWeaving) {
  195. // // this is not extensible, oh well
  196. // if (declare instanceof DeclareErrorOrWarning) {
  197. // ShadowMunger m = new Checker((DeclareErrorOrWarning)declare);
  198. // onType.addShadowMunger(m);
  199. // } else if (declare instanceof DeclareDominates) {
  200. // declareDominates.add(declare);
  201. // } else if (declare instanceof DeclareParents) {
  202. // declareParents.add(declare);
  203. // } else if (declare instanceof DeclareSoft) {
  204. // DeclareSoft d = (DeclareSoft)declare;
  205. // declareSoft.add(d);
  206. // if (forWeaving) {
  207. // ShadowMunger m = Advice.makeSoftener(this, d.getPointcut().concretize(onType, 0), d.getException());
  208. // onType.addShadowMunger(m);
  209. // }
  210. // } else {
  211. // throw new RuntimeException("unimplemented");
  212. // }
  213. // }
  214. /**
  215. * Same signature as org.aspectj.util.PartialOrder.PartialComparable.compareTo
  216. */
  217. public int compareByDominates(ResolvedTypeX aspect1, ResolvedTypeX aspect2) {
  218. //System.out.println("dom compare: " + aspect1 + " with " + aspect2);
  219. //System.out.println(crosscuttingMembersSet.getDeclareDominates());
  220. //??? We probably want to cache this result. This is order N where N is the
  221. //??? number of dominates declares in the whole system.
  222. //??? This method can be called a large number of times.
  223. int order = 0;
  224. for (Iterator i = crosscuttingMembersSet.getDeclareDominates().iterator(); i.hasNext(); ) {
  225. DeclarePrecedence d = (DeclarePrecedence)i.next();
  226. int thisOrder = d.compare(aspect1, aspect2);
  227. //System.out.println("comparing: " + thisOrder + ": " + d);
  228. if (thisOrder != 0) {
  229. if (order != 0 && order != thisOrder) {
  230. throw new BCException("conflicting dominates orders");
  231. } else {
  232. order = thisOrder;
  233. }
  234. }
  235. }
  236. return order;
  237. }
  238. public int comparePrecedence(ResolvedTypeX aspect1, ResolvedTypeX aspect2) {
  239. //System.err.println("compare precedence " + aspect1 + ", " + aspect2);
  240. if (aspect1.equals(aspect2)) return 0;
  241. int ret = compareByDominates(aspect1, aspect2);
  242. if (ret != 0) return ret;
  243. if (aspect1.isAssignableFrom(aspect2)) return -1;
  244. else if (aspect2.isAssignableFrom(aspect1)) return +1;
  245. return 0;
  246. }
  247. public List getDeclareParents() {
  248. return crosscuttingMembersSet.getDeclareParents();
  249. }
  250. public List getDeclareSoft() {
  251. return crosscuttingMembersSet.getDeclareSofts();
  252. }
  253. public CrosscuttingMembersSet getCrosscuttingMembersSet() {
  254. return crosscuttingMembersSet;
  255. }
  256. public StructureModel getModel() {
  257. return model;
  258. }
  259. public void setModel(StructureModel model) {
  260. this.model = model;
  261. }
  262. public Lint getLint() {
  263. return lint;
  264. }
  265. public void setLint(Lint lint) {
  266. this.lint = lint;
  267. }
  268. public boolean isXnoInline() {
  269. return XnoInline;
  270. }
  271. public void setXnoInline(boolean xnoInline) {
  272. XnoInline = xnoInline;
  273. }
  274. }