/* ******************************************************************* * Copyright (c) 2008 Contributors * All rights reserved. * This program and the accompanying materials are made available * under the terms of the Eclipse Public License v1.0 * which accompanies this distribution and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors * Andy Clement * ******************************************************************/ package org.aspectj.systemtest.ajc160; import java.io.File; import junit.framework.Test; import org.aspectj.testing.XMLBasedAjcTestCase; /** * Parameter annotation matching * * The full implementation will require static matching, binding and possibly runtime * matching (need to check on inheritance of annotations specified in these positions). * The extension to the syntax for method-signatures is to require parentheses when * specifying annotations relating to parameters and parameter types - the position of * the parentheses enable the distinction to be made between annotations attached to * the type of the parameter and annotations attached to the parameter itself. * * For example: * * public void goo(MyType s) {} // where MyType has annotation @B * public void foo(@A String s) {} // String has no annotations, @A is a parameter annotation * * A method signature to match the former would be: * execution(public void goo(@B MyType)) * or execution(public void goo((@B MyType))) * * To match the latter: * execution(public void foo(@A (String))) * The parentheses around String are telling us that there are no annotations attached to the * parameter type we are interested in, and @A should be treated as an intent to match on * parameter annotation A. * * In a more complex case: * public void hoo(@A MyType s) {} // now there are two potential annotations we are interested in * the match expression is: * execution(public void hoo(@A (@B MyType))) * the parentheses associating @B with the type of the parameter leaving @A outside to be * treated as a parameter annotation. * * Testplan: * Test cases for the parameter annotation matching: * DONE: * 1. Basic pointcut parsing for the new method signature syntax * 2. Expression matching with the new syntax * 3. Real static matching with the new syntax * 4. hasmethod should pick up the new syntax * 5. ellipsis usage not impacted * 6. recognizing varargs * 7. constructor matching * 8. binary weaving * * NOT DONE: * . New pointcut designator parsing * . Expression matching with the new syntax * . Real matching with the new syntax * . Binding with the new syntax. * . complaining about annotations that dont target the right type * . itds * . annotation visibility tests * . wildcarded @Ann*1 - broken (not my doing) * . ltw * */ public class ParameterAnnotationMatchingTests extends XMLBasedAjcTestCase { public void testDeow() { runTest("deow"); } public void testDeow2() { runTest("deow2"); } public void testNoWarningForWrongType() { runTest("no xlint for wrong target");} public void testVariousCombinations() { runTest("various combinations"); } public void testVariousCombinationsCtors() { runTest("various combinations - ctors"); } public void testHasMethod() { runTest("hasmethod"); } public void testBinaryWeaving() { runTest("binary weaving"); } // this is broken and it was already broken before I added parameter annotation matching ! // public void testWildcardedAnnotationMatching() { runTest("wildcarded matching"); } ///////////////////////////////////////// public static Test suite() { return XMLBasedAjcTestCase.loadSuite(ParameterAnnotationMatchingTests.class); } protected File getSpecFile() { return new File("../tests/src/org/aspectj/systemtest/ajc160/parameterAnnotations.xml"); } }