4848import java .util .Collections ;
4949import java .util .List ;
5050import java .util .Map ;
51+ import java .util .Map .Entry ;
5152import java .util .Properties ;
5253import java .util .Set ;
5354import java .util .TreeMap ;
@@ -87,9 +88,12 @@ enum StubKind {
8788 FACTORY_METHOD_DECL ("factory.decl.method" ),
8889 FACTORY_METHOD_ARG ("factory.decl.method.arg" ),
8990 FACTORY_METHOD_BODY ("factory.decl.method.body" ),
91+ FACTORY_METHOD_BODY_LINT ("factory.decl.method.body.lint" ),
9092 FACTORY_FIELD ("factory.decl.field" ),
93+ FACTORY_FIELD_LINT ("factory.decl.field.lint" ),
9194 WILDCARDS_EXTENDS ("wildcards.extends" ),
92- SUPPRESS_WARNINGS ("suppress.warnings" );
95+ SUPPRESS_WARNINGS ("suppress.warnings" ),
96+ LINT_CATEGORY ("lint.category" );
9397
9498 /** stub key (as it appears in the property file) */
9599 String key ;
@@ -114,6 +118,7 @@ String format(Object... args) {
114118 enum FactoryKind {
115119 ERR ("err" , "Error" , "Errors" ),
116120 WARN ("warn" , "Warning" , "Warnings" ),
121+ LINT_WARN ("warn" , "LintWarning" , "LintWarnings" ),
117122 NOTE ("note" , "Note" , "Notes" ),
118123 MISC ("misc" , "Fragment" , "Fragments" ),
119124 OTHER (null , null , null );
@@ -136,13 +141,24 @@ enum FactoryKind {
136141 /**
137142 * Utility method for parsing a factory kind from a resource key prefix.
138143 */
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 ;
140147 for (FactoryKind k : FactoryKind .values ()) {
141148 if (k .prefix == null || k .prefix .equals (prefix )) {
142- return k ;
149+ selected = k ;
150+ break ;
143151 }
144152 }
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 ;
146162 }
147163 }
148164
@@ -155,7 +171,7 @@ public void generateFactory(MessageFile messageFile, File outDir) {
155171 messageFile .messages .entrySet ().stream ()
156172 .collect (
157173 Collectors .groupingBy (
158- e -> FactoryKind . parseFrom ( e . getKey (). split ( " \\ ." )[ 1 ]) ,
174+ FactoryKind :: of ,
159175 TreeMap ::new ,
160176 toList ()));
161177 //generate nested classes
@@ -165,7 +181,7 @@ public void generateFactory(MessageFile messageFile, File outDir) {
165181 if (entry .getKey () == FactoryKind .OTHER ) continue ;
166182 //emit members
167183 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 ())
169185 .collect (Collectors .joining ("\n \n " ));
170186 //emit nested class
171187 String factoryDecl =
@@ -230,22 +246,35 @@ List<String> generateImports(Set<String> importedTypes) {
230246 /**
231247 * Generate a list of factory methods/fields to be added to a given factory nested class.
232248 */
233- List <String > generateFactoryMethodsAndFields (String key , Message msg ) {
249+ List <String > generateFactoryMethodsAndFields (FactoryKind k , String key , Message msg ) {
234250 MessageInfo msgInfo = msg .getMessageInfo ();
235251 List <MessageLine > lines = msg .getLines (false );
236252 String javadoc = lines .stream ()
237253 .filter (ml -> !ml .isInfo () && !ml .isEmptyOrComment ())
238254 .map (ml -> ml .text )
239255 .collect (Collectors .joining ("\n *" ));
240256 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);
242262 String factoryName = factoryName (key );
243263 if (msgInfo .getTypes ().isEmpty ()) {
244264 //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+ }
249278 return Collections .singletonList (factoryField );
250279 } else {
251280 //generate method
@@ -255,12 +284,22 @@ List<String> generateFactoryMethodsAndFields(String key, Message msg) {
255284 List <String > argNames = argNames (types .size ());
256285 String suppressionString = needsSuppressWarnings (msgTypes ) ?
257286 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+ }
258300 String factoryMethod = StubKind .FACTORY_METHOD_DECL .format (suppressionString , k .keyClazz ,
259301 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 ),
264303 javadoc );
265304 factoryMethods .add (factoryMethod );
266305 }
0 commit comments