public final List allFields()

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;
    }