48
48
import java .util .Collections ;
49
49
import java .util .List ;
50
50
import java .util .Map ;
51
+ import java .util .Map .Entry ;
51
52
import java .util .Properties ;
52
53
import java .util .Set ;
53
54
import java .util .TreeMap ;
@@ -87,9 +88,12 @@ enum StubKind {
87
88
FACTORY_METHOD_DECL ("factory.decl.method" ),
88
89
FACTORY_METHOD_ARG ("factory.decl.method.arg" ),
89
90
FACTORY_METHOD_BODY ("factory.decl.method.body" ),
91
+ FACTORY_METHOD_BODY_LINT ("factory.decl.method.body.lint" ),
90
92
FACTORY_FIELD ("factory.decl.field" ),
93
+ FACTORY_FIELD_LINT ("factory.decl.field.lint" ),
91
94
WILDCARDS_EXTENDS ("wildcards.extends" ),
92
- SUPPRESS_WARNINGS ("suppress.warnings" );
95
+ SUPPRESS_WARNINGS ("suppress.warnings" ),
96
+ LINT_CATEGORY ("lint.category" );
93
97
94
98
/** stub key (as it appears in the property file) */
95
99
String key ;
@@ -114,6 +118,7 @@ String format(Object... args) {
114
118
enum FactoryKind {
115
119
ERR ("err" , "Error" , "Errors" ),
116
120
WARN ("warn" , "Warning" , "Warnings" ),
121
+ LINT_WARN ("warn" , "LintWarning" , "LintWarnings" ),
117
122
NOTE ("note" , "Note" , "Notes" ),
118
123
MISC ("misc" , "Fragment" , "Fragments" ),
119
124
OTHER (null , null , null );
@@ -136,13 +141,24 @@ enum FactoryKind {
136
141
/**
137
142
* Utility method for parsing a factory kind from a resource key prefix.
138
143
*/
139
- static FactoryKind parseFrom (String prefix ) {
144
+ static FactoryKind of (Entry <String , Message > messageEntry ) {
145
+ String prefix = messageEntry .getKey ().split ("\\ ." )[1 ];
146
+ FactoryKind selected = null ;
140
147
for (FactoryKind k : FactoryKind .values ()) {
141
148
if (k .prefix == null || k .prefix .equals (prefix )) {
142
- return k ;
149
+ selected = k ;
150
+ break ;
143
151
}
144
152
}
145
- return null ;
153
+ if (selected == WARN ) {
154
+ for (MessageLine line : messageEntry .getValue ().getLines (false )) {
155
+ if (line .isLint ()) {
156
+ selected = LINT_WARN ;
157
+ break ;
158
+ }
159
+ }
160
+ }
161
+ return selected ;
146
162
}
147
163
}
148
164
@@ -155,7 +171,7 @@ public void generateFactory(MessageFile messageFile, File outDir) {
155
171
messageFile .messages .entrySet ().stream ()
156
172
.collect (
157
173
Collectors .groupingBy (
158
- e -> FactoryKind . parseFrom ( e . getKey (). split ( " \\ ." )[ 1 ]) ,
174
+ FactoryKind :: of ,
159
175
TreeMap ::new ,
160
176
toList ()));
161
177
//generate nested classes
@@ -165,7 +181,7 @@ public void generateFactory(MessageFile messageFile, File outDir) {
165
181
if (entry .getKey () == FactoryKind .OTHER ) continue ;
166
182
//emit members
167
183
String members = entry .getValue ().stream ()
168
- .flatMap (e -> generateFactoryMethodsAndFields (e .getKey (), e .getValue ()).stream ())
184
+ .flatMap (e -> generateFactoryMethodsAndFields (entry . getKey (), e .getKey (), e .getValue ()).stream ())
169
185
.collect (Collectors .joining ("\n \n " ));
170
186
//emit nested class
171
187
String factoryDecl =
@@ -230,22 +246,35 @@ List<String> generateImports(Set<String> importedTypes) {
230
246
/**
231
247
* Generate a list of factory methods/fields to be added to a given factory nested class.
232
248
*/
233
- List <String > generateFactoryMethodsAndFields (String key , Message msg ) {
249
+ List <String > generateFactoryMethodsAndFields (FactoryKind k , String key , Message msg ) {
234
250
MessageInfo msgInfo = msg .getMessageInfo ();
235
251
List <MessageLine > lines = msg .getLines (false );
236
252
String javadoc = lines .stream ()
237
253
.filter (ml -> !ml .isInfo () && !ml .isEmptyOrComment ())
238
254
.map (ml -> ml .text )
239
255
.collect (Collectors .joining ("\n *" ));
240
256
String [] keyParts = key .split ("\\ ." );
241
- FactoryKind k = FactoryKind .parseFrom (keyParts [1 ]);
257
+ String lintCategory = lines .stream ()
258
+ .filter (MessageLine ::isLint )
259
+ .map (MessageLine ::lintCategory )
260
+ .findFirst ().orElse (null );
261
+ //System.out.println("category for " + key + " = " + lintCategory);
242
262
String factoryName = factoryName (key );
243
263
if (msgInfo .getTypes ().isEmpty ()) {
244
264
//generate field
245
- String factoryField = StubKind .FACTORY_FIELD .format (k .keyClazz , factoryName ,
246
- "\" " + keyParts [0 ] + "\" " ,
247
- "\" " + Stream .of (keyParts ).skip (2 ).collect (Collectors .joining ("." )) + "\" " ,
248
- javadoc );
265
+ String factoryField ;
266
+ if (lintCategory == null ) {
267
+ factoryField = StubKind .FACTORY_FIELD .format (k .keyClazz , factoryName ,
268
+ "\" " + keyParts [0 ] + "\" " ,
269
+ "\" " + Stream .of (keyParts ).skip (2 ).collect (Collectors .joining ("." )) + "\" " ,
270
+ javadoc );
271
+ } else {
272
+ factoryField = StubKind .FACTORY_FIELD_LINT .format (k .keyClazz , factoryName ,
273
+ StubKind .LINT_CATEGORY .format ("\" " + lintCategory + "\" " ),
274
+ "\" " + keyParts [0 ] + "\" " ,
275
+ "\" " + Stream .of (keyParts ).skip (2 ).collect (Collectors .joining ("." )) + "\" " ,
276
+ javadoc );
277
+ }
249
278
return Collections .singletonList (factoryField );
250
279
} else {
251
280
//generate method
@@ -255,12 +284,22 @@ List<String> generateFactoryMethodsAndFields(String key, Message msg) {
255
284
List <String > argNames = argNames (types .size ());
256
285
String suppressionString = needsSuppressWarnings (msgTypes ) ?
257
286
StubKind .SUPPRESS_WARNINGS .format () : "" ;
287
+ String methodBody ;
288
+ if (lintCategory == null ) {
289
+ methodBody = StubKind .FACTORY_METHOD_BODY .format (k .keyClazz ,
290
+ "\" " + keyParts [0 ] + "\" " ,
291
+ "\" " + Stream .of (keyParts ).skip (2 ).collect (Collectors .joining ("." )) + "\" " ,
292
+ argNames .stream ().collect (Collectors .joining (", " )));
293
+ } else {
294
+ methodBody = StubKind .FACTORY_METHOD_BODY_LINT .format (k .keyClazz ,
295
+ StubKind .LINT_CATEGORY .format ("\" " + lintCategory + "\" " ),
296
+ "\" " + keyParts [0 ] + "\" " ,
297
+ "\" " + Stream .of (keyParts ).skip (2 ).collect (Collectors .joining ("." )) + "\" " ,
298
+ argNames .stream ().collect (Collectors .joining (", " )));
299
+ }
258
300
String factoryMethod = StubKind .FACTORY_METHOD_DECL .format (suppressionString , k .keyClazz ,
259
301
factoryName , argDecls (types , argNames ).stream ().collect (Collectors .joining (", " )),
260
- indent (StubKind .FACTORY_METHOD_BODY .format (k .keyClazz ,
261
- "\" " + keyParts [0 ] + "\" " ,
262
- "\" " + Stream .of (keyParts ).skip (2 ).collect (Collectors .joining ("." )) + "\" " ,
263
- argNames .stream ().collect (Collectors .joining (", " ))), 1 ),
302
+ indent (methodBody , 1 ),
264
303
javadoc );
265
304
factoryMethods .add (factoryMethod );
266
305
}
0 commit comments