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.

MissingResolvedTypeWithKnownSignature.java 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /* *******************************************************************
  2. * Copyright (c) 2005 Contributors.
  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://eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * Adrian Colyer Initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver;
  13. import java.util.Collections;
  14. import java.util.List;
  15. import org.aspectj.bridge.ISourceLocation;
  16. import org.aspectj.bridge.context.CompilationAndWeavingContext;
  17. /**
  18. * When we try to resolve a type in the world that we require to be present, and then fail to find it, we return an instance of this
  19. * class. This class defers the production of the "can't find type error" until the first time that someone asks a question that
  20. * can't be answered solely from the signature. This enables the weaver to be more tolerant of missing types.
  21. *
  22. */
  23. public class MissingResolvedTypeWithKnownSignature extends ResolvedType {
  24. private static ResolvedMember[] NO_MEMBERS = new ResolvedMember[0];
  25. private static ResolvedType[] NO_TYPES = new ResolvedType[0];
  26. private boolean issuedCantFindTypeError = false;
  27. private boolean issuedJoinPointWarning = false;
  28. private boolean issuedMissingInterfaceWarning = false;
  29. /**
  30. * @param signature
  31. * @param world
  32. */
  33. public MissingResolvedTypeWithKnownSignature(String signature, World world) {
  34. super(signature, world);
  35. }
  36. @Override
  37. public boolean isMissing() {
  38. return true;
  39. }
  40. /**
  41. * @param signature
  42. * @param signatureErasure
  43. * @param world
  44. */
  45. public MissingResolvedTypeWithKnownSignature(String signature, String signatureErasure, World world) {
  46. super(signature, signatureErasure, world);
  47. }
  48. /*
  49. * (non-Javadoc)
  50. *
  51. * @see org.aspectj.weaver.ResolvedType#getDeclaredFields()
  52. */
  53. @Override
  54. public ResolvedMember[] getDeclaredFields() {
  55. raiseCantFindType(WeaverMessages.CANT_FIND_TYPE_FIELDS);
  56. return NO_MEMBERS;
  57. }
  58. /*
  59. * (non-Javadoc)
  60. *
  61. * @see org.aspectj.weaver.ResolvedType#getDeclaredMethods()
  62. */
  63. @Override
  64. public ResolvedMember[] getDeclaredMethods() {
  65. raiseCantFindType(WeaverMessages.CANT_FIND_TYPE_METHODS);
  66. return NO_MEMBERS;
  67. }
  68. @Override
  69. public AnnotationAJ[] getAnnotations() {
  70. raiseCantFindType(WeaverMessages.CANT_FIND_TYPE_ANNOTATION);
  71. return AnnotationAJ.EMPTY_ARRAY;
  72. }
  73. @Override
  74. public ResolvedType[] getDeclaredInterfaces() {
  75. raiseCantFindType(WeaverMessages.CANT_FIND_TYPE_INTERFACES);
  76. return NO_TYPES;
  77. }
  78. @Override
  79. public ResolvedMember[] getDeclaredPointcuts() {
  80. raiseCantFindType(WeaverMessages.CANT_FIND_TYPE_POINTCUTS);
  81. return NO_MEMBERS;
  82. }
  83. @Override
  84. public ResolvedType getSuperclass() {
  85. raiseCantFindType(WeaverMessages.CANT_FIND_TYPE_SUPERCLASS);
  86. return ResolvedType.MISSING;
  87. }
  88. @Override
  89. public int getModifiers() {
  90. raiseCantFindType(WeaverMessages.CANT_FIND_TYPE_MODIFIERS);
  91. return 0;
  92. }
  93. /*
  94. * (non-Javadoc)
  95. *
  96. * @see org.aspectj.weaver.ResolvedType#getSourceContext()
  97. */
  98. @Override
  99. public ISourceContext getSourceContext() {
  100. return new ISourceContext() {
  101. @Override
  102. public ISourceLocation makeSourceLocation(IHasPosition position) {
  103. return null;
  104. }
  105. @Override
  106. public ISourceLocation makeSourceLocation(int line, int offset) {
  107. return null;
  108. }
  109. @Override
  110. public int getOffset() {
  111. return 0;
  112. }
  113. @Override
  114. public void tidy() {
  115. }
  116. };
  117. }
  118. /*
  119. * (non-Javadoc)
  120. *
  121. * @see org.aspectj.weaver.ResolvedType#isAssignableFrom(org.aspectj.weaver.ResolvedType)
  122. */
  123. @Override
  124. public boolean isAssignableFrom(ResolvedType other) {
  125. raiseCantFindType(WeaverMessages.CANT_FIND_TYPE_ASSIGNABLE, other.getName());
  126. return false;
  127. }
  128. @Override
  129. public boolean isAssignableFrom(ResolvedType other, boolean allowMissing) {
  130. if (allowMissing) {
  131. return false;
  132. } else {
  133. return isAssignableFrom(other);
  134. }
  135. }
  136. /*
  137. * (non-Javadoc)
  138. *
  139. * @see org.aspectj.weaver.ResolvedType#isCoerceableFrom(org.aspectj.weaver.ResolvedType)
  140. */
  141. @Override
  142. public boolean isCoerceableFrom(ResolvedType other) {
  143. raiseCantFindType(WeaverMessages.CANT_FIND_TYPE_COERCEABLE, other.getName());
  144. return false;
  145. }
  146. /*
  147. * (non-Javadoc)
  148. *
  149. * @see org.aspectj.weaver.AnnotatedElement#hasAnnotation(org.aspectj.weaver.UnresolvedType)
  150. */
  151. @Override
  152. public boolean hasAnnotation(UnresolvedType ofType) {
  153. raiseCantFindType(WeaverMessages.CANT_FIND_TYPE_ANNOTATION);
  154. return false;
  155. }
  156. @Override
  157. public List getInterTypeMungers() {
  158. return Collections.EMPTY_LIST;
  159. }
  160. @Override
  161. public List getInterTypeMungersIncludingSupers() {
  162. return Collections.EMPTY_LIST;
  163. }
  164. @Override
  165. public List getInterTypeParentMungers() {
  166. return Collections.EMPTY_LIST;
  167. }
  168. @Override
  169. public List getInterTypeParentMungersIncludingSupers() {
  170. return Collections.EMPTY_LIST;
  171. }
  172. @Override
  173. protected void collectInterTypeMungers(List collector) {
  174. return;
  175. }
  176. public void raiseWarningOnJoinPointSignature(String signature) {
  177. if (issuedJoinPointWarning) {
  178. return;
  179. }
  180. String message = WeaverMessages.format(WeaverMessages.CANT_FIND_TYPE_JOINPOINT, getName(), signature);
  181. message += "\n" + CompilationAndWeavingContext.getCurrentContext();
  182. world.getLint().cantFindTypeAffectingJoinPointMatch.signal(message, null);
  183. // MessageUtil.warn(world.getMessageHandler(),message);
  184. issuedJoinPointWarning = true;
  185. }
  186. public void raiseWarningOnMissingInterfaceWhilstFindingMethods() {
  187. if (issuedMissingInterfaceWarning) {
  188. return;
  189. }
  190. String message = WeaverMessages.format(WeaverMessages.CANT_FIND_TYPE_INTERFACE_METHODS, getName(), signature);
  191. message += "\n" + CompilationAndWeavingContext.getCurrentContext();
  192. world.getLint().cantFindTypeAffectingJoinPointMatch.signal(message, null);
  193. // MessageUtil.warn(world.getMessageHandler(),message);
  194. issuedMissingInterfaceWarning = true;
  195. }
  196. private void raiseCantFindType(String key) {
  197. if (!world.getLint().cantFindType.isEnabled()) {
  198. return;
  199. }
  200. if (issuedCantFindTypeError) {
  201. return;
  202. }
  203. String message = WeaverMessages.format(key, getName());
  204. message += "\n" + CompilationAndWeavingContext.getCurrentContext();
  205. world.getLint().cantFindType.signal(message, null);
  206. // MessageUtil.error(world.getMessageHandler(),message);
  207. issuedCantFindTypeError = true;
  208. }
  209. private void raiseCantFindType(String key, String insert) {
  210. if (issuedCantFindTypeError) {
  211. return;
  212. }
  213. String message = WeaverMessages.format(key, getName(), insert);
  214. message += "\n" + CompilationAndWeavingContext.getCurrentContext();
  215. world.getLint().cantFindType.signal(message, null);
  216. // MessageUtil.error(world.getMessageHandler(),message);
  217. issuedCantFindTypeError = true;
  218. }
  219. }