2020import com .google .auto .common .MoreTypes ;
2121import com .google .auto .service .AutoService ;
2222import com .google .common .base .Stopwatch ;
23- import com .squareup .javapoet .*;
23+ import com .squareup .javapoet .AnnotationSpec ;
24+ import com .squareup .javapoet .ClassName ;
25+ import com .squareup .javapoet .FieldSpec ;
26+ import com .squareup .javapoet .JavaFile ;
27+ import com .squareup .javapoet .MethodSpec ;
28+ import com .squareup .javapoet .ParameterizedTypeName ;
29+ import com .squareup .javapoet .TypeName ;
30+ import com .squareup .javapoet .TypeSpec ;
2431import java .io .IOException ;
2532import java .io .PrintWriter ;
2633import java .io .StringWriter ;
27- import java .util .*;
34+ import java .util .ArrayList ;
35+ import java .util .IdentityHashMap ;
36+ import java .util .List ;
37+ import java .util .Map ;
38+ import java .util .Set ;
39+ import java .util .StringJoiner ;
2840import java .util .stream .Stream ;
29- import javax .annotation .processing .*;
41+ import javax .annotation .processing .AbstractProcessor ;
42+ import javax .annotation .processing .Filer ;
43+ import javax .annotation .processing .Messager ;
44+ import javax .annotation .processing .ProcessingEnvironment ;
45+ import javax .annotation .processing .Processor ;
46+ import javax .annotation .processing .RoundEnvironment ;
3047import javax .lang .model .SourceVersion ;
3148import javax .lang .model .element .Element ;
3249import javax .lang .model .element .Modifier ;
@@ -164,6 +181,10 @@ protected void generate(TypeElement interfaceToImplement, EditorModel rootEditor
164181 .addModifiers (Modifier .PUBLIC )
165182 .returns (void .class )
166183 .addAnnotation (Override .class )
184+ .addAnnotation (
185+ AnnotationSpec .builder (SuppressWarnings .class )
186+ .addMember ("value" , "$S" , "unchecked" )
187+ .build ())
167188 .addParameter (EditorVisitor .class , "visitor" )
168189 // ugly cast to shut up java warnings at compile time - however, this might be overkill,
169190 // could just use raw types
@@ -240,6 +261,10 @@ protected void generate(TypeElement interfaceToImplement, EditorModel rootEditor
240261 /**
241262 * Joins the name of the type with any enclosing types, with "_" as the delimeter, and appends an
242263 * optional suffix.
264+ *
265+ * @param interfaceToImplement TypeElement of the interface to implement
266+ * @param suffix suffix to use or null (no suffix)
267+ * @return created name
243268 */
244269 protected String createNameFromEnclosedTypes (TypeElement interfaceToImplement , String suffix ) {
245270 StringJoiner joiner = new StringJoiner ("_" , "" , suffix == null ? "" : suffix );
@@ -272,22 +297,38 @@ protected ClassName getEditorDelegate(EditorModel editorModel, EditorProperty da
272297 TypeSpec .classBuilder (delegateSimpleName )
273298 .addOriginatingElement (types .asElement (data .getEditedType ()))
274299 .addOriginatingElement (types .asElement (data .getEditorType ()))
275- .addModifiers (Modifier .PUBLIC )
276- // Once GWT supports the new package of the Generated class
277- // we can uncomment this code
278- // .addAnnotation(
279- // AnnotationSpec.builder(getGeneratedClassName())
280- // .addMember("value", "\"$L\"",
281- // DriverProcessor.class.getCanonicalName())
282- // .build())
283- .superclass (getEditorDelegateType ()); // raw type here, for the same reason as above
300+ .addModifiers (Modifier .PUBLIC );
301+ // Once GWT supports the new package of the Generated class
302+ // we can uncomment this code
303+ // .addAnnotation(
304+ // AnnotationSpec.builder(getGeneratedClassName())
305+ // .addMember("value", "\"$L\"",
306+ // DriverProcessor.class.getCanonicalName())
307+ // .build())
308+ if (data .getEditedType () != null && data .getEditorType () != null ) {
309+ ParameterizedTypeName delegateType =
310+ ParameterizedTypeName .get (
311+ getEditorDelegateType (),
312+ TypeName .get (data .getEditedType ()),
313+ TypeName .get (data .getEditorType ()));
314+ delegateTypeBuilder .superclass (delegateType );
315+ } else {
316+ delegateTypeBuilder .superclass (getEditorDelegateType ());
317+ }
284318
285319 NameFactory names = new NameFactory ();
286320 Map <EditorProperty , String > delegateFields = new IdentityHashMap <>();
287321
288- delegateTypeBuilder .addField (
289- FieldSpec .builder (rawEditorType , "editor" , Modifier .PRIVATE ).build ());
290- names .addName ("editor" );
322+ if (data .getEditorType () != null ) {
323+ delegateTypeBuilder .addField (
324+ FieldSpec .builder (ClassName .get (data .getEditorType ()), "editor" , Modifier .PRIVATE )
325+ .build ());
326+ names .addName ("editor" );
327+ } else {
328+ delegateTypeBuilder .addField (
329+ FieldSpec .builder (rawEditorType , "editor" , Modifier .PRIVATE ).build ());
330+ names .addName ("editor" );
331+ }
291332 delegateTypeBuilder .addField (
292333 FieldSpec .builder (ClassName .get (data .getEditedType ()), "object" , Modifier .PRIVATE ).build ());
293334 names .addName ("object" );
@@ -298,26 +339,48 @@ protected ClassName getEditorDelegate(EditorModel editorModel, EditorProperty da
298339 String fieldName = names .createName (d .getPropertyName () + "Delegate" );
299340 delegateFields .put (d , fieldName );
300341 delegateTypeBuilder .addField (
301- getEditorDelegateType (), fieldName , Modifier .PRIVATE ); // TODO parameterize
342+ ParameterizedTypeName .get (
343+ getEditorDelegateType (),
344+ TypeName .get (d .getEditedType ()),
345+ TypeName .get (d .getEditorType ())),
346+ fieldName ,
347+ Modifier .PRIVATE );
302348 }
303349 }
304350
305- delegateTypeBuilder .addMethod (
306- MethodSpec .methodBuilder ("getEditor" )
307- .addModifiers (Modifier .PROTECTED )
308- .returns (rawEditorType )
309- .addAnnotation (Override .class )
310- .addStatement ("return editor" )
311- .build ());
312-
313- delegateTypeBuilder .addMethod (
314- MethodSpec .methodBuilder ("setEditor" )
315- .addModifiers (Modifier .PROTECTED )
316- .returns (void .class )
317- .addAnnotation (Override .class )
318- .addParameter (Editor .class , "editor" )
319- .addStatement ("this.editor = ($T) editor" , rawEditorType )
320- .build ());
351+ if (data .getEditorType () != null ) {
352+ delegateTypeBuilder .addMethod (
353+ MethodSpec .methodBuilder ("getEditor" )
354+ .addModifiers (Modifier .PROTECTED )
355+ .returns (ClassName .get (data .getEditorType ()))
356+ .addAnnotation (Override .class )
357+ .addStatement ("return editor" )
358+ .build ());
359+ delegateTypeBuilder .addMethod (
360+ MethodSpec .methodBuilder ("setEditor" )
361+ .addModifiers (Modifier .PROTECTED )
362+ .returns (void .class )
363+ .addAnnotation (Override .class )
364+ .addParameter (ClassName .get (data .getEditorType ()), "editor" )
365+ .addStatement ("this.editor = editor" )
366+ .build ());
367+ } else {
368+ delegateTypeBuilder .addMethod (
369+ MethodSpec .methodBuilder ("getEditor" )
370+ .addModifiers (Modifier .PROTECTED )
371+ .returns (rawEditorType )
372+ .addAnnotation (Override .class )
373+ .addStatement ("return editor" )
374+ .build ());
375+ delegateTypeBuilder .addMethod (
376+ MethodSpec .methodBuilder ("setEditor" )
377+ .addModifiers (Modifier .PROTECTED )
378+ .returns (void .class )
379+ .addAnnotation (Override .class )
380+ .addParameter (Editor .class , "editor" )
381+ .addStatement ("this.editor = editor" )
382+ .build ());
383+ }
321384
322385 delegateTypeBuilder .addMethod (
323386 MethodSpec .methodBuilder ("getObject" )
@@ -327,14 +390,25 @@ protected ClassName getEditorDelegate(EditorModel editorModel, EditorProperty da
327390 .addStatement ("return object" )
328391 .build ());
329392
330- delegateTypeBuilder .addMethod (
331- MethodSpec .methodBuilder ("setObject" )
332- .addModifiers (Modifier .PROTECTED )
333- .returns (void .class )
334- .addAnnotation (Override .class )
335- .addParameter (ClassName .get (Object .class ), "object" )
336- .addStatement ("this.object = ($T) object" , ClassName .get (data .getEditedType ()))
337- .build ());
393+ if (data .getEditedType () != null ) {
394+ delegateTypeBuilder .addMethod (
395+ MethodSpec .methodBuilder ("setObject" )
396+ .addModifiers (Modifier .PROTECTED )
397+ .returns (void .class )
398+ .addAnnotation (Override .class )
399+ .addParameter (ClassName .get (data .getEditedType ()), "object" )
400+ .addStatement ("this.object = object" )
401+ .build ());
402+ } else {
403+ delegateTypeBuilder .addMethod (
404+ MethodSpec .methodBuilder ("setObject" )
405+ .addModifiers (Modifier .PROTECTED )
406+ .returns (void .class )
407+ .addAnnotation (Override .class )
408+ .addParameter (ClassName .get (Object .class ), "object" )
409+ .addStatement ("this.object = ($T) object" , ClassName .get (data .getEditedType ()))
410+ .build ());
411+ }
338412
339413 MethodSpec .Builder initializeSubDelegatesBuilder =
340414 MethodSpec .methodBuilder ("initializeSubDelegates" )
@@ -520,18 +594,49 @@ private ClassName getEditorContext(EditorProperty parent, EditorProperty data) {
520594 MethodSpec .methodBuilder ("checkAssignment" )
521595 .addModifiers (Modifier .PUBLIC )
522596 .addAnnotation (Override .class )
597+ .addAnnotation (
598+ AnnotationSpec .builder (SuppressWarnings .class )
599+ .addMember ("value" , "$S" , "unchecked" )
600+ .build ())
523601 .returns (ClassName .get (data .getEditedType ()))
524602 .addParameter (Object .class , "value" )
525603 .addStatement ("return ($T) value" , ClassName .get (data .getEditedType ()))
526604 .build ());
527605
528- contextTypeBuilder .addMethod (
529- MethodSpec .methodBuilder ("getEditedType" )
530- .addModifiers (Modifier .PUBLIC )
531- .addAnnotation (Override .class )
532- .returns (Class .class )
533- .addStatement ("return $L.class" , MoreTypes .asElement (data .getEditedType ()))
534- .build ());
606+ if (MoreTypes .asDeclared (data .getEditorType ()).getTypeArguments ().size () > 1 ) {
607+ contextTypeBuilder .addMethod (
608+ MethodSpec .methodBuilder ("getEditedType" )
609+ .addModifiers (Modifier .PUBLIC )
610+ .addAnnotation (Override .class )
611+ .addAnnotation (
612+ AnnotationSpec .builder (SuppressWarnings .class )
613+ .addMember ("value" , "$S" , "unchecked" )
614+ .build ())
615+ .returns (
616+ ParameterizedTypeName .get (
617+ ClassName .get (Class .class ), ClassName .get (data .getEditedType ())))
618+ .addStatement (
619+ "return ($T<$T>) ($T) $L.class" ,
620+ ClassName .get (Class .class ),
621+ ClassName .get (data .getEditedType ()),
622+ ClassName .get (Class .class ),
623+ MoreTypes .asElement (data .getEditedType ()))
624+ .build ());
625+ } else {
626+ contextTypeBuilder .addMethod (
627+ MethodSpec .methodBuilder ("getEditedType" )
628+ .addModifiers (Modifier .PUBLIC )
629+ .addAnnotation (Override .class )
630+ .addAnnotation (
631+ AnnotationSpec .builder (SuppressWarnings .class )
632+ .addMember ("value" , "$S" , "unchecked" )
633+ .build ())
634+ .returns (
635+ ParameterizedTypeName .get (
636+ ClassName .get (Class .class ), ClassName .get (data .getEditedType ())))
637+ .addStatement ("return $L.class" , MoreTypes .asElement (data .getEditedType ()))
638+ .build ());
639+ }
535640
536641 contextTypeBuilder .addMethod (
537642 MethodSpec .methodBuilder ("getFromModel" )
0 commit comments