01: /**
02: * Spoon - http://spoon.gforge.inria.fr/
03: * Copyright (C) 2006 INRIA Futurs <renaud.pawlak@inria.fr>
04: *
05: * This software is governed by the CeCILL-C License under French law and
06: * abiding by the rules of distribution of free software. You can use,
07: * modify and/or redistribute the software under the terms of the
08: * CeCILL-C
09: * license as circulated by CEA, CNRS and INRIA at the following URL:
10: * http://www.cecill.info.
11: *
12: * This program is distributed in the hope that it will be useful, but
13: * WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C
15: * License for more details.
16: *
17: * The fact that you are presently reading this means that you have had
18: * knowledge of the CeCILL-C license and that you accept its terms.
19: */package spoon.aval.annotation.structure;
20:
21: import java.lang.annotation.Annotation;
22: import java.lang.annotation.Retention;
23: import java.lang.annotation.RetentionPolicy;
24:
25: import spoon.aval.annotation.Implementation;
26: import spoon.aval.support.validator.InsideValidator;
27: import spoon.aval.support.validator.problemFixer.DefaultInsideProblemFixer;
28: import spoon.aval.support.validator.problemFixer.RemoveThisAnnotation;
29: import spoon.processing.ProblemFixer;
30: import spoon.processing.Severity;
31: import spoon.reflect.declaration.CtAnnotationType;
32:
33: /**
34: * Validator that states that the annotation can only be placed elements which
35: * are <em>inside</em> elements that are annotated with another element.
36: * <p>
37: * For example if <code>@B</code> can only be placed on fields of classes that are annotated with
38: * <code>@A</code>, the declaration of <code>@B</code> would be:
39: * <pre>
40: * @Inside(A.class)
41: * @Target(FIELD)
42: * public @interface B{}
43: * </pre>
44: *
45: * @see spoon.aval.support.validator.InsideValidator
46: */
47: @Retention(RetentionPolicy.RUNTIME)
48: @AValTarget(CtAnnotationType.class)
49: @Implementation(InsideValidator.class)
50: public @interface Inside {
51: /**
52: * The parent annotation
53: */
54: Class<? extends Annotation> value();
55:
56: /**
57: * Message to report when validation fails
58: */
59: String message() default "The use of this annotation is only permited on an element inside @?val annotation ";
60:
61: /**
62: * Severity of the validation faliure
63: */
64: Severity severity() default Severity.WARNING;
65:
66: /**
67: * The list of {@link ProblemFixer}s to propose
68: * when the validation fails.
69: */
70: Class<? extends ProblemFixer>[] fixers() default {
71: DefaultInsideProblemFixer.class, RemoveThisAnnotation.class };
72: }
|