2727import org .codehaus .groovy .groovydoc .GroovyPackageDoc ;
2828import org .codehaus .groovy .groovydoc .GroovyType ;
2929
30+ import java .lang .reflect .Modifier ;
3031import java .util .ArrayList ;
3132import java .util .List ;
3233
@@ -41,15 +42,15 @@ public class ExternalGroovyClassDoc implements GroovyClassDoc {
4142 private static final GroovyPackageDoc [] EMPTY_GROOVYPACKAGEDOC_ARRAY = new GroovyPackageDoc [0 ];
4243 private static final GroovyMethodDoc [] EMPTY_GROOVYMETHODDOC_ARRAY = new GroovyMethodDoc [0 ];
4344 private static final GroovyType [] EMPTY_GROOVYTYPE_ARRAY = new GroovyType [0 ];
44- private final Class externalClass ;
45+ private final Class <?> externalClass ;
4546 private final List <GroovyAnnotationRef > annotationRefs ;
4647
4748 /**
4849 * Creates a doc entry for the given external (non-source) class.
4950 *
5051 * @param externalClass the reflected class to represent
5152 */
52- public ExternalGroovyClassDoc (Class externalClass ) {
53+ public ExternalGroovyClassDoc (Class <?> externalClass ) {
5354 this .externalClass = externalClass ;
5455 annotationRefs = new ArrayList <GroovyAnnotationRef >();
5556 }
@@ -75,23 +76,23 @@ public GroovyAnnotationRef[] annotations() {
7576 */
7677 @ Override
7778 public String qualifiedTypeName () {
78- return externalClass .getName ();
79+ String canonicalName = externalClass .getCanonicalName ();
80+ return canonicalName != null ? canonicalName : externalClass .getName ();
7981 }
8082
8183 /**
8284 * {@inheritDoc}
8385 */
8486 @ Override
8587 public GroovyClassDoc superclass () {
86- Class aClass = externalClass .getSuperclass ();
87- if (aClass != null ) return new ExternalGroovyClassDoc (aClass );
88- return new ExternalGroovyClassDoc (Object .class );
88+ Class <?> aClass = externalClass .getSuperclass ();
89+ return aClass != null ? new ExternalGroovyClassDoc (aClass ) : null ;
8990 }
9091
9192 /**
9293 * Returns the underlying reflected class.
9394 */
94- public Class externalClass () {
95+ public Class <?> externalClass () {
9596 return externalClass ;
9697 }
9798
@@ -107,7 +108,11 @@ public String getTypeSourceDescription() {
107108 */
108109 @ Override
109110 public String simpleTypeName () {
110- return qualifiedTypeName (); // TODO fix
111+ String simpleName = externalClass .getSimpleName ();
112+ if (!simpleName .isEmpty ()) return simpleName ;
113+ String qualifiedName = qualifiedTypeName ();
114+ int lastDot = qualifiedName .lastIndexOf ('.' );
115+ return lastDot >= 0 ? qualifiedName .substring (lastDot + 1 ) : qualifiedName ;
111116 }
112117
113118 /**
@@ -248,7 +253,14 @@ public GroovyClassDoc[] innerClasses(boolean filter) {
248253 */
249254 @ Override
250255 public GroovyClassDoc [] interfaces () {
251- return EMPTY_GROOVYCLASSDOC_ARRAY ;
256+ Class <?>[] interfaces = externalClass .getInterfaces ();
257+ if (interfaces .length == 0 ) return EMPTY_GROOVYCLASSDOC_ARRAY ;
258+
259+ GroovyClassDoc [] result = new GroovyClassDoc [interfaces .length ];
260+ for (int i = 0 ; i < interfaces .length ; i ++) {
261+ result [i ] = new ExternalGroovyClassDoc (interfaces [i ]);
262+ }
263+ return result ;
252264 }
253265
254266 /**
@@ -264,7 +276,7 @@ public GroovyType[] interfaceTypes() {
264276 */
265277 @ Override
266278 public boolean isAbstract () {
267- return false ;
279+ return Modifier . isAbstract ( externalClass . getModifiers ()) ;
268280 }
269281
270282 /**
@@ -280,23 +292,23 @@ public boolean isExternalizable() {
280292 */
281293 @ Override
282294 public boolean isSerializable () {
283- return false ;
295+ return java . io . Serializable . class . isAssignableFrom ( externalClass ) ;
284296 }
285297
286298 /**
287299 * {@inheritDoc}
288300 */
289301 @ Override
290302 public GroovyMethodDoc [] methods () {
291- return EMPTY_GROOVYMETHODDOC_ARRAY ;
303+ return ExternalJavadocSupport . methodsFor ( this ) ;
292304 }
293305
294306 /**
295307 * {@inheritDoc}
296308 */
297309 @ Override
298310 public GroovyMethodDoc [] methods (boolean filter ) {
299- return EMPTY_GROOVYMETHODDOC_ARRAY ;
311+ return methods () ;
300312 }
301313
302314 /**
@@ -360,7 +372,7 @@ public GroovyPackageDoc containingPackage() {
360372 */
361373 @ Override
362374 public boolean isFinal () {
363- return false ;
375+ return Modifier . isFinal ( externalClass . getModifiers ()) ;
364376 }
365377
366378 /**
@@ -376,31 +388,31 @@ public boolean isPackagePrivate() {
376388 */
377389 @ Override
378390 public boolean isPrivate () {
379- return false ;
391+ return Modifier . isPrivate ( externalClass . getModifiers ()) ;
380392 }
381393
382394 /**
383395 * {@inheritDoc}
384396 */
385397 @ Override
386398 public boolean isProtected () {
387- return false ;
399+ return Modifier . isProtected ( externalClass . getModifiers ()) ;
388400 }
389401
390402 /**
391403 * {@inheritDoc}
392404 */
393405 @ Override
394406 public boolean isPublic () {
395- return false ;
407+ return Modifier . isPublic ( externalClass . getModifiers ()) ;
396408 }
397409
398410 /**
399411 * {@inheritDoc}
400412 */
401413 @ Override
402414 public boolean isStatic () {
403- return false ;
415+ return Modifier . isStatic ( externalClass . getModifiers ()) ;
404416 }
405417
406418 /**
@@ -416,15 +428,15 @@ public String modifiers() {
416428 */
417429 @ Override
418430 public int modifierSpecifier () {
419- return 0 ;
431+ return externalClass . getModifiers () ;
420432 }
421433
422434 /**
423435 * {@inheritDoc}
424436 */
425437 @ Override
426438 public String qualifiedName () {
427- return null ;
439+ return externalClass . getName () ;
428440 }
429441
430442 /**
@@ -448,7 +460,7 @@ public String getRawCommentText() {
448460 */
449461 @ Override
450462 public boolean isAnnotationType () {
451- return false ;
463+ return externalClass . isAnnotation () ;
452464 }
453465
454466 /**
@@ -464,7 +476,7 @@ public boolean isAnnotationTypeElement() {
464476 */
465477 @ Override
466478 public boolean isClass () {
467- return false ;
479+ return ! externalClass . isInterface () && ! externalClass . isAnnotation () && ! externalClass . isEnum () && ! externalClass . isRecord () ;
468480 }
469481
470482 /**
@@ -488,15 +500,15 @@ public boolean isDeprecated() {
488500 */
489501 @ Override
490502 public boolean isEnum () {
491- return false ;
503+ return externalClass . isEnum () ;
492504 }
493505
494506 /**
495507 * {@inheritDoc}
496508 */
497509 @ Override
498510 public boolean isRecord () {
499- return false ;
511+ return externalClass . isRecord () ;
500512 }
501513
502514 /**
@@ -544,7 +556,7 @@ public boolean isIncluded() {
544556 */
545557 @ Override
546558 public boolean isInterface () {
547- return false ;
559+ return externalClass . isInterface () ;
548560 }
549561
550562 /**
@@ -560,7 +572,7 @@ public boolean isMethod() {
560572 */
561573 @ Override
562574 public boolean isOrdinaryClass () {
563- return false ;
575+ return isClass () ;
564576 }
565577
566578 /**
0 commit comments