15
15
*/
16
16
package io .micronaut .sourcegen ;
17
17
18
+ import io .micronaut .core .annotation .Internal ;
19
+ import io .micronaut .core .annotation .Nullable ;
20
+ import io .micronaut .core .naming .NameUtils ;
21
+ import io .micronaut .inject .visitor .VisitorContext ;
22
+ import io .micronaut .sourcegen .generator .SourceGenerator ;
18
23
import io .micronaut .sourcegen .javapoet .AnnotationSpec ;
19
24
import io .micronaut .sourcegen .javapoet .ClassName ;
20
25
import io .micronaut .sourcegen .javapoet .FieldSpec ;
26
31
import io .micronaut .sourcegen .javapoet .TypeSpec ;
27
32
import io .micronaut .sourcegen .javapoet .TypeVariableName ;
28
33
import io .micronaut .sourcegen .javapoet .WildcardTypeName ;
29
- import io .micronaut .core .annotation .Internal ;
30
- import io .micronaut .core .annotation .Nullable ;
31
- import io .micronaut .core .naming .NameUtils ;
32
- import io .micronaut .inject .visitor .VisitorContext ;
33
- import io .micronaut .sourcegen .generator .SourceGenerator ;
34
34
import io .micronaut .sourcegen .model .AnnotationDef ;
35
35
import io .micronaut .sourcegen .model .ClassDef ;
36
36
import io .micronaut .sourcegen .model .ClassTypeDef ;
37
+ import io .micronaut .sourcegen .model .EnumDef ;
37
38
import io .micronaut .sourcegen .model .ExpressionDef ;
38
39
import io .micronaut .sourcegen .model .FieldDef ;
39
40
import io .micronaut .sourcegen .model .InterfaceDef ;
51
52
import java .util .Map ;
52
53
import java .util .stream .Collectors ;
53
54
54
- import static java .lang .Character .isISOControl ;
55
-
56
55
/**
57
56
* The Java source generator.
58
57
*
@@ -75,6 +74,8 @@ public void write(ObjectDef objectDef, Writer writer) throws IOException {
75
74
writeRecord (writer , recordDef );
76
75
} else if (objectDef instanceof InterfaceDef interfaceDef ) {
77
76
writeInterface (writer , interfaceDef );
77
+ } else if (objectDef instanceof EnumDef enumDef ) {
78
+ writeEnum (writer , enumDef );
78
79
} else {
79
80
throw new IllegalStateException ("Unknown object definition: " + objectDef );
80
81
}
@@ -123,6 +124,24 @@ private void writeInterface(Writer writer, InterfaceDef interfaceDef) throws IOE
123
124
javaFile .writeTo (writer );
124
125
}
125
126
127
+ private void writeEnum (Writer writer , EnumDef enumDef ) throws IOException {
128
+ TypeSpec .Builder enumBuilder = TypeSpec .enumBuilder (enumDef .getSimpleName ());
129
+ enumBuilder .addModifiers (enumDef .getModifiersArray ());
130
+ enumDef .getSuperinterfaces ().stream ().map (this ::asType ).forEach (enumBuilder ::addSuperinterface );
131
+
132
+ for (String enumConstant : enumDef .getEnumConstants ()) {
133
+ enumBuilder .addEnumConstant (enumConstant );
134
+ }
135
+
136
+ for (MethodDef method : enumDef .getMethods ()) {
137
+ enumBuilder .addMethod (
138
+ asMethodSpec (enumDef , method )
139
+ );
140
+ }
141
+ JavaFile javaFile = JavaFile .builder (enumDef .getPackageName (), enumBuilder .build ()).build ();
142
+ javaFile .writeTo (writer );
143
+ }
144
+
126
145
private void writeClass (Writer writer , ClassDef classDef ) throws IOException {
127
146
TypeSpec .Builder classBuilder = TypeSpec .classBuilder (classDef .getSimpleName ());
128
147
classBuilder .addModifiers (classDef .getModifiersArray ());
@@ -255,30 +274,14 @@ private AnnotationSpec asAnnotationSpec(AnnotationDef annotationDef) {
255
274
} else if (value instanceof Float ) {
256
275
builder = builder .addMember (memberName , "$Lf" , value );
257
276
} else if (value instanceof Character ) {
258
- builder = builder .addMember (memberName , "'$L'" , characterLiteralWithoutSingleQuotes ((char ) value ));
277
+ builder = builder .addMember (memberName , "'$L'" , io . micronaut . sourcegen . javapoet . Util . characterLiteralWithoutSingleQuotes ((char ) value ));
259
278
} else {
260
279
builder = builder .addMember (memberName , "$L" , value );
261
280
}
262
281
}
263
282
return builder .build ();
264
283
}
265
284
266
- // Copy from io.micronaut.javapoet.Util
267
- private static String characterLiteralWithoutSingleQuotes (char c ) {
268
- // see https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.6
269
- return switch (c ) {
270
- case '\b' -> "\\ b" ; /* \u0008: backspace (BS) */
271
- case '\t' -> "\\ t" ; /* \u0009: horizontal tab (HT) */
272
- case '\n' -> "\\ n" ; /* \u000a: linefeed (LF) */
273
- case '\f' -> "\\ f" ; /* \u000c: form feed (FF) */
274
- case '\r' -> "\\ r" ; /* \u000d: carriage return (CR) */
275
- case '\"' -> "\" " ; /* \u0022: double quote (") */
276
- case '\'' -> "\\ '" ; /* \u0027: single quote (') */
277
- case '\\' -> "\\ \\ " ; /* \u005c: backslash (\) */
278
- default -> isISOControl (c ) ? String .format ("\\ u%04x" , (int ) c ) : Character .toString (c );
279
- };
280
- }
281
-
282
285
private TypeName asType (TypeDef typeDef ) {
283
286
if (typeDef instanceof ClassTypeDef .Parameterized parameterized ) {
284
287
return ParameterizedTypeName .get (
@@ -351,6 +354,15 @@ private static String renderExpression(@Nullable ObjectDef objectDef, MethodDef
351
354
if (expressionDef instanceof ExpressionDef .Convert convertExpressionDef ) {
352
355
return renderVariable (objectDef , methodDef , convertExpressionDef .variable ());
353
356
}
357
+ if (expressionDef instanceof ExpressionDef .CallInstanceMethod callInstanceMethod ) {
358
+ return renderVariable (objectDef , methodDef , callInstanceMethod .instance ())
359
+ + "." + callInstanceMethod .name ()
360
+ + "(" + callInstanceMethod .parameters ()
361
+ .stream ()
362
+ .map (exp -> renderExpression (objectDef , methodDef , expressionDef ))
363
+ .collect (Collectors .joining (", " ))
364
+ + ")" ;
365
+ }
354
366
if (expressionDef instanceof VariableDef variableDef ) {
355
367
return renderVariable (objectDef , methodDef , variableDef );
356
368
}
0 commit comments