6
6
import com .squareup .javapoet .TypeName ;
7
7
import com .squareup .javapoet .TypeSpec ;
8
8
9
- import java .util .Optional ;
9
+ import java .util .Arrays ;
10
+ import java .util .List ;
11
+ import java .util .Objects ;
10
12
11
13
import static com .squareup .javapoet .MethodSpec .constructorBuilder ;
12
14
import static com .squareup .javapoet .MethodSpec .methodBuilder ;
13
15
import static com .squareup .javapoet .ParameterSpec .builder ;
14
16
import static com .squareup .javapoet .TypeSpec .classBuilder ;
15
- import static java . util . Arrays . asList ;
17
+ import static javax . lang . model . element . Modifier . ABSTRACT ;
16
18
import static javax .lang .model .element .Modifier .FINAL ;
17
19
import static javax .lang .model .element .Modifier .PRIVATE ;
18
20
import static javax .lang .model .element .Modifier .PUBLIC ;
19
21
import static javax .lang .model .element .Modifier .STATIC ;
22
+ import static net .jbock .compiler .Constants .STRING ;
20
23
import static net .jbock .compiler .Parser .addPublicIfNecessary ;
21
- import static net .jbock .compiler .Util .optionalOf ;
22
24
23
25
/**
24
26
* Defines the inner class ParseResult.
@@ -27,69 +29,92 @@ final class ParseResult {
27
29
28
30
private final Context context ;
29
31
30
- final FieldSpec result ;
31
- final FieldSpec success ;
32
+ private final FieldSpec result ;
33
+ private final FieldSpec message = FieldSpec . builder ( STRING , "message" , PRIVATE , FINAL ). build () ;
32
34
33
- private ParseResult (Context context , FieldSpec result , FieldSpec success ) {
35
+ private ParseResult (Context context , FieldSpec result ) {
34
36
this .context = context ;
35
37
this .result = result ;
36
- this .success = success ;
37
38
}
38
39
39
40
static ParseResult create (Context context ) {
40
41
FieldSpec result = FieldSpec .builder (TypeName .get (context .sourceType .asType ()), "result" ,
41
42
PRIVATE , FINAL ).build ();
42
- FieldSpec success = FieldSpec .builder (TypeName .BOOLEAN , "success" ,
43
- PRIVATE , FINAL ).build ();
44
- return new ParseResult (context , result , success );
43
+ return new ParseResult (context , result );
45
44
}
46
45
47
- TypeSpec define () {
46
+ List < TypeSpec > define () {
48
47
TypeSpec .Builder spec = classBuilder (context .parseResultType ())
49
- .addFields (asList (result , success ))
50
- .addMethod (addPublicIfNecessary (context , resultMethod ()))
51
- .addMethod (addPublicIfNecessary (context , errorMethod ()))
52
- .addMethod (addPublicIfNecessary (context , helpPrintedMethod ()))
53
- .addMethod (privateConstructor ())
54
- .addModifiers (STATIC );
48
+ .addMethod (constructorBuilder ().addModifiers (PRIVATE ).build ())
49
+ .addModifiers (STATIC , ABSTRACT )
50
+ .addJavadoc ("This will be a sealed type in the future.\n " );
51
+ if (context .sourceType .getModifiers ().contains (PUBLIC )) {
52
+ spec .addModifiers (PUBLIC );
53
+ }
54
+ return Arrays .asList (spec .build (),
55
+ definePrintHelpResult (),
56
+ defineErrorResult (),
57
+ defineSuccessResult ());
58
+ }
59
+
60
+ private TypeSpec definePrintHelpResult () {
61
+ TypeSpec .Builder spec = classBuilder (context .helpPrintedParseResultType ())
62
+ .superclass (context .parseResultType ())
63
+ .addModifiers (STATIC , FINAL );
55
64
if (context .sourceType .getModifiers ().contains (PUBLIC )) {
56
65
spec .addModifiers (PUBLIC );
57
66
}
58
- spec .addModifiers (FINAL );
59
67
return spec .build ();
60
68
}
61
69
62
- private MethodSpec .Builder errorMethod () {
63
- return methodBuilder ("error" )
64
- .addStatement ("return !$N" , success )
65
- .returns (TypeName .BOOLEAN );
70
+ private TypeSpec defineErrorResult () {
71
+ ParameterSpec paramMessage = builder (STRING , message .name ).build ();
72
+ TypeSpec .Builder spec = classBuilder (context .errorParseResultType ())
73
+ .superclass (context .parseResultType ())
74
+ .addField (message )
75
+ .addMethod (constructorBuilder ()
76
+ .addParameter (paramMessage )
77
+ .addStatement ("this.$N = $T.requireNonNull($N)" , message , Objects .class , paramMessage )
78
+ .addModifiers (PRIVATE ).build ())
79
+ .addModifiers (STATIC , FINAL );
80
+ if (context .sourceType .getModifiers ().contains (PUBLIC )) {
81
+ spec .addModifiers (PUBLIC );
82
+ }
83
+ spec .addMethod (addPublicIfNecessary (context , messageMethod ()));
84
+ return spec .build ();
66
85
}
67
86
68
- private MethodSpec .Builder helpPrintedMethod () {
69
- return methodBuilder ("helpPrinted" )
70
- .addStatement ("return $N == null && $N" , result , success )
71
- .returns (TypeName .BOOLEAN );
87
+ private TypeSpec defineSuccessResult () {
88
+ TypeSpec .Builder spec = classBuilder (context .successParseResultType ())
89
+ .superclass (context .parseResultType ())
90
+ .addField (result )
91
+ .addMethod (successConstructor ())
92
+ .addModifiers (STATIC , FINAL );
93
+ if (context .sourceType .getModifiers ().contains (PUBLIC )) {
94
+ spec .addModifiers (PUBLIC );
95
+ }
96
+ spec .addMethod (addPublicIfNecessary (context , resultMethod ()));
97
+ return spec .build ();
72
98
}
73
99
74
100
private MethodSpec .Builder resultMethod () {
75
101
return methodBuilder ("result" )
76
- .addStatement ("return $T.ofNullable($N)" , Optional .class , result )
77
- .returns (optionalOf (TypeName .get (context .sourceType .asType ())));
102
+ .addStatement ("return $N" , result )
103
+ .returns (TypeName .get (context .sourceType .asType ()));
104
+ }
105
+
106
+ private MethodSpec .Builder messageMethod () {
107
+ return methodBuilder ("message" )
108
+ .addStatement ("return $N" , message )
109
+ .returns (STRING );
78
110
}
79
111
80
- private MethodSpec privateConstructor () {
112
+ private MethodSpec successConstructor () {
81
113
ParameterSpec paramResult = builder (result .type , result .name ).build ();
82
- ParameterSpec paramSuccess = builder (success .type , success .name ).build ();
83
114
MethodSpec .Builder spec = constructorBuilder ()
84
- .addParameter (paramResult )
85
- .addParameter (paramSuccess );
86
- spec .beginControlFlow ("if ($N != null && !$N)" , paramResult , paramSuccess )
87
- .addComment ("sanity check" )
88
- .addStatement ("throw new $T($S)" , IllegalArgumentException .class , "Parsing failed, there can't be a result" )
89
- .endControlFlow ();
115
+ .addParameter (paramResult );
90
116
return spec
91
- .addStatement ("this.$N = $N" , result , paramResult )
92
- .addStatement ("this.$N = $N" , success , paramSuccess )
117
+ .addStatement ("this.$N = $T.requireNonNull($N)" , result , Objects .class , paramResult )
93
118
.addModifiers (PRIVATE )
94
119
.build ();
95
120
}
0 commit comments