25
25
import static javax .lang .model .element .Modifier .PRIVATE ;
26
26
import static javax .lang .model .element .Modifier .PUBLIC ;
27
27
import static javax .lang .model .element .Modifier .STATIC ;
28
+ import static net .jbock .compiler .OptionType .REPEATABLE ;
28
29
29
30
final class Analyser {
30
31
@@ -112,26 +113,35 @@ private static MethodSpec removeFirstFlagMethod() {
112
113
.build ();
113
114
}
114
115
115
- private static MethodSpec checkConflictMethod (TypeName optionMapType , ClassName optionClass ,
116
- ClassName optionTypeClass , FieldSpec optionType ) {
117
- ParameterSpec optionMap = ParameterSpec .builder (optionMapType , "optionMap" ).build ();
116
+ private static MethodSpec checkConflictMethod (
117
+ TypeName optionMapType ,
118
+ ClassName optionClass ,
119
+ ClassName optionTypeClass ,
120
+ FieldSpec optionType ) {
121
+ ParameterSpec optMap = ParameterSpec .builder (optionMapType , "optionMap" ).build ();
118
122
ParameterSpec token = ParameterSpec .builder (STRING , "token" ).build ();
119
123
ParameterSpec option = ParameterSpec .builder (optionClass , "option" ).build ();
120
124
ParameterSpec message = ParameterSpec .builder (STRING , "message" ).build ();
125
+ ParameterSpec bucket = ParameterSpec .builder (STRING_LIST , "bucket" ).build ();
126
+ ParameterSpec ignore = ParameterSpec .builder (optionClass , "__" ).build ();
121
127
CodeBlock block = CodeBlock .builder ()
122
- .beginControlFlow ("if ($N.$N == $T.$L)" , option , optionType , optionTypeClass , OptionType .REPEATABLE )
123
- .addStatement ("return" )
128
+ .addStatement ("$T $N = $N.computeIfAbsent($N, $N -> new $T<>())" ,
129
+ bucket .type , bucket , optMap , option , ignore , ArrayList .class )
130
+ .beginControlFlow ("if ($N.$N == $T.$L)" , option , optionType , optionTypeClass , REPEATABLE )
131
+ .addStatement ("return $N" , bucket )
124
132
.endControlFlow ()
125
- .beginControlFlow ("if ($N.containsKey($N ))" , optionMap , option )
126
- .addStatement ("$T $N = $N.$N == $T.$L ? $S : $S" , STRING , message , option , optionType ,
133
+ .beginControlFlow ("if (! $N.isEmpty( ))" , bucket )
134
+ .addStatement ("$T $N = $N.$N == $T.$L ?\n $S :\n $S" , STRING , message , option , optionType ,
127
135
optionTypeClass , OptionType .FLAG , "Duplicate flag" , "Conflicting token" )
128
136
.addStatement ("throw new $T($N + $S + $N)" , IllegalArgumentException .class ,
129
137
message , ": " , token )
130
138
.endControlFlow ()
139
+ .addStatement ("return $N" , bucket )
131
140
.build ();
132
141
return MethodSpec .methodBuilder ("checkConflict" )
133
- .addParameters (Arrays .asList (optionMap , option , token ))
142
+ .addParameters (Arrays .asList (optMap , option , token ))
134
143
.addCode (block )
144
+ .returns (STRING_LIST )
135
145
.addModifiers (PRIVATE , STATIC )
136
146
.build ();
137
147
}
@@ -200,9 +210,10 @@ private MethodSpec parseMethod() {
200
210
.build ();
201
211
}
202
212
203
- private static MethodSpec readOptionMethod (ClassName keysClass ,
204
- FieldSpec longNames , FieldSpec shortNames ,
205
- ClassName optionClass ) {
213
+ private static MethodSpec readOptionMethod (
214
+ ClassName keysClass ,
215
+ FieldSpec longNames , FieldSpec shortNames ,
216
+ ClassName optionClass ) {
206
217
ParameterSpec names = ParameterSpec .builder (keysClass , "names" ).build ();
207
218
ParameterSpec token = ParameterSpec .builder (STRING , "token" ).build ();
208
219
ParameterSpec idxe = ParameterSpec .builder (INT , "idxe" ).build ();
@@ -211,18 +222,14 @@ private static MethodSpec readOptionMethod(ClassName keysClass,
211
222
.beginControlFlow ("if ($N.length() < 2 || !$N.startsWith($S))" , token , token , "-" )
212
223
.addStatement ("return null" )
213
224
.endControlFlow ()
214
- .beginControlFlow ("if ($N.startsWith($S))" , token , "--" )
215
- .addStatement ("$T $N = $N.indexOf('=')" , INT , idxe , token )
216
- .beginControlFlow ("if ($N < 0)" , idxe )
217
- .addStatement ("return $N.$N.get($N.substring(2))" ,
218
- names , longNames , token )
219
- .endControlFlow ()
220
- .addStatement ("return $N.$N.get($N.substring(2, $N))" ,
221
- names , longNames , token , idxe )
225
+ .beginControlFlow ("if (!$N.startsWith($S))" , token , "--" )
226
+ .addStatement ("return $N.$N.get($N.substring(1, 2))" , names , shortNames , token )
222
227
.endControlFlow ()
223
- .addStatement ("return $N.$N.get($N.substring(1, 2))" ,
224
- names , shortNames , token );
225
-
228
+ .addStatement ("$T $N = $N.indexOf('=')" , INT , idxe , token )
229
+ .beginControlFlow ("if ($N < 0)" , idxe )
230
+ .addStatement ("return $N.$N.get($N.substring(2))" , names , longNames , token )
231
+ .endControlFlow ()
232
+ .addStatement ("return $N.$N.get($N.substring(2, $N))" , names , longNames , token , idxe );
226
233
//@formatter:on
227
234
return MethodSpec .methodBuilder ("readOption" )
228
235
.addParameters (Arrays .asList (names , token ))
@@ -265,54 +272,52 @@ private static MethodSpec readArgumentMethod() {
265
272
.build ();
266
273
}
267
274
268
- private static MethodSpec readMethod (ClassName keysClass ,
269
- MethodSpec readOption ,
270
- MethodSpec readArgument ,
271
- TypeName optionMapType ,
272
- ClassName optionClass ,
273
- FieldSpec optionType ,
274
- ClassName optionTypeClass ,
275
- MethodSpec checkConflict ,
276
- MethodSpec removeFirstFlag ) {
275
+ private static MethodSpec readMethod (
276
+ ClassName keysClass ,
277
+ MethodSpec readOption ,
278
+ MethodSpec readArgument ,
279
+ TypeName optionMapType ,
280
+ ClassName optionClass ,
281
+ FieldSpec optionType ,
282
+ ClassName optionTypeClass ,
283
+ MethodSpec checkConflict ,
284
+ MethodSpec removeFirstFlag ) {
277
285
ParameterSpec names = ParameterSpec .builder (keysClass , "names" ).build ();
278
286
ParameterSpec optMap = ParameterSpec .builder (optionMapType , "optMap" ).build ();
279
287
ParameterSpec otherTokens = ParameterSpec .builder (STRING_LIST , "otherTokens" ).build ();
280
288
ParameterSpec it = ParameterSpec .builder (STRING_ITERATOR , "it" ).build ();
281
289
ParameterSpec bucket = ParameterSpec .builder (STRING_LIST , "bucket" ).build ();
282
290
291
+ ParameterSpec originalToken = ParameterSpec .builder (STRING , "originalToken" ).build ();
283
292
ParameterSpec token = ParameterSpec .builder (STRING , "token" ).build ();
284
293
ParameterSpec option = ParameterSpec .builder (optionClass , "option" ).build ();
285
294
ParameterSpec ignore = ParameterSpec .builder (optionClass , "__" ).build ();
286
295
//@formatter:off
287
296
CodeBlock .Builder builder = CodeBlock .builder ()
297
+ .addStatement ("$T $N = $N" , STRING , token , originalToken )
288
298
.addStatement ("$T $N = $N($N, $N)" , option .type , option , readOption , names , token )
289
299
.beginControlFlow ("if ($N == null)" , option )
290
300
.addStatement ("$N.add($N)" , otherTokens , token )
291
301
.addStatement ("return" )
292
302
.endControlFlow ()
293
- .addStatement ("$N($N, $N, $N)" , checkConflict , optMap , option , token )
294
- .addStatement ("$T $N = $N.computeIfAbsent($N, $N -> new $T<>())" ,
295
- bucket .type , bucket , optMap , option , ignore , ArrayList .class )
296
303
.beginControlFlow ("while ($N.$N == $T.$L)" , option , optionType , optionTypeClass , OptionType .FLAG )
304
+ .addStatement ("$T $N = $N($N, $N, $N)" , bucket .type , bucket , checkConflict , optMap , option , token )
297
305
.addStatement ("$N.add($S)" , bucket , "t" )
298
306
.addStatement ("$N = $N($N)" , token , removeFirstFlag , token )
299
307
.beginControlFlow ("if ($N == null)" , token )
300
- .addStatement ("break " )
308
+ .addStatement ("return " )
301
309
.endControlFlow ()
302
310
.addStatement ("$N = $N($N, $N)" , option , readOption , names , token )
303
311
.beginControlFlow ("if ($N == null)" , option )
304
- .addStatement ("throw new $T($S)" , IllegalArgumentException .class ,
305
- "invalid token" )
312
+ .addStatement ("throw new $T($S + $N )" , IllegalArgumentException .class ,
313
+ "invalid token: " , originalToken )
306
314
.endControlFlow ()
307
- .addStatement ("$N = $N.computeIfAbsent($N, $N -> new $T<>())" ,
308
- bucket , optMap , option , ignore , ArrayList .class )
309
315
.endControlFlow ()
310
- .beginControlFlow ("if ($N.type != $T.$L)" , option , optionTypeClass , OptionType .FLAG )
311
- .addStatement ("$N.add($N($N, $N))" , bucket , readArgument , token , it )
312
- .endControlFlow ();
316
+ .addStatement ("$T $N = $N($N, $N, $N)" , bucket .type , bucket , checkConflict , optMap , option , token )
317
+ .addStatement ("$N.add($N($N, $N))" , bucket , readArgument , token , it );
313
318
//@formatter:on
314
319
return MethodSpec .methodBuilder ("read" )
315
- .addParameters (Arrays .asList (token , names , optMap , otherTokens , it ))
320
+ .addParameters (Arrays .asList (originalToken , names , optMap , otherTokens , it ))
316
321
.addModifiers (STATIC , PRIVATE )
317
322
.addCode (builder .build ())
318
323
.build ();
0 commit comments