1616package org .springframework .data .repository .aot .generate ;
1717
1818import java .lang .reflect .Method ;
19+ import java .lang .reflect .Parameter ;
1920import java .util .ArrayList ;
21+ import java .util .Collections ;
2022import java .util .LinkedHashMap ;
2123import java .util .List ;
2224import java .util .Map ;
2325import java .util .Map .Entry ;
26+ import java .util .function .Function ;
2427
2528import org .jspecify .annotations .Nullable ;
29+
2630import org .springframework .core .DefaultParameterNameDiscoverer ;
2731import org .springframework .core .MethodParameter ;
2832import org .springframework .core .ParameterNameDiscoverer ;
4044 */
4145class MethodMetadata {
4246
43- private final Map <String , ParameterSpec > methodArguments = new LinkedHashMap <>() ;
44- private final Map <String , MethodParameter > methodParameters = new LinkedHashMap <>() ;
47+ private final Map <String , ParameterSpec > methodArguments ;
48+ private final Map <String , MethodParameter > methodParameters ;
4549 private final Map <String , String > localVariables = new LinkedHashMap <>();
4650 private final ResolvableType actualReturnType ;
4751 private final ResolvableType returnType ;
@@ -50,24 +54,39 @@ class MethodMetadata {
5054
5155 this .returnType = repositoryInformation .getReturnType (method ).toResolvableType ();
5256 this .actualReturnType = repositoryInformation .getReturnedDomainTypeInformation (method ).toResolvableType ();
53- this .initParameters (repositoryInformation , method , new DefaultParameterNameDiscoverer ());
54- }
5557
56- private void initParameters ( RepositoryInformation repositoryInformation , Method method ,
57- ParameterNameDiscoverer nameDiscoverer ) {
58+ Map < String , ParameterSpec > methodArguments = new LinkedHashMap <>();
59+ Map < String , MethodParameter > methodParameters = new LinkedHashMap <>();
5860
5961 ResolvableType repositoryInterface = ResolvableType .forClass (repositoryInformation .getRepositoryInterface ());
62+ ParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer ();
63+
64+ initializeMethodArguments (method , nameDiscoverer , repositoryInterface , methodArguments , methodParameters );
65+
66+ this .methodArguments = Collections .unmodifiableMap (methodArguments );
67+ this .methodParameters = Collections .unmodifiableMap (methodParameters );
68+ }
6069
61- for (java .lang .reflect .Parameter parameter : method .getParameters ()) {
70+ private static void initializeMethodArguments (Method method , ParameterNameDiscoverer nameDiscoverer ,
71+ ResolvableType repositoryInterface , Map <String , ParameterSpec > methodArguments ,
72+ Map <String , MethodParameter > methodParameters ) {
73+
74+ for (Parameter parameter : method .getParameters ()) {
6275
6376 MethodParameter methodParameter = MethodParameter .forParameter (parameter );
6477 methodParameter .initParameterNameDiscovery (nameDiscoverer );
6578 ResolvableType resolvableParameterType = ResolvableType .forMethodParameter (methodParameter , repositoryInterface );
6679
6780 TypeName parameterType = TypeName .get (resolvableParameterType .getType ());
6881
69- addParameter (ParameterSpec .builder (parameterType , methodParameter .getParameterName ()).build ());
70- methodParameters .put (methodParameter .getParameterName (), methodParameter );
82+ ParameterSpec parameterSpec = ParameterSpec .builder (parameterType , methodParameter .getParameterName ()).build ();
83+
84+ if (methodArguments .containsKey (parameterSpec .name ())) {
85+ throw new IllegalStateException ("Parameter with name '" + parameterSpec .name () + "' already exists." );
86+ }
87+
88+ methodArguments .put (parameterSpec .name (), parameterSpec );
89+ methodParameters .put (parameterSpec .name (), methodParameter );
7190 }
7291 }
7392
@@ -79,10 +98,6 @@ ResolvableType getActualReturnType() {
7998 return actualReturnType ;
8099 }
81100
82- void addParameter (ParameterSpec parameterSpec ) {
83- this .methodArguments .put (parameterSpec .name (), parameterSpec );
84- }
85-
86101 Map <String , ParameterSpec > getMethodArguments () {
87102 return methodArguments ;
88103 }
@@ -105,8 +120,9 @@ String getParameterName(int position) {
105120 return null ;
106121 }
107122
108- Map <String , String > getLocalVariables () {
109- return localVariables ;
123+ public String getOrCreateLocalVariable (String variableName ,
124+ Function <? super String , ? extends String > mappingFunction ) {
125+ return localVariables .computeIfAbsent (variableName , mappingFunction );
110126 }
111127
112128}
0 commit comments