private boolean precheckOrScheduleDependencies(FieldListTypeApplier.FieldLists lists)
			throws PdbException, CancelledException {
		boolean done = true;
		for (AbstractMsType base : lists.bases()) {
			applicator.checkCancelled();
			if (base instanceof AbstractBaseClassMsType bc) {
				RecordNumber recordNumber = bc.getBaseClassRecordNumber();
				DataType dt = applicator.getBaseClassDataTypeOrSchedule(recordNumber);
				if (dt == null) {
					done = false;
				}
			}
			else if (base instanceof AbstractVirtualBaseClassMsType vbc) {
				RecordNumber recordNumber = vbc.getVirtualBasePointerRecordNumber();
				DataType dt = applicator.getDataTypeOrSchedule(recordNumber);
				if (dt == null) {
					done = false;
				}
				recordNumber = vbc.getBaseClassRecordNumber();
				dt = applicator.getBaseClassDataTypeOrSchedule(recordNumber);
				if (dt == null) {
					done = false;
				}
			}
			else if (base instanceof AbstractIndirectVirtualBaseClassMsType ivbc) {
				RecordNumber recordNumber = ivbc.getVirtualBasePointerRecordNumber();
				DataType dt = applicator.getDataTypeOrSchedule(recordNumber);
				if (dt == null) {
					done = false;
				}
				recordNumber = ivbc.getBaseClassRecordNumber();
				dt = applicator.getBaseClassDataTypeOrSchedule(recordNumber);
				if (dt == null) {
					done = false;
				}
			}
			else {
				throw new PdbException("Unhandled type: " + base.getClass().getSimpleName());
			}
		}
		for (AbstractMsType method : lists.methods()) {
			applicator.checkCancelled();
			if (method instanceof AbstractOneMethodMsType oneMethod) {
				RecordNumber recordNumber = oneMethod.getProcedureTypeRecordNumber();
				DataType dt = applicator.getDataTypeOrSchedule(recordNumber);
				if (dt == null) {
					done = false;
				}
			}
			else if (method instanceof AbstractOverloadedMethodMsType overloadedMethod) {
				RecordNumber recordNumber = overloadedMethod.getTypeMethodListRecordNumber();
				AbstractMsType msType = applicator.getTypeRecord(recordNumber);
				if (msType instanceof AbstractMethodListMsType methodList) {
					List<AbstractMethodRecordMs> methodRecords = methodList.getList();
					for (AbstractMethodRecordMs methodRecord : methodRecords) {
						recordNumber = methodRecord.getProcedureTypeRecordNumber();
						DataType dt = applicator.getDataTypeOrSchedule(recordNumber);
						if (dt == null) {
							done = false;
						}
					}
				}
			}
			else {
				throw new PdbException("Unhandled type: " + method.getClass().getSimpleName());
			}
		}
		// Might cause problems, so remove until understood and possibly needed
//		for (AbstractNestedTypeMsType nested : lists.nestedTypes()) {
//			applicator.checkCancelled();
//			RecordNumber recordNumber = nested.getNestedTypeDefinitionRecordNumber();
//			DataType dt = applicator.getDataTypeOrSchedule(recordNumber);
//			if (dt == null) {
//				done = false;
//			}
//		}
		for (AbstractMemberMsType nonstaticMember : lists.nonstaticMembers()) {
			applicator.checkCancelled();
			RecordNumber recordNumber = nonstaticMember.getFieldTypeRecordNumber();
			DataType dt = applicator.getDataTypeOrSchedule(recordNumber);
			if (dt == null) {
				done = false;
			}
		}
		for (AbstractStaticMemberMsType staticMember : lists.staticMembers()) {
			applicator.checkCancelled();
			RecordNumber recordNumber = staticMember.getFieldTypeRecordNumber();
			DataType dt = applicator.getDataTypeOrSchedule(recordNumber);
			if (dt == null) {
				done = false;
			}
		}

		// Not doing enumerates for now... look at EnumTypeApplier, too, regarding how to deal
		//  with not storing a type with applicator.putDataType and yet getting removed from or
		//  not being added to the "todo" schedule.
//		for (AbstractEnumerateMsType enumerate : lists.enumerates()) {
//			applicator.checkCancelled();
//			RecordNumber recordNumber = enumerate.getRecordNumber();
//			DataType dt = applicator.getDataTypeOrSchedule(recordNumber);
//			if (dt == null) {
//				done = false;
//			}
//		}
		for (AbstractVirtualFunctionTablePointerMsType msVftPtr : lists.vftPtrs()) {
			applicator.checkCancelled();
			RecordNumber recordNumber = msVftPtr.getPointerTypeRecordNumber();
			DataType dt = applicator.getDataTypeOrSchedule(recordNumber);
			if (dt == null) {
				done = false;
			}
		}
		return done;
	}
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