@@ -113,71 +113,45 @@ public static ClassDescriptor getEncodingClassDescriptor(ClassInfo classInfo, bo
113113 return desc ;
114114 }
115115
116- // TODO: do not remove, set fromNames to []
117116 private static void decodingDeduplicate (ClassDescriptor desc ) {
118- HashMap <String , Binding > byName = new HashMap <String , Binding >();
117+ HashMap <String , Binding > byFromName = new HashMap <String , Binding >();
118+ HashMap <String , Binding > byFieldName = new HashMap <String , Binding >();
119119 for (Binding field : desc .fields ) {
120120 for (String fromName : field .fromNames ) {
121- if (byName .containsKey (fromName )) {
121+ if (byFromName .containsKey (fromName )) {
122122 throw new JsonException ("field decode from same name: " + fromName );
123123 }
124- byName .put (fromName , field );
124+ byFromName .put (fromName , field );
125125 }
126+ byFieldName .put (field .name , field );
126127 }
127128 ArrayList <Binding > iteratingSetters = new ArrayList <Binding >(desc .setters );
128129 Collections .reverse (iteratingSetters );
129130 for (Binding setter : iteratingSetters ) {
130- for (String fromName : setter .fromNames ) {
131- Binding existing = byName .get (fromName );
132- if (existing == null ) {
133- byName .put (fromName , setter );
134- continue ;
135- }
136- if (desc .fields .remove (existing )) {
137- continue ;
138- }
139- if (existing .method != null && existing .method .getName ().equals (setter .method .getName ())) {
140- // inherited interface setter
141- // iterate in reverse order, so that the setter from child class will be kept
142- desc .setters .remove (existing );
143- continue ;
144- }
145- throw new JsonException ("setter decode from same name: " + fromName );
131+ Binding existing = byFieldName .get (setter .name );
132+ if (existing != null ) {
133+ existing .fromNames = new String [0 ];
146134 }
135+ deduplicateByFromName (byFromName , setter );
147136 }
148137 for (WrapperDescriptor wrapper : desc .bindingTypeWrappers ) {
149138 for (Binding param : wrapper .parameters ) {
150- for (String fromName : param .fromNames ) {
151- Binding existing = byName .get (fromName );
152- if (existing == null ) {
153- byName .put (fromName , param );
154- continue ;
155- }
156- if (desc .fields .remove (existing )) {
157- continue ;
158- }
159- if (desc .setters .remove (existing )) {
160- continue ;
161- }
162- throw new JsonException ("wrapper parameter decode from same name: " + fromName );
163- }
139+ deduplicateByFromName (byFromName , param );
164140 }
165141 }
166142 for (Binding param : desc .ctor .parameters ) {
167- for (String fromName : param .fromNames ) {
168- Binding existing = byName .get (fromName );
169- if (existing == null ) {
170- byName .put (fromName , param );
171- continue ;
172- }
173- if (desc .fields .remove (existing )) {
174- continue ;
175- }
176- if (desc .setters .remove (existing )) {
177- continue ;
178- }
179- throw new JsonException ("ctor parameter decode from same name: " + fromName );
143+ deduplicateByFromName (byFromName , param );
144+ }
145+ }
146+
147+ private static void deduplicateByFromName (Map <String , Binding > byFromName , Binding setter ) {
148+ for (String fromName : setter .fromNames ) {
149+ Binding existing = byFromName .get (fromName );
150+ if (existing == null ) {
151+ byFromName .put (fromName , setter );
152+ continue ;
180153 }
154+ existing .fromNames = new String [0 ];
181155 }
182156 }
183157
0 commit comments