void buildDataTypes(TaskMonitor monitor) throws CancelledException {

		monitor.setMessage("Order PDB datatypes... ");

		List<CompositeDefinition> verticesInPostOrder =
			getCompositeDefinitionsInPostDependencyOrder(monitor);

		monitor.setMessage("Building PDB datatypes... ");

		for (CompositeDefinition compositeDefinition : verticesInPostOrder) {
			monitor.checkCancelled();

			// namespace qualified name used for cache lookups
			DataType cachedDataType = pdbParser.getCachedDataType(compositeDefinition.name);
			SymbolPath symbolPath = new SymbolPath(compositeDefinition.name);
			if (!(cachedDataType instanceof Composite) ||
				!cachedDataType.getCategoryPath().equals(
					pdbParser.getCategory(symbolPath.getParent(), true)) ||
				!pdbParser.isCorrectKind(cachedDataType, compositeDefinition.kind)) {
				log.appendMsg("PDB", "Conflicting data type name: " + compositeDefinition.name);
				continue;
			}
			Composite composite = (Composite) cachedDataType;
			PdbUtil.clearComponents(composite);

			if (!DefaultCompositeMember.applyDataTypeMembers(composite, false,
				compositeDefinition.isClass, compositeDefinition.length,
				getNormalMembersOnly(compositeDefinition), msg -> Msg.warn(this, msg), monitor)) {
				PdbUtil.clearComponents(composite);
			}

		}
	}
Perform parsing and caching of composite types 
@param monitor task monitor
@throws CancelledException if task cancelled
Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb/ApplyDataTypes.java