@@ -11,7 +11,7 @@ public abstract class ModelParser {
1111
1212 protected final Logger logger ;
1313 protected final Settings settings ;
14- private Queue <Class <?>> classQueue ;
14+ private final Queue <ClassWithUsage > classQueue = new LinkedList <>() ;
1515
1616 public ModelParser (Logger logger , Settings settings ) {
1717 this .logger = logger ;
@@ -23,27 +23,35 @@ public Model parseModel(Class<?> cls) {
2323 }
2424
2525 public Model parseModel (List <? extends Class <?>> classes ) {
26- classQueue = new LinkedList <>(classes );
26+ for (Class <?> cls : classes ) {
27+ classQueue .add (new ClassWithUsage (cls , null , null ));
28+ }
2729 return parseQueue ();
2830 }
2931
3032 private Model parseQueue () {
3133 final LinkedHashMap <Class <?>, BeanModel > parsedClasses = new LinkedHashMap <>();
32- Class <?> cls ;
33- while ((cls = classQueue .poll ()) != null ) {
34+ ClassWithUsage classWithUsage ;
35+ while ((classWithUsage = classQueue .poll ()) != null ) {
36+ final Class <?> cls = classWithUsage .beanClass ;
3437 if (!parsedClasses .containsKey (cls )) {
35- logger .info (String .format ("Parsing '%s'" , cls .getName ()));
36- final BeanModel bean = parseBean (cls );
38+ logger .info ("Parsing '" + cls .getName () + "'" +
39+ (classWithUsage .usedInClass != null ? " used in '" + classWithUsage .usedInClass .getSimpleName () + "." + classWithUsage .usedInProperty + "'" : "" ));
40+ final BeanModel bean = parseBean (classWithUsage );
3741 parsedClasses .put (cls , bean );
3842 }
3943 }
4044 return new Model (new ArrayList <>(parsedClasses .values ()));
4145 }
4246
43- protected abstract BeanModel parseBean (Class <?> beanClass );
47+ protected abstract BeanModel parseBean (ClassWithUsage classWithUsage );
48+
49+ protected void addBeanToQueue (ClassWithUsage classWithUsage ) {
50+ classQueue .add (classWithUsage );
51+ }
4452
45- protected PropertyModel processTypeAndCreateProperty (String name , Type type ) {
46- final TsType originalType = typeFromJava (type );
53+ protected PropertyModel processTypeAndCreateProperty (String name , Type type , Class <?> usedInClass ) {
54+ final TsType originalType = typeFromJava (type , name , usedInClass );
4755 final LinkedHashSet <TsType .EnumType > replacedEnums = new LinkedHashSet <>();
4856 final TsType tsType = TsType .replaceEnumsWithStrings (originalType , replacedEnums );
4957 List <String > comments = null ;
@@ -58,6 +66,9 @@ protected PropertyModel processTypeAndCreateProperty(String name, Type type) {
5866 }
5967
6068 protected String getMappedName (Class <?> cls ) {
69+ if (cls == null ) {
70+ return null ;
71+ }
6172 final String name = cls .getSimpleName ();
6273 if (settings .removeTypeNameSuffix != null && name .endsWith (settings .removeTypeNameSuffix )) {
6374 return name .substring (0 , name .length () - settings .removeTypeNameSuffix .length ());
@@ -66,12 +77,12 @@ protected String getMappedName(Class<?> cls) {
6677 }
6778 }
6879
69- private TsType typeFromJava (Type javaType ) {
80+ private TsType typeFromJava (Type javaType , String usedInProperty , Class <?> usedInClass ) {
7081 if (KnownTypes .containsKey (javaType )) return KnownTypes .get (javaType );
7182 if (javaType instanceof Class ) {
7283 final Class <?> javaClass = (Class <?>) javaType ;
7384 if (javaClass .isArray ()) {
74- return new TsType .BasicArrayType (typeFromJava (javaClass .getComponentType ()));
85+ return new TsType .BasicArrayType (typeFromJava (javaClass .getComponentType (), usedInProperty , usedInClass ));
7586 }
7687 if (javaClass .isEnum ()) {
7788 @ SuppressWarnings ("unchecked" )
@@ -89,27 +100,28 @@ private TsType typeFromJava(Type javaType) {
89100 return new TsType .IndexedArrayType (TsType .String , TsType .Any );
90101 }
91102 // consider it structural
92- classQueue .add (javaClass );
103+ classQueue .add (new ClassWithUsage ( javaClass , usedInProperty , usedInClass ) );
93104 return new TsType .StructuralType (getMappedName (javaClass ));
94105 }
95106 if (javaType instanceof ParameterizedType ) {
96107 final ParameterizedType parameterizedType = (ParameterizedType ) javaType ;
97108 if (parameterizedType .getRawType () instanceof Class ) {
98109 final Class <?> javaClass = (Class <?>) parameterizedType .getRawType ();
99110 if (List .class .isAssignableFrom (javaClass )) {
100- return new TsType .BasicArrayType (typeFromJava (parameterizedType .getActualTypeArguments ()[0 ]));
111+ return new TsType .BasicArrayType (typeFromJava (parameterizedType .getActualTypeArguments ()[0 ], usedInProperty , usedInClass ));
101112 }
102113 if (Map .class .isAssignableFrom (javaClass )) {
103- return new TsType .IndexedArrayType (TsType .String , typeFromJava (parameterizedType .getActualTypeArguments ()[1 ]));
114+ return new TsType .IndexedArrayType (TsType .String , typeFromJava (parameterizedType .getActualTypeArguments ()[1 ], usedInProperty , usedInClass ));
104115 }
105116 }
106117 }
107- logger .warning (String .format ("Unsupported type '%s'" , javaType ));
118+ logger .warning (String .format ("Unsupported type '%s' used in '%s.%s' " , javaType , usedInClass . getSimpleName (), usedInProperty ));
108119 return TsType .Any ;
109120 }
110121
111122 private static Map <Type , TsType > getKnownTypes () {
112123 final Map <Type , TsType > knownTypes = new LinkedHashMap <>();
124+ knownTypes .put (Object .class , TsType .Any );
113125 knownTypes .put (Byte .class , TsType .Number );
114126 knownTypes .put (Byte .TYPE , TsType .Number );
115127 knownTypes .put (Short .class , TsType .Number );
0 commit comments