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.

AtAspectJAnnotationFactory.java 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  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.ajdt.internal.compiler.ast;
  13. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
  14. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
  15. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.IntLiteral;
  16. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MemberValuePair;
  17. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NormalAnnotation;
  18. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
  19. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.StringLiteral;
  20. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TrueLiteral;
  21. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FalseLiteral;
  22. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
  23. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BlockScope;
  24. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
  25. /**
  26. * @author colyer
  27. * Creates @AspectJ annotations for use by AtAspectJVisitor
  28. */
  29. public class AtAspectJAnnotationFactory {
  30. static final char[] org = "org".toCharArray();
  31. static final char[] aspectj = "aspectj".toCharArray();
  32. static final char[] lang = "lang".toCharArray();
  33. static final char[] internal = "internal".toCharArray();
  34. static final char[] annotation = "annotation".toCharArray();
  35. static final char[] value = "value".toCharArray();
  36. static final char[] aspect = "Aspect".toCharArray();
  37. static final char[] privileged = "ajcPrivileged".toCharArray();
  38. static final char[] before = "Before".toCharArray();
  39. static final char[] after = "After".toCharArray();
  40. static final char[] afterReturning = "AfterReturning".toCharArray();
  41. static final char[] afterThrowing = "AfterThrowing".toCharArray();
  42. static final char[] around = "Around".toCharArray();
  43. static final char[] pointcut = "Pointcut".toCharArray();
  44. static final char[] declareErrorOrWarning = "ajcDeclareEoW".toCharArray();
  45. static final char[] declareParents = "ajcDeclareParents".toCharArray();
  46. static final char[] declareSoft = "ajcDeclareSoft".toCharArray();
  47. static final char[] declarePrecedence = "ajcDeclarePrecedence".toCharArray();
  48. static final char[] declareAnnotation = "ajcDeclareAnnotation".toCharArray();
  49. static final char[] itdAnnotation = "ajcITD".toCharArray();
  50. /**
  51. * Create an @Aspect annotation for a code style aspect declaration starting at
  52. * the given position in the source file
  53. */
  54. public static Annotation createAspectAnnotation(String perclause, int pos) {
  55. char[][] typeName = new char[][] {org,aspectj,lang,annotation,aspect};
  56. long[] positions = new long[] {pos,pos,pos,pos,pos};
  57. TypeReference orgAspectJLangAnnotationAspect = new QualifiedTypeReference(typeName,positions);
  58. NormalAnnotation atAspectAnnotation = new NormalAnnotation(orgAspectJLangAnnotationAspect,pos);
  59. if (!perclause.equals("")) {
  60. // we have to set the value
  61. Expression perclauseExpr = new StringLiteral(perclause.toCharArray(),pos,pos,1);
  62. MemberValuePair[] mvps = new MemberValuePair[1];
  63. mvps[0] = new MemberValuePair(value,pos,pos,perclauseExpr);
  64. atAspectAnnotation.memberValuePairs = mvps;
  65. }
  66. return atAspectAnnotation;
  67. }
  68. public static Annotation createPrivilegedAnnotation(int pos) {
  69. char[][] typeName = new char[][] {org,aspectj,internal,lang,annotation,privileged};
  70. long[] positions = new long[] {pos,pos,pos,pos,pos,pos};
  71. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  72. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  73. return ann;
  74. }
  75. public static Annotation createBeforeAnnotation(String pointcutExpression, String argNames, int pos) {
  76. char[][] typeName = new char[][] {org,aspectj,lang,annotation,before};
  77. long[] positions = new long[] {pos,pos,pos,pos,pos};
  78. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  79. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  80. Expression pcExpr = new StringLiteral(pointcutExpression.toCharArray(),pos,pos,1);
  81. MemberValuePair[] mvps = new MemberValuePair[2];
  82. mvps[0] = new MemberValuePair("value".toCharArray(),pos,pos,pcExpr);
  83. Expression argNamesExpr = new StringLiteral(argNames.toCharArray(),pos,pos,1);
  84. mvps[1] = new MemberValuePair("argNames".toCharArray(),pos,pos,argNamesExpr);
  85. ann.memberValuePairs = mvps;
  86. return ann;
  87. }
  88. public static Annotation createAfterAnnotation(String pointcutExpression, String argNames, int pos) {
  89. char[][] typeName = new char[][] {org,aspectj,lang,annotation,after};
  90. long[] positions = new long[] {pos,pos,pos,pos,pos};
  91. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  92. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  93. Expression pcExpr = new StringLiteral(pointcutExpression.toCharArray(),pos,pos,1);
  94. MemberValuePair[] mvps = new MemberValuePair[2];
  95. mvps[0] = new MemberValuePair("value".toCharArray(),pos,pos,pcExpr);
  96. Expression argNamesExpr = new StringLiteral(argNames.toCharArray(),pos,pos,1);
  97. mvps[1] = new MemberValuePair("argNames".toCharArray(),pos,pos,argNamesExpr);
  98. ann.memberValuePairs = mvps;
  99. return ann;
  100. }
  101. public static Annotation createAfterReturningAnnotation(String pointcutExpression, String argNames, String extraArgumentName, int pos) {
  102. char[][] typeName = new char[][] {org,aspectj,lang,annotation,afterReturning};
  103. long[] positions = new long[] {pos,pos,pos,pos,pos};
  104. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  105. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  106. Expression pcExpr = new StringLiteral(pointcutExpression.toCharArray(),pos,pos,1);
  107. MemberValuePair[] mvps = new MemberValuePair[3];
  108. mvps[0] = new MemberValuePair("pointcut".toCharArray(),pos,pos,pcExpr);
  109. Expression argExpr = new StringLiteral(extraArgumentName.toCharArray(),pos,pos,1);
  110. mvps[1] = new MemberValuePair("returning".toCharArray(),pos,pos,argExpr);
  111. Expression argNamesExpr = new StringLiteral(argNames.toCharArray(),pos,pos,1);
  112. mvps[2] = new MemberValuePair("argNames".toCharArray(),pos,pos,argNamesExpr);
  113. ann.memberValuePairs = mvps;
  114. return ann;
  115. }
  116. public static Annotation createAfterThrowingAnnotation(String pointcutExpression, String argNames, String extraArgumentName, int pos) {
  117. char[][] typeName = new char[][] {org,aspectj,lang,annotation,afterThrowing};
  118. long[] positions = new long[] {pos,pos,pos,pos,pos};
  119. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  120. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  121. Expression pcExpr = new StringLiteral(pointcutExpression.toCharArray(),pos,pos,1);
  122. MemberValuePair[] mvps = new MemberValuePair[3];
  123. mvps[0] = new MemberValuePair("pointcut".toCharArray(),pos,pos,pcExpr);
  124. Expression argExpr = new StringLiteral(extraArgumentName.toCharArray(),pos,pos,1);
  125. mvps[1] = new MemberValuePair("throwing".toCharArray(),pos,pos,argExpr);
  126. Expression argNamesExpr = new StringLiteral(argNames.toCharArray(),pos,pos,1);
  127. mvps[2] = new MemberValuePair("argNames".toCharArray(),pos,pos,argNamesExpr);
  128. ann.memberValuePairs = mvps;
  129. return ann;
  130. }
  131. public static Annotation createAroundAnnotation(String pointcutExpression, String argNames, int pos) {
  132. char[][] typeName = new char[][] {org,aspectj,lang,annotation,around};
  133. long[] positions = new long[] {pos,pos,pos,pos,pos};
  134. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  135. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  136. Expression pcExpr = new StringLiteral(pointcutExpression.toCharArray(),pos,pos,1);
  137. MemberValuePair[] mvps = new MemberValuePair[2];
  138. mvps[0] = new MemberValuePair("value".toCharArray(),pos,pos,pcExpr);
  139. Expression argNamesExpr = new StringLiteral(argNames.toCharArray(),pos,pos,1);
  140. mvps[1] = new MemberValuePair("argNames".toCharArray(),pos,pos,argNamesExpr);
  141. ann.memberValuePairs = mvps;
  142. return ann;
  143. }
  144. public static Annotation createPointcutAnnotation(String pointcutExpression, String argNames, int pos) {
  145. char[][] typeName = new char[][] {org,aspectj,lang,annotation,pointcut};
  146. long[] positions = new long[] {pos,pos,pos,pos,pos};
  147. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  148. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  149. Expression pcExpr = new StringLiteral(pointcutExpression.toCharArray(),pos,pos,1);
  150. MemberValuePair[] mvps = new MemberValuePair[2];
  151. mvps[0] = new MemberValuePair("value".toCharArray(),pos,pos,pcExpr);
  152. Expression argExpr = new StringLiteral(argNames.toCharArray(),pos,pos,1);
  153. mvps[1] = new MemberValuePair("argNames".toCharArray(),pos,pos,argExpr);
  154. ann.memberValuePairs = mvps;
  155. return ann;
  156. }
  157. public static Annotation createDeclareErrorOrWarningAnnotation(String pointcutExpression, String message, boolean isError, int pos) {
  158. char[][] typeName = new char[][] {org,aspectj,internal,lang,annotation,declareErrorOrWarning};
  159. long[] positions = new long[typeName.length];
  160. for (int i = 0; i < positions.length; i++) positions[i] = pos;
  161. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  162. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  163. Expression pcutExpr = new StringLiteral(pointcutExpression.toCharArray(),pos,pos,1);
  164. Expression msgExpr = new StringLiteral(message.toCharArray(),pos,pos,1);
  165. Expression isErrorExpr;
  166. if (isError) {
  167. isErrorExpr = new TrueLiteral(pos,pos);
  168. } else {
  169. isErrorExpr = new FalseLiteral(pos,pos);
  170. }
  171. MemberValuePair[] mvps = new MemberValuePair[3];
  172. mvps[0] = new MemberValuePair("pointcut".toCharArray(),pos,pos,pcutExpr);
  173. mvps[1] = new MemberValuePair("message".toCharArray(),pos,pos,msgExpr);
  174. mvps[2] = new MemberValuePair("isError".toCharArray(),pos,pos,isErrorExpr);
  175. ann.memberValuePairs = mvps;
  176. return ann;
  177. }
  178. public static Annotation createDeclareParentsAnnotation(String childPattern, String parentPatterns, boolean isExtends, int pos) {
  179. char[][] typeName = new char[][] {org,aspectj,internal,lang,annotation,declareParents};
  180. long[] positions = new long[typeName.length];
  181. for (int i = 0; i < positions.length; i++) positions[i] = pos;
  182. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  183. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  184. Expression targetExpression = new StringLiteral(childPattern.toCharArray(),pos,pos,1);
  185. Expression parentsExpression = new StringLiteral(parentPatterns.toCharArray(),pos,pos,1);
  186. Expression isExtendsExpression;
  187. if (isExtends) {
  188. isExtendsExpression = new TrueLiteral(pos,pos);
  189. } else {
  190. isExtendsExpression = new FalseLiteral(pos,pos);
  191. }
  192. MemberValuePair[] mvps = new MemberValuePair[3];
  193. mvps[0] = new MemberValuePair("targetTypePattern".toCharArray(),pos,pos,targetExpression);
  194. mvps[1] = new MemberValuePair("parentTypes".toCharArray(),pos,pos,parentsExpression);
  195. mvps[2] = new MemberValuePair("isExtends".toCharArray(),pos,pos,isExtendsExpression);
  196. ann.memberValuePairs = mvps;
  197. return ann;
  198. }
  199. public static Annotation createDeclareSoftAnnotation(String pointcutExpression, String exceptionType, int pos) {
  200. char[][] typeName = new char[][] {org,aspectj,internal,lang,annotation,declareSoft};
  201. long[] positions = new long[typeName.length];
  202. for (int i = 0; i < positions.length; i++) positions[i] = pos;
  203. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  204. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  205. Expression pcutExpr = new StringLiteral(pointcutExpression.toCharArray(),pos,pos,1);
  206. Expression exExpr = new StringLiteral(exceptionType.toCharArray(),pos,pos,1);
  207. MemberValuePair[] mvps = new MemberValuePair[2];
  208. mvps[0] = new MemberValuePair("pointcut".toCharArray(),pos,pos,pcutExpr);
  209. mvps[1] = new MemberValuePair("exceptionType".toCharArray(),pos,pos,exExpr);
  210. ann.memberValuePairs = mvps;
  211. return ann;
  212. }
  213. public static Annotation createDeclareAnnAnnotation(String patternString, String annString, String kind, int pos) {
  214. char[][] typeName = new char[][] {org,aspectj,internal,lang,annotation,declareAnnotation};
  215. long[] positions = new long[typeName.length];
  216. for (int i = 0; i < positions.length; i++) positions[i] = pos;
  217. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  218. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  219. Expression pattExpr = new StringLiteral(patternString.toCharArray(),pos,pos,1);
  220. Expression annExpr = new StringLiteral(annString.toCharArray(),pos,pos,1);
  221. Expression kindExpr = new StringLiteral(kind.toCharArray(),pos,pos,1);
  222. MemberValuePair[] mvps = new MemberValuePair[3];
  223. mvps[0] = new MemberValuePair("pattern".toCharArray(),pos,pos,pattExpr);
  224. mvps[1] = new MemberValuePair("annotation".toCharArray(),pos,pos,annExpr);
  225. mvps[2] = new MemberValuePair("kind".toCharArray(),pos,pos,kindExpr);
  226. ann.memberValuePairs = mvps;
  227. return ann;
  228. }
  229. public static Annotation createITDAnnotation(char[] targetTypeName, int modifiers, char[] name, int pos) {
  230. char[][] typeName = new char[][] {org,aspectj,internal,lang,annotation,itdAnnotation};
  231. long[] positions = new long[typeName.length];
  232. for (int i = 0; i < positions.length; i++) positions[i] = pos;
  233. TypeReference annType = new QualifiedTypeReference(typeName,positions);
  234. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  235. Expression targetExpr = new StringLiteral(targetTypeName,pos,pos,1);
  236. Expression nameExpr = new StringLiteral(name,pos,pos,1);
  237. Expression modsExpr = IntLiteral.buildIntLiteral(Integer.toString(modifiers).toCharArray(),pos,pos);
  238. MemberValuePair[] mvps = new MemberValuePair[3];
  239. mvps[0] = new MemberValuePair("targetType".toCharArray(),pos,pos,targetExpr);
  240. mvps[1] = new MemberValuePair("name".toCharArray(),pos,pos,nameExpr);
  241. mvps[2] = new MemberValuePair("modifiers".toCharArray(),pos,pos,modsExpr);
  242. ann.memberValuePairs = mvps;
  243. return ann;
  244. }
  245. public static Annotation createDeclarePrecedenceAnnotation(String pointcutExpression, int pos) {
  246. char[][] typeName = new char[][] {org,aspectj,internal,lang,annotation,declarePrecedence};
  247. return makeSingleStringMemberAnnotation(typeName, pos, pointcutExpression);
  248. }
  249. private static Annotation makeSingleStringMemberAnnotation(char[][] name, int pos, String annValue) {
  250. long[] positions = new long[name.length];
  251. for (int i = 0; i < positions.length; i++) positions[i] = pos;
  252. TypeReference annType = new QualifiedTypeReference(name,positions);
  253. NormalAnnotation ann = new NormalAnnotation(annType,pos);
  254. Expression valueExpr = new StringLiteral(annValue.toCharArray(),pos,pos,1);
  255. MemberValuePair[] mvps = new MemberValuePair[1];
  256. mvps[0] = new MemberValuePair(value,pos,pos,valueExpr);
  257. ann.memberValuePairs = mvps;
  258. return ann;
  259. }
  260. public static void addAnnotation(AjMethodDeclaration decl, Annotation annotation, BlockScope scope) {
  261. if (decl.annotations == null) {
  262. decl.annotations = new Annotation[] { annotation };
  263. } else {
  264. Annotation[] old = decl.annotations;
  265. decl.annotations = new Annotation[old.length +1];
  266. System.arraycopy(old,0,decl.annotations,0,old.length);
  267. decl.annotations[old.length] = annotation;
  268. }
  269. if (decl.binding!= null) {
  270. if ((decl.binding.tagBits & TagBits.AnnotationResolved) != 0) {
  271. annotation.resolve(scope);
  272. }
  273. }
  274. }
  275. }