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.

ASTVisitorTest.java 36KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008
  1. /*******************************************************************************
  2. * Copyright (c) 2000, 2010 IBM Corporation and others.
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v 2.0
  5. * which accompanies this distribution, and is available at
  6. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  7. *
  8. * Contributors:
  9. * IBM Corporation - initial API and implementation
  10. *******************************************************************************/
  11. package org.aspectj.tools.ajc;
  12. import java.util.HashMap;
  13. import java.util.Map;
  14. import org.aspectj.org.eclipse.jdt.core.JavaCore;
  15. import org.aspectj.org.eclipse.jdt.core.dom.AST;
  16. import org.aspectj.org.eclipse.jdt.core.dom.ASTParser;
  17. import org.aspectj.org.eclipse.jdt.core.dom.AbstractBooleanTypePattern;
  18. import org.aspectj.org.eclipse.jdt.core.dom.AfterAdviceDeclaration;
  19. import org.aspectj.org.eclipse.jdt.core.dom.AfterReturningAdviceDeclaration;
  20. import org.aspectj.org.eclipse.jdt.core.dom.AfterThrowingAdviceDeclaration;
  21. import org.aspectj.org.eclipse.jdt.core.dom.AjASTVisitor;
  22. import org.aspectj.org.eclipse.jdt.core.dom.AjTypeDeclaration;
  23. import org.aspectj.org.eclipse.jdt.core.dom.AndTypePattern;
  24. import org.aspectj.org.eclipse.jdt.core.dom.AnyTypePattern;
  25. import org.aspectj.org.eclipse.jdt.core.dom.AnyWithAnnotationTypePattern;
  26. import org.aspectj.org.eclipse.jdt.core.dom.AroundAdviceDeclaration;
  27. import org.aspectj.org.eclipse.jdt.core.dom.AspectDeclaration;
  28. import org.aspectj.org.eclipse.jdt.core.dom.Assignment;
  29. import org.aspectj.org.eclipse.jdt.core.dom.BeforeAdviceDeclaration;
  30. import org.aspectj.org.eclipse.jdt.core.dom.BindingTypePattern;
  31. import org.aspectj.org.eclipse.jdt.core.dom.Block;
  32. import org.aspectj.org.eclipse.jdt.core.dom.BlockComment;
  33. import org.aspectj.org.eclipse.jdt.core.dom.BodyDeclaration;
  34. import org.aspectj.org.eclipse.jdt.core.dom.CompilationUnit;
  35. import org.aspectj.org.eclipse.jdt.core.dom.DeclareAtConstructorDeclaration;
  36. import org.aspectj.org.eclipse.jdt.core.dom.DeclareAtFieldDeclaration;
  37. import org.aspectj.org.eclipse.jdt.core.dom.DeclareAtMethodDeclaration;
  38. import org.aspectj.org.eclipse.jdt.core.dom.DeclareAtTypeDeclaration;
  39. import org.aspectj.org.eclipse.jdt.core.dom.DeclareErrorDeclaration;
  40. import org.aspectj.org.eclipse.jdt.core.dom.DeclareParentsDeclaration;
  41. import org.aspectj.org.eclipse.jdt.core.dom.DeclarePrecedenceDeclaration;
  42. import org.aspectj.org.eclipse.jdt.core.dom.DeclareSoftDeclaration;
  43. import org.aspectj.org.eclipse.jdt.core.dom.DeclareWarningDeclaration;
  44. import org.aspectj.org.eclipse.jdt.core.dom.EnumDeclaration;
  45. import org.aspectj.org.eclipse.jdt.core.dom.ExactTypePattern;
  46. import org.aspectj.org.eclipse.jdt.core.dom.ExpressionStatement;
  47. import org.aspectj.org.eclipse.jdt.core.dom.FieldAccess;
  48. import org.aspectj.org.eclipse.jdt.core.dom.FieldDeclaration;
  49. import org.aspectj.org.eclipse.jdt.core.dom.IdentifierTypePattern;
  50. import org.aspectj.org.eclipse.jdt.core.dom.InfixExpression;
  51. import org.aspectj.org.eclipse.jdt.core.dom.Initializer;
  52. import org.aspectj.org.eclipse.jdt.core.dom.InterTypeFieldDeclaration;
  53. import org.aspectj.org.eclipse.jdt.core.dom.InterTypeMethodDeclaration;
  54. import org.aspectj.org.eclipse.jdt.core.dom.MethodDeclaration;
  55. import org.aspectj.org.eclipse.jdt.core.dom.MethodInvocation;
  56. import org.aspectj.org.eclipse.jdt.core.dom.NotTypePattern;
  57. import org.aspectj.org.eclipse.jdt.core.dom.NumberLiteral;
  58. import org.aspectj.org.eclipse.jdt.core.dom.OrTypePattern;
  59. import org.aspectj.org.eclipse.jdt.core.dom.PerCflow;
  60. import org.aspectj.org.eclipse.jdt.core.dom.PerObject;
  61. import org.aspectj.org.eclipse.jdt.core.dom.PerTypeWithin;
  62. import org.aspectj.org.eclipse.jdt.core.dom.PointcutDeclaration;
  63. import org.aspectj.org.eclipse.jdt.core.dom.PrimitiveType;
  64. import org.aspectj.org.eclipse.jdt.core.dom.QualifiedName;
  65. import org.aspectj.org.eclipse.jdt.core.dom.ReferencePointcut;
  66. import org.aspectj.org.eclipse.jdt.core.dom.SignaturePattern;
  67. import org.aspectj.org.eclipse.jdt.core.dom.SimpleName;
  68. import org.aspectj.org.eclipse.jdt.core.dom.StringLiteral;
  69. import org.aspectj.org.eclipse.jdt.core.dom.TypeCategoryTypePattern;
  70. import org.aspectj.org.eclipse.jdt.core.dom.TypeDeclaration;
  71. import org.aspectj.org.eclipse.jdt.core.dom.VariableDeclaration;
  72. import org.aspectj.org.eclipse.jdt.core.dom.VariableDeclarationStatement;
  73. import org.aspectj.org.eclipse.jdt.core.dom.WildTypePattern;
  74. import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
  75. import junit.framework.TestCase;
  76. public class ASTVisitorTest extends TestCase {
  77. public void testEnum_pr211201() {
  78. check("public enum BasicEnum {"+
  79. "A = 1, B = 2, C = 3;"+
  80. "public int getNumberOfEnumerators(){"+
  81. " return 3;"+
  82. "}"+
  83. "}","(compilationUnit(enum(simpleName)(simpleName)(simpleName)(simpleName)(method(primitiveType)(simpleName)(block(numberLiteral)))))");
  84. }
  85. // from bug 110465 - will currently break because of casts
  86. public void testAspectWithITD() {
  87. check("aspect A{ public void B.x(){} }",
  88. "(compilationUnit(aspect(simpleName)(methodITD(primitiveType)(simpleName)(block))))");
  89. }
  90. public void testAspectWithCommentThenITD() {
  91. check("aspect A{ /** */ public void B.x(){} }",
  92. "(compilationUnit(aspect(simpleName)(methodITD(primitiveType)(simpleName)(block))))");
  93. }
  94. public void testAspectWithCommentThenPointcut() {
  95. check("aspect A{ /** */ pointcut x(); }","(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  96. }
  97. public void testAPrivilegedAspect() {
  98. check("privileged aspect AnAspect{}","(compilationUnit(privileged(aspect(simpleName))))");
  99. }
  100. // original tests
  101. public void testAnInterface() {
  102. check("interface AnInterface{}","(compilationUnit(interface(simpleName)))");
  103. }
  104. public void testAnAspect() {
  105. check("aspect AnAspect{}","(compilationUnit(aspect(simpleName)))");
  106. }
  107. public void testPointcutInClass() {
  108. check("class A {pointcut a();}",
  109. "(compilationUnit(class(simpleName)(pointcut(simpleName))))");
  110. }
  111. public void testPointcutInAspect() {
  112. check("aspect A {pointcut a();}","(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  113. }
  114. public void testAroundAdvice() {
  115. check("aspect A {pointcut a();void around():a(){}}",
  116. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(aroundAdvice(primitiveType)(referencePointcut(simpleName))(block))))");
  117. }
  118. public void testAroundAdviceWithProceed() {
  119. // ajh02: currently proceed calls are just normal method calls
  120. // could add a special AST node for them if anyone would like
  121. check("aspect A {pointcut a();void around():a(){proceed();}}",
  122. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(aroundAdvice(primitiveType)(referencePointcut(simpleName))(block(expressionStatement(methodInvocation(simpleName)))))))");
  123. }
  124. public void testBeforeAdvice() {
  125. check("aspect A {pointcut a();before():a(){}}",
  126. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(beforeAdvice(referencePointcut(simpleName))(block))))");
  127. }
  128. public void testAfterAdvice() {
  129. check("aspect A {pointcut a();after():a(){}}",
  130. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(afterAdvice(referencePointcut(simpleName))(block))))");
  131. }
  132. public void testAfterThrowingAdviceWithNoArgument() {
  133. check("aspect A {pointcut a();after()throwing:a(){} }",
  134. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(afterThrowingAdvice(referencePointcut(simpleName))(block))))");
  135. }
  136. public void testAfterThrowingAdvice() {
  137. check("aspect A {pointcut a();after()throwing(Exception e):a(){} }",
  138. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(afterThrowingAdvice(referencePointcut(simpleName))(simpleName)(simpleName)(block))))");
  139. }
  140. public void testAfterReturningAdviceWithNoArgument() {
  141. check("aspect A {pointcut a();after()returning:a(){}}",
  142. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(afterReturningAdvice(referencePointcut(simpleName))(block))))");
  143. }
  144. public void testAfterReturningAdvice() {
  145. check("aspect A {pointcut a();after()returning(Object o):a(){}}",
  146. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(afterReturningAdvice(referencePointcut(simpleName))(simpleName)(simpleName)(block))))");
  147. }
  148. public void testMethodWithStatements() {
  149. check("class A {void a(){System.out.println(\"a\");}}",
  150. "(compilationUnit(class(simpleName)(method(primitiveType)(simpleName)(block(expressionStatement(methodInvocation(qualifiedName(simpleName)(simpleName))(simpleName)(stringLiteral)))))))");
  151. }
  152. public void testAdviceWithStatements() {
  153. check("aspect A {pointcut a();before():a(){System.out.println(\"a\");}}",
  154. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(beforeAdvice(referencePointcut(simpleName))(block(expressionStatement(methodInvocation(qualifiedName(simpleName)(simpleName))(simpleName)(stringLiteral)))))))");
  155. }
  156. public void testPointcutInAPointcut() {
  157. check("aspect A {pointcut a();pointcut b();pointcut c(): a() && b();}",
  158. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(pointcut(simpleName))(pointcut(simpleName)(referencePointcut(simpleName))(referencePointcut(simpleName)))))");
  159. }
  160. public void testCallPointcut(){
  161. check("aspect A {pointcut a(): call(* *.*(..));}",
  162. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  163. }
  164. public void testExecutionPointcut(){
  165. check("aspect A {pointcut a(): execution(* *.*(..));}",
  166. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  167. }
  168. public void testGetPointcut(){
  169. check("aspect A {pointcut a(): get(* *.*);}",
  170. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  171. }
  172. public void testSetPointcut(){
  173. check("aspect A {pointcut a(): set(* *.*);}",
  174. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  175. }
  176. public void testHandlerPointcut(){
  177. check("aspect A {pointcut a(): handler(Exception+);}",
  178. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  179. }
  180. public void testStaticInitializationPointcut(){
  181. check("aspect A {pointcut a(): staticinitialization(Object+);}",
  182. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  183. }
  184. public void testInitializationPointcut(){
  185. check("aspect A {pointcut a(): initialization(public Object+.new());}",
  186. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  187. }
  188. public void testPreInitializationPointcut(){
  189. check("aspect A {pointcut a(): preinitialization(public Object+.new());}",
  190. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  191. }
  192. public void testAdviceExecutionPointcut(){
  193. check("aspect A {pointcut a(): adviceexecution();}",
  194. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  195. }
  196. public void testPointcutWithoutArguments(){
  197. check("aspect A {pointcut a(): adviceexecution();}",
  198. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))))");
  199. }
  200. public void testPointcutWithOnePrimitiveArgument(){
  201. check("aspect A {pointcut a(int a): adviceexecution();}",
  202. "(compilationUnit(aspect(simpleName)(pointcut(simpleName)(primitiveType)(simpleName))))");
  203. }
  204. public void testPointcutWithTwoPrimitiveArguments(){
  205. check("aspect A {pointcut a(int a, double b): adviceexecution();}",
  206. "(compilationUnit(aspect(simpleName)(pointcut" +
  207. "(simpleName)(primitiveType)(simpleName)(primitiveType)" +
  208. "(simpleName))))");
  209. }
  210. public void testPointcutWithOneTypedArgument(){
  211. check("aspect A {pointcut a(A a): adviceexecution();}",
  212. "(compilationUnit(aspect(simpleName)(pointcut" +
  213. "(simpleName)(simpleName)" +
  214. "(simpleName))))");
  215. }
  216. public void testPointcutWithTwoTypedArgument(){
  217. check("aspect A {pointcut a(A a, B b): adviceexecution();}",
  218. "(compilationUnit(aspect(simpleName)(pointcut" +
  219. "(simpleName)(simpleName)" +
  220. "(simpleName)(simpleName)" +
  221. "(simpleName))))");
  222. }
  223. public void testFieldITD(){
  224. check("class A {}aspect B {int A.a;}",
  225. "(compilationUnit(class(simpleName))(aspect(simpleName)(fieldITD(primitiveType)(simpleName))))");
  226. }
  227. public void testMethodITD(){
  228. check("class A {}aspect B {void A.a(){}}",
  229. "(compilationUnit(class(simpleName))(aspect(simpleName)(methodITD(primitiveType)(simpleName)(block))))");
  230. }
  231. public void testConstructorITD(){
  232. check("class A {}aspect B {A.new(){}}",
  233. "(compilationUnit(class(simpleName))(aspect(simpleName)(constructorITD(primitiveType)(simpleName)(block))))");
  234. }
  235. public void testInitializedField(){
  236. check("class A{int a = 1;}",
  237. "(compilationUnit(class(simpleName)(field(primitiveType)(simpleName)(numberLiteral))))");
  238. }
  239. public void testMethodITDWithStatements(){
  240. check("class A {}aspect B {void A.a(){System.out.println(\"a\");}}",
  241. "(compilationUnit(class(simpleName))(aspect(simpleName)(methodITD(primitiveType)(simpleName)(block(expressionStatement(methodInvocation(qualifiedName(simpleName)(simpleName))(simpleName)(stringLiteral)))))))");
  242. }
  243. public void testConstructorITDWithStatements(){
  244. check("class A {}aspect B {A.new(){System.out.println(\"a\");}}",
  245. "(compilationUnit(class(simpleName))(aspect(simpleName)(constructorITD(primitiveType)(simpleName)(block(expressionStatement(methodInvocation(qualifiedName(simpleName)(simpleName))(simpleName)(stringLiteral)))))))");
  246. }
  247. public void testInitializedFieldITD(){
  248. check("class A {}aspect B {int A.a = 1;}",
  249. "(compilationUnit(class(simpleName))(aspect(simpleName)(fieldITD(primitiveType)(simpleName)(numberLiteral))))");
  250. }
  251. public void testMethodBeingCalled(){
  252. check("class A {void a(){}void b(){a();}}",
  253. "(compilationUnit(class(simpleName)(method(primitiveType)(simpleName)(block))(method(primitiveType)(simpleName)(block(expressionStatement(methodInvocation(simpleName)))))))");
  254. }
  255. public void testFieldBeingCalled(){
  256. check("class A {int a;void b(){int c = a;a = c;}}",
  257. "(compilationUnit(class(simpleName)(field(primitiveType)(simpleName))(method(primitiveType)(simpleName)(block(variableDeclarationStatement(primitiveType)(simpleName)(simpleName))(expressionStatement(assignment(simpleName)(simpleName)))))))");
  258. }
  259. public void testConstructorBeingCalled(){
  260. check("class A {A(){}void b(){A();}}",
  261. "(compilationUnit(class(simpleName)(constructor(simpleName)(block))(method(primitiveType)(simpleName)(block(expressionStatement(methodInvocation(simpleName)))))))");
  262. }
  263. public void testMethodITDBeingCalled(){
  264. check("class A {void b(){a();}}aspect B {void A.a(){}}",
  265. "(compilationUnit(class(simpleName)(method(primitiveType)(simpleName)(block(expressionStatement(methodInvocation(simpleName))))))(aspect(simpleName)(methodITD(primitiveType)(simpleName)(block))))");
  266. }
  267. public void testFieldITDBeingCalled(){
  268. check("class A {void b(){int c = a;a = c;}}aspect B {int A.a;}",
  269. "(compilationUnit(class(simpleName)(method(primitiveType)(simpleName)(block(variableDeclarationStatement(primitiveType)(simpleName)(simpleName))(expressionStatement(assignment(simpleName)(simpleName))))))(aspect(simpleName)(fieldITD(primitiveType)(simpleName))))");
  270. }
  271. public void testConstructorITDBeingCalled(){
  272. check("class A {void b(){A();}}aspect B {A.new(){}}",
  273. "(compilationUnit(class(simpleName)(method(primitiveType)(simpleName)(block(expressionStatement(methodInvocation(simpleName))))))(aspect(simpleName)(constructorITD(primitiveType)(simpleName)(block))))");
  274. }
  275. /*
  276. *
  277. * START: Test TypePattern nodes introduced in Bugzilla 329268.
  278. *
  279. */
  280. public void testDeclareParents() {
  281. check("class A{}class B{}aspect C {declare parents : A extends B;}",
  282. "(compilationUnit(class(simpleName))(class(simpleName))(aspect(simpleName)(declareParents(wildTypePattern)(wildTypePattern))))");
  283. }
  284. public void testDeclareParentsAnyTypePattern() {
  285. check("class A{}class B{}aspect C {declare parents : * extends B;}",
  286. "(compilationUnit(class(simpleName))(class(simpleName))(aspect(simpleName)(declareParents(anyTypePattern)(wildTypePattern))))");
  287. }
  288. public void testDeclareParentsAndTypePattern() {
  289. check("class A{}class B{}class D{}class E{}aspect C {declare parents : A && B && D extends E;}",
  290. "(compilationUnit(class(simpleName))(class(simpleName))(class(simpleName))(class(simpleName))(aspect(simpleName)(declareParents((wildTypePattern)andTypePattern((wildTypePattern)andTypePattern(wildTypePattern)))(wildTypePattern))))");
  291. }
  292. public void testDeclareParentsOrTypePattern() {
  293. check("class A{}class B{}class D{}class E{}aspect C {declare parents : A || B || D extends E;}",
  294. "(compilationUnit(class(simpleName))(class(simpleName))(class(simpleName))(class(simpleName))(aspect(simpleName)(declareParents((wildTypePattern)orTypePattern((wildTypePattern)orTypePattern(wildTypePattern)))(wildTypePattern))))");
  295. }
  296. public void testDeclareParentsAndOrTypePattern() {
  297. check("class A{}class B{}class D{}class E{}aspect C {declare parents : A && (B || D) extends E;}",
  298. "(compilationUnit(class(simpleName))(class(simpleName))(class(simpleName))(class(simpleName))(aspect(simpleName)(declareParents((wildTypePattern)andTypePattern((wildTypePattern)orTypePattern(wildTypePattern)))(wildTypePattern))))");
  299. }
  300. public void testDeclareParentsOrAndTypePattern() {
  301. check("class A{}class B{}class D{}class E{}aspect C {declare parents : A || B && D extends E;}",
  302. "(compilationUnit(class(simpleName))(class(simpleName))(class(simpleName))(class(simpleName))(aspect(simpleName)(declareParents((wildTypePattern)orTypePattern((wildTypePattern)andTypePattern(wildTypePattern)))(wildTypePattern))))");
  303. }
  304. public void testDeclareParentsNotTypePattern() {
  305. check("class A{}class B{}class D{}class E{}aspect C {declare parents : A && !B extends E;}",
  306. "(compilationUnit(class(simpleName))(class(simpleName))(class(simpleName))(class(simpleName))(aspect(simpleName)(declareParents((wildTypePattern)andTypePattern(notTypePattern(wildTypePattern)))(wildTypePattern))))");
  307. }
  308. public void testDeclareParentsTypeCategoryTypePattern() {
  309. check("class A{}class E{}aspect C {declare parents : A && is(ClassType) extends E;}",
  310. "(compilationUnit(class(simpleName))(class(simpleName))(aspect(simpleName)(declareParents((wildTypePattern)andTypePattern(typeCategoryTypePattern))(wildTypePattern))))");
  311. }
  312. public void testDeclareParentsTypeCategoryTypePatternNot() {
  313. check("class A{}class E{}aspect C {declare parents : A && !is(InnerType) extends E;}",
  314. "(compilationUnit(class(simpleName))(class(simpleName))(aspect(simpleName)(declareParents((wildTypePattern)andTypePattern(notTypePattern(typeCategoryTypePattern)))(wildTypePattern))))");
  315. }
  316. public void testDeclareParentsAnyWithAnnotationTypePattern() {
  317. check("class E{}aspect C {declare parents : (@AnnotationT *) extends E;}",
  318. "(compilationUnit(class(simpleName))(aspect(simpleName)(declareParents(anyWithAnnotationTypePattern)(wildTypePattern))))");
  319. }
  320. /*
  321. *
  322. * END: Test TypePattern nodes introduced in Bugzilla 329268.
  323. *
  324. */
  325. public void testDeclareWarning(){
  326. check("aspect A {pointcut a();declare warning: a(): \"warning\";}",
  327. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(declareWarning(referencePointcut(simpleName))(stringLiteral))))");
  328. }
  329. public void testDeclareError(){
  330. check("aspect A {pointcut a();declare error: a(): \"error\";}",
  331. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(declareError(referencePointcut(simpleName))(stringLiteral))))");
  332. }
  333. public void testDeclareSoft(){
  334. check("aspect A {pointcut a();declare soft: Exception+: a();}",
  335. "(compilationUnit(aspect(simpleName)(pointcut(simpleName))(declareSoft(referencePointcut(simpleName))(wildTypePattern))))");
  336. }
  337. public void testDeclarePrecedence(){
  338. check("aspect A{}aspect B{declare precedence: B,A;}",
  339. "(compilationUnit(aspect(simpleName))(aspect(simpleName)(declarePrecedence(wildTypePattern)(wildTypePattern))))");
  340. }
  341. public void testDeclareAnnotationType(){
  342. checkJLS3("@interface MyAnnotation{}class C{}aspect A{declare @type: C : @MyAnnotation;}",
  343. "(compilationUnit(simpleName)(class(simpleName))(aspect(simpleName)(declareAtType(wildTypePattern)(simpleName))))");
  344. }
  345. public void testDeclareAnnotationMethod(){
  346. checkJLS3("@interface MyAnnotation{}class C{}aspect A{declare @method:public * C.*(..) : @MyAnnotation;}",
  347. "(compilationUnit(simpleName)(class(simpleName))(aspect(simpleName)(declareAtMethod(signaturePattern)(simpleName))))");
  348. }
  349. public void testDeclareAnnotationField(){
  350. checkJLS3("@interface MyAnnotation{}class C{}aspect A{declare @field: * C+.* : @MyAnnotation;}",
  351. "(compilationUnit(simpleName)(class(simpleName))(aspect(simpleName)(declareAtField(signaturePattern)(simpleName))))");
  352. }
  353. public void testDeclareAnnotationConstructor(){
  354. checkJLS3("@interface MyAnnotation{}class C{}aspect A{declare @constructor: C+.new(..) : @MyAnnotation;}",
  355. "(compilationUnit(simpleName)(class(simpleName))(aspect(simpleName)(declareAtConstructor(signaturePattern)(simpleName))))");
  356. }
  357. public void testPerThis(){
  358. check("aspect A perthis(a()) {pointcut a();}",
  359. "(compilationUnit(aspect(simpleName)(perObject(referencePointcut(simpleName)))(pointcut(simpleName)))))");
  360. }
  361. public void testPerTarget(){
  362. check("aspect A pertarget(a()) {pointcut a();}",
  363. "(compilationUnit(aspect(simpleName)(perObject(referencePointcut(simpleName)))(pointcut(simpleName)))))");
  364. }
  365. public void testPerCFlow(){
  366. check("aspect A percflow(a()) {pointcut a();}",
  367. "(compilationUnit(aspect(simpleName)(perCflow(referencePointcut(simpleName)))(pointcut(simpleName)))))");
  368. }
  369. public void testPerCFlowBelow(){
  370. check("aspect A percflowbelow(a()) {pointcut a();}",
  371. "(compilationUnit(aspect(simpleName)(perCflow(referencePointcut(simpleName)))(pointcut(simpleName)))))");
  372. }
  373. private void check(String source, String expectedOutput){
  374. ASTParser parser = ASTParser.newParser(AST.JLS3);//JLS2); // ajh02: need to use 2 for returnType - in 3 it has "returnType2"
  375. Map<String, String> options = new HashMap<>();
  376. options.put(CompilerOptions.OPTION_Source, "1.5");
  377. parser.setCompilerOptions(options);//JavaCore.getOptions());
  378. parser.setSource(source.toCharArray());
  379. CompilationUnit cu2 = (CompilationUnit) parser.createAST(null);
  380. TestVisitor visitor = new TestVisitor();
  381. cu2.accept(visitor);
  382. String result = visitor.toString();
  383. System.err.println("actual:\n" + result);
  384. assertTrue("Expected:\n"+ expectedOutput + "====Actual:\n" + result,
  385. expectedOutput.equals(result));
  386. }
  387. private void checkJLS3(String source, String expectedOutput) {
  388. ASTParser parser = ASTParser.newParser(AST.JLS3);
  389. Map<String,String> options = new HashMap<>();
  390. options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_5);
  391. parser.setCompilerOptions(options);
  392. parser.setSource(source.toCharArray());
  393. CompilationUnit cu2 = (CompilationUnit) parser.createAST(null);
  394. TestVisitor visitor = new TestVisitor();
  395. cu2.accept(visitor);
  396. String result = visitor.toString();
  397. System.err.println("actual:\n" + result);
  398. assertTrue("Expected:\n"+ expectedOutput + "====Actual:\n" + result,
  399. expectedOutput.equals(result));
  400. }
  401. /** @deprecated using deprecated code */
  402. @Deprecated
  403. private static final int AST_INTERNAL_JLS2 = AST.JLS2;
  404. /**
  405. * @deprecated (not really - just suppressing the warnings
  406. * that come from testing Javadoc.getComment())
  407. *
  408. */
  409. @Deprecated
  410. @Override
  411. protected void setUp() throws Exception {
  412. super.setUp();
  413. }
  414. @Override
  415. protected void tearDown() throws Exception {
  416. super.tearDown();
  417. }
  418. protected CompilationUnit createAST(char[] source) {
  419. ASTParser parser= ASTParser.newParser(AST_INTERNAL_JLS2);
  420. parser.setSource(source);
  421. parser.setResolveBindings(false);
  422. return (CompilationUnit) parser.createAST(null);
  423. }
  424. }
  425. class TestVisitor extends AjASTVisitor {
  426. StringBuffer b = new StringBuffer();
  427. boolean visitTheKids = true;
  428. boolean visitDocTags;
  429. TestVisitor() {
  430. this(false);
  431. }
  432. @Override
  433. public String toString(){
  434. return b.toString();
  435. }
  436. TestVisitor(boolean visitDocTags) {
  437. super(visitDocTags);
  438. this.visitDocTags = visitDocTags;
  439. }
  440. public boolean isVisitingChildren() {
  441. return visitTheKids;
  442. }
  443. public void setVisitingChildren(boolean visitChildren) {
  444. visitTheKids = visitChildren;
  445. }
  446. @Override
  447. public boolean visit(TypeDeclaration node) {
  448. if (((AjTypeDeclaration)node).isAspect()) {
  449. if (((AspectDeclaration) node).isPrivileged()){
  450. b.append("(privileged");
  451. }
  452. b.append("(aspect"); //$NON-NLS-1$
  453. // if (((AspectDeclaration)node).getPerClause() != null){
  454. // b.append("{" + ((AspectDeclaration)node).getPerClause() + "}");
  455. // }
  456. } else if (node.isInterface()){
  457. b.append("(interface"); // $NON-NLS-1$
  458. } else {
  459. b.append("(class"); //$NON-NLS-1$
  460. }
  461. return isVisitingChildren();
  462. }
  463. @Override
  464. public void endVisit(TypeDeclaration node) {
  465. if (((AjTypeDeclaration)node).isAspect())
  466. if (((AspectDeclaration) node).isPrivileged()
  467. || ((AspectDeclaration)node).getPerClause() != null) {
  468. b.append(")");
  469. }
  470. b.append(")"); //$NON-NLS-1$
  471. }
  472. @Override
  473. public boolean visit(EnumDeclaration node) {
  474. b.append("(enum");
  475. return isVisitingChildren();
  476. }
  477. @Override
  478. public void endVisit(EnumDeclaration node) {
  479. b.append(")");
  480. }
  481. @Override
  482. public boolean visit(PointcutDeclaration node) {
  483. b.append("(pointcut"); //$NON-NLS-1$
  484. return isVisitingChildren();
  485. }
  486. @Override
  487. public void endVisit(PointcutDeclaration node) {
  488. b.append(")"); //$NON-NLS-1$
  489. }
  490. @Override
  491. public boolean visit(ReferencePointcut node) {
  492. b.append("(referencePointcut"); //$NON-NLS-1$
  493. return isVisitingChildren();
  494. }
  495. @Override
  496. public void endVisit(ReferencePointcut node) {
  497. b.append(")"); //$NON-NLS-1$
  498. }
  499. @Override
  500. public boolean visit(BeforeAdviceDeclaration node) {
  501. b.append("(beforeAdvice"); //$NON-NLS-1$
  502. return isVisitingChildren();
  503. }
  504. @Override
  505. public boolean visit(AroundAdviceDeclaration node) {
  506. b.append("(aroundAdvice"); //$NON-NLS-1$
  507. return isVisitingChildren();
  508. }
  509. @Override
  510. public boolean visit(AfterAdviceDeclaration node) {
  511. b.append("(afterAdvice"); //$NON-NLS-1$
  512. return isVisitingChildren();
  513. }
  514. @Override
  515. public boolean visit(AfterThrowingAdviceDeclaration node) {
  516. b.append("(afterThrowingAdvice"); //$NON-NLS-1$
  517. return isVisitingChildren();
  518. }
  519. @Override
  520. public boolean visit(AfterReturningAdviceDeclaration node) {
  521. b.append("(afterReturningAdvice"); //$NON-NLS-1$
  522. return isVisitingChildren();
  523. }
  524. @Override
  525. public void endVisit(BeforeAdviceDeclaration node) {
  526. b.append(")"); //$NON-NLS-1$
  527. }
  528. @Override
  529. public void endVisit(AroundAdviceDeclaration node) {
  530. b.append(")"); //$NON-NLS-1$
  531. }
  532. @Override
  533. public void endVisit(AfterAdviceDeclaration node) {
  534. b.append(")"); //$NON-NLS-1$
  535. }
  536. @Override
  537. public void endVisit(AfterThrowingAdviceDeclaration node) {
  538. b.append(")"); //$NON-NLS-1$
  539. }
  540. @Override
  541. public void endVisit(AfterReturningAdviceDeclaration node) {
  542. b.append(")"); //$NON-NLS-1$
  543. }
  544. @Override
  545. public boolean visit(MethodDeclaration node) {
  546. if (node instanceof InterTypeMethodDeclaration) return visit((InterTypeMethodDeclaration)node);
  547. if (node.isConstructor()){
  548. b.append("(constructor");
  549. } else {
  550. b.append("(method"); //$NON-NLS-1$
  551. }
  552. return isVisitingChildren();
  553. }
  554. @Override
  555. public void endVisit(MethodDeclaration node) {
  556. b.append(")"); //$NON-NLS-1$
  557. }
  558. @Override
  559. public boolean visit(InterTypeFieldDeclaration node) {
  560. b.append("(fieldITD"); //$NON-NLS-1$
  561. return isVisitingChildren();
  562. }
  563. @Override
  564. public void endVisit(InterTypeFieldDeclaration node) {
  565. b.append(")"); //$NON-NLS-1$
  566. }
  567. @Override
  568. public boolean visit(InterTypeMethodDeclaration node) {
  569. if (node.isConstructor()){
  570. b.append("(constructorITD");
  571. } else {
  572. b.append("(methodITD"); //$NON-NLS-1$
  573. }
  574. return isVisitingChildren();
  575. }
  576. @Override
  577. public void endVisit(InterTypeMethodDeclaration node) {
  578. b.append(")"); //$NON-NLS-1$
  579. }
  580. @Override
  581. public boolean visit(MethodInvocation node) {
  582. b.append("(methodInvocation"); //$NON-NLS-1$
  583. return isVisitingChildren();
  584. }
  585. @Override
  586. public void endVisit(MethodInvocation node) {
  587. b.append(")"); //$NON-NLS-1$
  588. }
  589. public boolean visit(BodyDeclaration node) {
  590. b.append("(methodInvocation"); //$NON-NLS-1$
  591. return isVisitingChildren();
  592. }
  593. public void endVisit(BodyDeclaration node) {
  594. b.append(")"); //$NON-NLS-1$
  595. }
  596. @Override
  597. public boolean visit(FieldDeclaration node) {
  598. b.append("(field"); //$NON-NLS-1$
  599. return isVisitingChildren();
  600. }
  601. @Override
  602. public void endVisit(FieldDeclaration node) {
  603. b.append(")"); //$NON-NLS-1$
  604. }
  605. @Override
  606. public boolean visit(FieldAccess node) {
  607. b.append("(fieldAccess"); //$NON-NLS-1$
  608. return isVisitingChildren();
  609. }
  610. @Override
  611. public void endVisit(FieldAccess node) {
  612. b.append(")"); //$NON-NLS-1$
  613. }
  614. @Override
  615. public boolean visit(Assignment node) {
  616. b.append("(assignment"); //$NON-NLS-1$
  617. return isVisitingChildren();
  618. }
  619. @Override
  620. public void endVisit(Assignment node) {
  621. b.append(")"); //$NON-NLS-1$
  622. }
  623. @Override
  624. public boolean visit(Block node) {
  625. b.append("(block"); //$NON-NLS-1$
  626. return isVisitingChildren();
  627. }
  628. @Override
  629. public void endVisit(Block node) {
  630. b.append(")"); //$NON-NLS-1$
  631. }
  632. @Override
  633. public boolean visit(CompilationUnit node) {
  634. b.append("(compilationUnit"); //$NON-NLS-1$
  635. return isVisitingChildren();
  636. }
  637. @Override
  638. public void endVisit(CompilationUnit node) {
  639. b.append(")"); //$NON-NLS-1$
  640. }
  641. @Override
  642. public boolean visit(ExpressionStatement node) {
  643. b.append("(expressionStatement"); //$NON-NLS-1$
  644. return isVisitingChildren();
  645. }
  646. @Override
  647. public void endVisit(ExpressionStatement node) {
  648. b.append(")"); //$NON-NLS-1$
  649. }
  650. @Override
  651. public boolean visit(InfixExpression node) {
  652. b.append("(infixExpression"); //$NON-NLS-1$
  653. return isVisitingChildren();
  654. }
  655. @Override
  656. public void endVisit(InfixExpression node) {
  657. b.append(")"); //$NON-NLS-1$
  658. }
  659. @Override
  660. public boolean visit(Initializer node) {
  661. b.append("(initializer"); //$NON-NLS-1$
  662. return isVisitingChildren();
  663. }
  664. @Override
  665. public void endVisit(Initializer node) {
  666. b.append(")"); //$NON-NLS-1$
  667. }
  668. @Override
  669. public boolean visit(NumberLiteral node) {
  670. b.append("(numberLiteral"); //$NON-NLS-1$
  671. return isVisitingChildren();
  672. }
  673. @Override
  674. public void endVisit(NumberLiteral node) {
  675. b.append(")"); //$NON-NLS-1$
  676. }
  677. @Override
  678. public boolean visit(PrimitiveType node) {
  679. b.append("(primitiveType"); //$NON-NLS-1$
  680. return isVisitingChildren();
  681. }
  682. @Override
  683. public void endVisit(PrimitiveType node) {
  684. b.append(")"); //$NON-NLS-1$
  685. }
  686. @Override
  687. public boolean visit(QualifiedName node) {
  688. b.append("(qualifiedName"); //$NON-NLS-1$
  689. return isVisitingChildren();
  690. }
  691. @Override
  692. public void endVisit(QualifiedName node) {
  693. b.append(")"); //$NON-NLS-1$
  694. }
  695. @Override
  696. public boolean visit(SimpleName node) {
  697. b.append("(simpleName"); //$NON-NLS-1$
  698. return isVisitingChildren();
  699. }
  700. @Override
  701. public void endVisit(SimpleName node) {
  702. b.append(")"); //$NON-NLS-1$
  703. }
  704. @Override
  705. public boolean visit(StringLiteral node) {
  706. b.append("(stringLiteral"); //$NON-NLS-1$
  707. return isVisitingChildren();
  708. }
  709. @Override
  710. public void endVisit(StringLiteral node) {
  711. b.append(")"); //$NON-NLS-1$
  712. }
  713. public boolean visit(VariableDeclaration node) {
  714. b.append("(variableDeclaration"); //$NON-NLS-1$
  715. return isVisitingChildren();
  716. }
  717. @Override
  718. public boolean visit(BlockComment bc) {
  719. b.append("(blockcomment");
  720. return isVisitingChildren();
  721. }
  722. @Override
  723. public void endVisit(BlockComment bc) {
  724. b.append(")");
  725. }
  726. public void endVisit(VariableDeclaration node) {
  727. b.append(")"); //$NON-NLS-1$
  728. }
  729. @Override
  730. public boolean visit(VariableDeclarationStatement node) {
  731. b.append("(variableDeclarationStatement"); //$NON-NLS-1$
  732. return isVisitingChildren();
  733. }
  734. @Override
  735. public void endVisit(VariableDeclarationStatement node) {
  736. b.append(")"); //$NON-NLS-1$
  737. }
  738. @Override
  739. public boolean visit(DeclareAtTypeDeclaration node) {
  740. b.append("(declareAtType");
  741. return isVisitingChildren();
  742. }
  743. @Override
  744. public boolean visit(DeclareAtMethodDeclaration node) {
  745. b.append("(declareAtMethod");
  746. return isVisitingChildren();
  747. }
  748. @Override
  749. public boolean visit(DeclareAtConstructorDeclaration node) {
  750. b.append("(declareAtConstructor");
  751. return isVisitingChildren();
  752. }
  753. @Override
  754. public boolean visit(DeclareAtFieldDeclaration node) {
  755. b.append("(declareAtField");
  756. return isVisitingChildren();
  757. }
  758. @Override
  759. public boolean visit(DeclareErrorDeclaration node) {
  760. b.append("(declareError");
  761. return isVisitingChildren();
  762. }
  763. @Override
  764. public boolean visit(DeclareParentsDeclaration node) {
  765. b.append("(declareParents");
  766. return isVisitingChildren();
  767. }
  768. @Override
  769. public boolean visit(DeclarePrecedenceDeclaration node) {
  770. b.append("(declarePrecedence");
  771. return isVisitingChildren();
  772. }
  773. @Override
  774. public boolean visit(DeclareSoftDeclaration node) {
  775. b.append("(declareSoft");
  776. return isVisitingChildren();
  777. }
  778. @Override
  779. public boolean visit(DeclareWarningDeclaration node) {
  780. b.append("(declareWarning");
  781. return isVisitingChildren();
  782. }
  783. @Override
  784. public void endVisit(DeclareErrorDeclaration node) {
  785. b.append(")"); //$NON-NLS-1$
  786. }
  787. @Override
  788. public void endVisit(DeclareParentsDeclaration node) {
  789. b.append(")"); //$NON-NLS-1$
  790. }
  791. @Override
  792. public void endVisit(DeclarePrecedenceDeclaration node) {
  793. b.append(")"); //$NON-NLS-1$
  794. }
  795. @Override
  796. public void endVisit(DeclareAtFieldDeclaration node) {
  797. b.append(")"); //$NON-NLS-1$
  798. }
  799. @Override
  800. public void endVisit(DeclareAtMethodDeclaration node) {
  801. b.append(")"); //$NON-NLS-1$
  802. }
  803. @Override
  804. public void endVisit(DeclareAtTypeDeclaration node) {
  805. b.append(")"); //$NON-NLS-1$
  806. }
  807. @Override
  808. public void endVisit(DeclareAtConstructorDeclaration node) {
  809. b.append(")"); //$NON-NLS-1$
  810. }
  811. @Override
  812. public void endVisit(DeclareSoftDeclaration node) {
  813. b.append(")"); //$NON-NLS-1$
  814. }
  815. @Override
  816. public void endVisit(DeclareWarningDeclaration node) {
  817. b.append(")"); //$NON-NLS-1$
  818. }
  819. @Override
  820. public boolean visit(AbstractBooleanTypePattern node) {
  821. b.append("(");
  822. node.getLeft().accept(this);
  823. if (node instanceof AndTypePattern) {
  824. b.append("andTypePattern");
  825. } else if (node instanceof OrTypePattern) {
  826. b.append("orTypePattern");
  827. }
  828. node.getRight().accept(this);
  829. b.append(")");
  830. // Don't visit the children, as that is done above in order (left node first, boolean operator next, right node last
  831. return false;
  832. }
  833. @Override
  834. public boolean visit(AnyTypePattern node) {
  835. b.append("(anyTypePattern");
  836. return isVisitingChildren();
  837. }
  838. @Override
  839. public void endVisit(AnyTypePattern node) {
  840. b.append(")");
  841. }
  842. @Override
  843. public boolean visit(AnyWithAnnotationTypePattern node) {
  844. b.append("(anyWithAnnotationTypePattern");
  845. return isVisitingChildren();
  846. }
  847. @Override
  848. public void endVisit(AnyWithAnnotationTypePattern node) {
  849. b.append(")");
  850. }
  851. @Override
  852. public boolean visit(IdentifierTypePattern node) {
  853. if (node instanceof WildTypePattern) {
  854. b.append("(wildTypePattern");
  855. } else if (node instanceof ExactTypePattern) {
  856. b.append("(exactTypePattern");
  857. } else if (node instanceof BindingTypePattern) {
  858. b.append("(bindingTypePattern");
  859. }
  860. return isVisitingChildren();
  861. }
  862. @Override
  863. public void endVisit(IdentifierTypePattern node) {
  864. b.append(")");
  865. }
  866. @Override
  867. public boolean visit(NotTypePattern node) {
  868. b.append("(notTypePattern");
  869. return isVisitingChildren();
  870. }
  871. @Override
  872. public void endVisit(NotTypePattern node) {
  873. b.append(")");
  874. }
  875. @Override
  876. public boolean visit(TypeCategoryTypePattern node) {
  877. b.append("(typeCategoryTypePattern");
  878. return isVisitingChildren();
  879. }
  880. @Override
  881. public void endVisit(TypeCategoryTypePattern node) {
  882. b.append(")");
  883. }
  884. // End of TypePattern additions for Bugzilla 329268
  885. @Override
  886. public boolean visit(SignaturePattern node) {
  887. b.append("(signaturePattern");
  888. return isVisitingChildren();
  889. }
  890. @Override
  891. public void endVisit(SignaturePattern node) {
  892. b.append(")"); //$NON-NLS-1$
  893. }
  894. @Override
  895. public boolean visit(PerObject node) {
  896. b.append("(perObject");
  897. return isVisitingChildren();
  898. }
  899. @Override
  900. public boolean visit(PerCflow node) {
  901. b.append("(perCflow");
  902. return isVisitingChildren();
  903. }
  904. @Override
  905. public boolean visit(PerTypeWithin node) {
  906. b.append("(perTypeWithin");
  907. return isVisitingChildren();
  908. }
  909. @Override
  910. public void endVisit(PerObject node) {
  911. b.append(")"); //$NON-NLS-1$
  912. }
  913. @Override
  914. public void endVisit(PerCflow node) {
  915. b.append(")"); //$NON-NLS-1$
  916. }
  917. @Override
  918. public void endVisit(PerTypeWithin node) {
  919. b.append(")"); //$NON-NLS-1$
  920. }
  921. }