void process(RecordNumber recordNumber, TaskMonitor monitor)
			throws PdbException, CancelledException {

		// If found in the applicator map then the type is completed.
		if (applicator.getDataType(recordNumber) != null) {
			return;
		}
		// Location where one might do conditional: todoStack.setDebug(true)

		// If not in the map, it will also not be in the todo or resolve stacks, as both
		//  should be empty at this point.
		scheduleTodo(recordNumber);

		RecordNumber recordToProcess;
		// Peek at top of stack.  If can be removed, it will be; otherwise other records can be
		//  pushed on top of this one for next loop cycle.
		while ((recordToProcess = todoStack.peek()) != null) {
			monitor.checkCancelled();
			MsDataTypeApplier dataTypeApplier =
				(MsDataTypeApplier) applicator.getTypeApplier(recordToProcess);
			AbstractMsType msType = pdb.getTypeRecord(recordToProcess);
			// If processing is done, then pop from todoStack and put onto resolveStack.
			//  If not completed, the do not remove from todoStack.
			if (dataTypeApplier.apply(msType)) {
				if (todoStack.peek() != recordToProcess) {
					throw new AssertException("Top of stack violation");
				}
				todoStack.pop();
				resolveStack.push(recordToProcess);
				// only update when popped; 1st of 2 monitor updates;  monitor count was
				//  initialized in DefaultPdbApplicator.processAndResolveDataTypesSequentially()
				monitor.incrementProgress(1);
			}
		}
		// If set true above, location where one might do conditional: todoStack.setDebug(false)

		// Pop top of stack and work on it.
		while ((recordToProcess = resolveStack.pop()) != null) {
			monitor.checkCancelled();
			DataType dataType = applicator.getDataType(recordToProcess);
			// Resolve and re-store most types.  Normally we wouldn't want to resolve
			// pointer types, but here it is preferred while we have the types in hand.  The
			// PDB would have a type record if it wasn't used somewhere here or as the referred-to
			// type of a typedef.
			if (!(dataType instanceof BitFieldDataType)) {
				dataType = applicator.resolve(dataType);
				applicator.putDataType(recordToProcess, dataType);
			}
			// 2nd of 2 monitor updates;  monitor count was initialized in
			//  DefaultPdbApplicator.processAndResolveDataTypesSequentially()
			monitor.incrementProgress(1);
		}
	}
Processes the data type associated with the record number and all dependencies of that
 type.  Deals with cyclic dependencies and ultimately stores resolved (in most cases)
 types in the DefaultPdbApplicator types map
@param recordNumber the record number
@param monitor the task monitor to use
@throws PdbException upon processing error
@throws CancelledException upon user cancellation
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/MultiphaseDataTypeResolver.java