Skip to content

Commit f65c867

Browse files
daniellansunpaulk-asert
authored andcommitted
GROOVY-11988: Add support for {@inheritdoc} in external JDK classes
1 parent a24f1c7 commit f65c867

12 files changed

Lines changed: 1253 additions & 50 deletions

subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/ExternalGroovyClassDoc.java

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.codehaus.groovy.groovydoc.GroovyPackageDoc;
2828
import org.codehaus.groovy.groovydoc.GroovyType;
2929

30+
import java.lang.reflect.Modifier;
3031
import java.util.ArrayList;
3132
import 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

Comments
 (0)