-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
ParameterContext.java
133 lines (119 loc) · 3.82 KB
/
ParameterContext.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
* Copyright 2015-2024 the original author or authors.
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v2.0 which
* accompanies this distribution and is available at
*
* https://www.eclipse.org/legal/epl-v20.html
*/
package org.junit.jupiter.api.extension;
import static org.apiguardian.api.API.Status.EXPERIMENTAL;
import static org.apiguardian.api.API.Status.STABLE;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Executable;
import java.lang.reflect.Parameter;
import java.util.List;
import java.util.Optional;
import org.apiguardian.api.API;
/**
* {@code ParameterContext} encapsulates the <em>context</em> in which an
* {@link #getDeclaringExecutable Executable} will be invoked for a given
* {@link #getParameter Parameter}.
*
* <p>A {@code ParameterContext} is used to support parameter resolution via
* a {@link ParameterResolver}.
*
* @since 5.0
* @see ParameterResolver
* @see java.lang.reflect.Parameter
* @see java.lang.reflect.Executable
* @see java.lang.reflect.Method
* @see java.lang.reflect.Constructor
*/
@API(status = STABLE, since = "5.0")
public interface ParameterContext extends AnnotatedElementContext {
/**
* Get the {@link Parameter} for this context.
*
* <h4>WARNING</h4>
* <p>When searching for annotations on the parameter in this context,
* favor {@link #isAnnotated(Class)}, {@link #findAnnotation(Class)}, and
* {@link #findRepeatableAnnotations(Class)} over methods in the
* {@link Parameter} API due to a bug in {@code javac} on JDK versions prior
* to JDK 9.
*
* @return the parameter; never {@code null}
* @see #getIndex()
*/
Parameter getParameter();
/**
* Get the index of the {@link Parameter} for this context within the
* parameter list of the {@link #getDeclaringExecutable Executable} that
* declares the parameter.
*
* @return the index of the parameter
* @see #getParameter()
* @see Executable#getParameters()
*/
int getIndex();
/**
* Get the {@link Executable} (i.e., the {@link java.lang.reflect.Method} or
* {@link java.lang.reflect.Constructor}) that declares the {@code Parameter}
* for this context.
*
* @return the declaring {@code Executable}; never {@code null}
* @see Parameter#getDeclaringExecutable()
*/
default Executable getDeclaringExecutable() {
return getParameter().getDeclaringExecutable();
}
/**
* Get the target on which the {@link #getDeclaringExecutable Executable}
* that declares the {@link #getParameter Parameter} for this context will
* be invoked, if available.
*
* @return an {@link Optional} containing the target on which the
* {@code Executable} will be invoked; never {@code null} but will be
* <em>empty</em> if the {@code Executable} is a constructor or a
* {@code static} method.
*/
Optional<Object> getTarget();
/**
* {@inheritDoc}
* @since 5.10
*/
@API(status = EXPERIMENTAL, since = "5.10")
@Override
default AnnotatedElement getAnnotatedElement() {
return getParameter();
}
/**
* {@inheritDoc}
* @since 5.1.1
*/
@API(status = STABLE, since = "5.10")
@Override
default boolean isAnnotated(Class<? extends Annotation> annotationType) {
return AnnotatedElementContext.super.isAnnotated(annotationType);
}
/**
* {@inheritDoc}
* @since 5.1.1
*/
@API(status = STABLE, since = "5.10")
@Override
default <A extends Annotation> Optional<A> findAnnotation(Class<A> annotationType) {
return AnnotatedElementContext.super.findAnnotation(annotationType);
}
/**
* {@inheritDoc}
* @since 5.1.1
*/
@API(status = STABLE, since = "5.10")
@Override
default <A extends Annotation> List<A> findRepeatableAnnotations(Class<A> annotationType) {
return AnnotatedElementContext.super.findRepeatableAnnotations(annotationType);
}
}