in core/src/main/java/com/jetbrains/sa/jdi/ReferenceTypeImpl.java [242:293]
public final List<FieldImpl> allFields() throws ClassNotPreparedException {
List<FieldImpl> allFields = (allFieldsCache != null)? allFieldsCache.get() : null;
if (allFields == null) {
checkPrepared();
if (saKlass instanceof ArrayKlass) {
// is 'length' a field of array klasses? To maintain
// consistency with JVMDI-JDI we return 0 size.
allFields = Collections.emptyList();
} else {
// Get a list of the sa Field types
// getAllFields() is buggy and does not return all super classes
// saFields = ((InstanceKlass)saKlass).getAllFields();
InstanceKlass saKlass = (InstanceKlass) this.saKlass;
List saFields = saKlass.getImmediateFields();
// transitiveInterfaces contains all interfaces implemented
// by this class and its superclass chain with no duplicates.
for (InstanceKlass intf1 : CompatibilityHelper.INSTANCE.getTransitiveInterfaces(saKlass)) {
if (Assert.ASSERTS_ENABLED) {
Assert.that(intf1.isInterface(), "just checking type");
}
saFields.addAll(intf1.getImmediateFields());
}
// Get all fields in the superclass, recursively. But, don't
// include fields in interfaces implemented by superclasses;
// we already have all those.
if (!saKlass.isInterface()) {
InstanceKlass supr = saKlass;
while ( (supr = (InstanceKlass) supr.getSuper()) != null) {
saFields.addAll(supr.getImmediateFields());
}
}
// Create a list of our Field types
allFields = new ArrayList<FieldImpl>(saFields.size());
for (Object saField : saFields) {
sun.jvm.hotspot.oops.Field curField = (sun.jvm.hotspot.oops.Field) saField;
if (!isThrowableBacktraceField(curField)) {
allFields.add(new FieldImpl(vm.referenceType(curField.getFieldHolder()), curField));
}
}
}
allFields = Collections.unmodifiableList(allFields);
allFieldsCache = new SoftReference<List<FieldImpl>>(allFields);
}
return allFields;
}