private DefaultPdbUniversalMember getNonStaticMember(Composite container, Access defaultAccess,
			AbstractMemberMsType memberMsType, int ordinal)
			throws CancelledException, PdbException {

		MsTypeApplier applier = applicator.getTypeApplier(memberMsType);
		if (!(applier instanceof MemberTypeApplier memberApplier)) {
			throw new PdbException("Member applier expected");
		}

		String memberName = memberMsType.getName();
		int offset = applicator.bigIntegerToInt(memberMsType.getOffset());

		ClassFieldMsAttributes memberAttributes = memberMsType.getAttribute();
		memberAttributes.getAccess(); // TODO: do something with this and other attributes

		RecordNumber typeRecordNumber = memberMsType.getFieldTypeRecordNumber();
		AbstractMsType fieldType = applicator.getTypeRecord(typeRecordNumber);
		MsTypeApplier fieldApplier = applicator.getTypeApplier(fieldType);

		String memberComment = null;
		RecordNumber fieldRecordNumber = memberMsType.getFieldTypeRecordNumber();
		DataType fieldDataType = applicator.getDataType(fieldRecordNumber);
		if (fieldDataType == null) {
			throw new PdbException("Type not processed for record: " + fieldRecordNumber);
		}
		else if (fieldApplier instanceof PointerTypeApplier ptrApplier) {
			// The above placeholder could be a pointer, but then we wouldn't be getting
			//  a comment here anyways, so the "else" is perfect... we don't want to overwrite
			//  the placeholder comment
			AbstractPointerMsType pointerType = (AbstractPointerMsType) fieldType;
			memberComment = ptrApplier.getPointerCommentField(pointerType);
		}

		boolean isZeroLengthArray = (fieldDataType instanceof Array &&
			fieldApplier instanceof ArrayTypeApplier arrayApplier &&
			arrayApplier.isFlexibleArray(fieldType));

		DefaultPdbUniversalMember member =
			new DefaultPdbUniversalMember(memberName, fieldDataType, isZeroLengthArray, offset,
				ClassFieldAttributes.convert(memberAttributes, defaultAccess), memberComment);
		return member;
	}
Uses {@link DefaultPdbApplicator#getDataTypeOrSchedule(RecordNumber)}) on all underlying
 types to ensure that the types get scheduled... and detects whether any types were not yet
 available so that this composite type is denoted as not done.
@param lists the lists of all underlying types
@return {@code true} if all underlying types are already available
@throws PdbException upon processing issue
@throws CancelledException upon user cancellation
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CompositeTypeApplier.java