@@ -289,27 +289,38 @@ object Lib{
289
289
if (! exists(base)) Nil
290
290
else listClassFiles(base).flatMap { path =>
291
291
val cls = cl.loadClass(path.stripSuffix(" .class" ).replace('/' , '.' ))
292
- fingerprints.find {
293
- case f : SubclassFingerprint =>
294
- ! cls.isInterface &&
295
- (f.isModule == cls.getName.endsWith(" $" )) &&
296
- cl.loadClass(f.superclassName()).isAssignableFrom(cls) &&
297
- (f.isModule || cls.getConstructors.count(c => c.getParameterCount == 0 && Modifier .isPublic(c.getModifiers)) == 1 )
298
-
299
- case f : AnnotatedFingerprint =>
300
- val annotationCls = cl.loadClass(f.annotationName()).asInstanceOf [Class [Annotation ]]
301
- (f.isModule == cls.getName.endsWith(" $" )) &&
302
- (f.isModule || cls.getConstructors.count(c => c.getParameterCount == 0 && Modifier .isPublic(c.getModifiers)) == 1 )
303
- (
304
- cls.isAnnotationPresent(annotationCls) ||
305
- cls.getDeclaredMethods.exists(_.isAnnotationPresent(annotationCls))
306
- )
307
-
308
- }.map { f => (cls, f) }
292
+ val publicConstructorCount =
293
+ cls.getConstructors.count(c => c.getParameterCount == 0 && Modifier .isPublic(c.getModifiers))
294
+
295
+ if (Modifier .isAbstract(cls.getModifiers) || cls.isInterface || publicConstructorCount > 1 ) {
296
+ None
297
+ } else {
298
+ (cls.getName.endsWith(" $" ), publicConstructorCount == 0 ) match {
299
+ case (true , true ) => matchFingerprints(cl, cls, fingerprints, isModule = true )
300
+ case (false , false ) => matchFingerprints(cl, cls, fingerprints, isModule = false )
301
+ case _ => None
302
+ }
303
+ }
309
304
}
310
305
}
311
306
312
307
testClasses
313
308
}
309
+ def matchFingerprints (cl : ClassLoader , cls : Class [_], fingerprints : Array [Fingerprint ], isModule : Boolean ) = {
310
+ fingerprints.find {
311
+ case f : SubclassFingerprint =>
312
+ f.isModule == isModule &&
313
+ cl.loadClass(f.superclassName()).isAssignableFrom(cls)
314
+
315
+ case f : AnnotatedFingerprint =>
316
+ val annotationCls = cl.loadClass(f.annotationName()).asInstanceOf [Class [Annotation ]]
317
+ f.isModule == isModule &&
318
+ (
319
+ cls.isAnnotationPresent(annotationCls) ||
320
+ cls.getDeclaredMethods.exists(_.isAnnotationPresent(annotationCls))
321
+ )
322
+
323
+ }.map { f => (cls, f) }
324
+ }
314
325
315
326
}
0 commit comments