16
16
package org .springframework .data .repository .aot .generate ;
17
17
18
18
import java .lang .reflect .Method ;
19
+ import java .util .ArrayList ;
19
20
import java .util .LinkedHashMap ;
21
+ import java .util .List ;
20
22
import java .util .Map ;
21
23
import java .util .Map .Entry ;
22
24
23
25
import org .jspecify .annotations .Nullable ;
24
-
26
+ import org .springframework .core .DefaultParameterNameDiscoverer ;
27
+ import org .springframework .core .MethodParameter ;
28
+ import org .springframework .core .ParameterNameDiscoverer ;
25
29
import org .springframework .core .ResolvableType ;
26
30
import org .springframework .data .repository .core .RepositoryInformation ;
27
31
import org .springframework .javapoet .ParameterSpec ;
31
35
* Metadata about an AOT Repository method.
32
36
*
33
37
* @author Christoph Strobl
38
+ * @since 4.0
34
39
*/
35
40
class MethodMetadata {
36
41
37
42
private final Map <String , ParameterSpec > methodArguments = new LinkedHashMap <>();
38
43
private final ResolvableType actualReturnType ;
39
44
private final ResolvableType returnType ;
40
45
41
- public MethodMetadata (RepositoryInformation repositoryInformation , Method method ) {
46
+ MethodMetadata (RepositoryInformation repositoryInformation , Method method ) {
42
47
43
48
this .returnType = repositoryInformation .getReturnType (method ).toResolvableType ();
44
49
this .actualReturnType = ResolvableType .forType (repositoryInformation .getReturnedDomainClass (method ));
50
+ this .initParameters (repositoryInformation , method , new DefaultParameterNameDiscoverer ());
45
51
}
46
52
47
53
@ Nullable
@@ -54,20 +60,50 @@ public String getParameterNameOf(Class<?> type) {
54
60
return null ;
55
61
}
56
62
57
- public ResolvableType getReturnType () {
63
+ ResolvableType getReturnType () {
58
64
return returnType ;
59
65
}
60
66
61
- public ResolvableType getActualReturnType () {
67
+ ResolvableType getActualReturnType () {
62
68
return actualReturnType ;
63
69
}
64
70
65
- public void addParameter (ParameterSpec parameterSpec ) {
71
+ void addParameter (ParameterSpec parameterSpec ) {
66
72
this .methodArguments .put (parameterSpec .name , parameterSpec );
67
73
}
68
74
69
- public Map <String , ParameterSpec > getMethodArguments () {
75
+ Map <String , ParameterSpec > getMethodArguments () {
70
76
return methodArguments ;
71
77
}
72
78
79
+ @ Nullable
80
+ String getParameterName (int position ) {
81
+
82
+ if (0 > position ) {
83
+ return null ;
84
+ }
85
+
86
+ List <Entry <String , ParameterSpec >> entries = new ArrayList <>(methodArguments .entrySet ());
87
+ if (position < entries .size ()) {
88
+ return entries .get (position ).getKey ();
89
+ }
90
+ return null ;
91
+ }
92
+
93
+ private void initParameters (RepositoryInformation repositoryInformation , Method method ,
94
+ ParameterNameDiscoverer nameDiscoverer ) {
95
+
96
+ ResolvableType repositoryInterface = ResolvableType .forClass (repositoryInformation .getRepositoryInterface ());
97
+
98
+ for (java .lang .reflect .Parameter parameter : method .getParameters ()) {
99
+
100
+ MethodParameter methodParameter = MethodParameter .forParameter (parameter );
101
+ methodParameter .initParameterNameDiscovery (nameDiscoverer );
102
+ ResolvableType resolvableParameterType = ResolvableType .forMethodParameter (methodParameter , repositoryInterface );
103
+
104
+ TypeName parameterType = TypeName .get (resolvableParameterType .getType ());
105
+
106
+ addParameter (ParameterSpec .builder (parameterType , methodParameter .getParameterName ()).build ());
107
+ }
108
+ }
73
109
}
0 commit comments