function processTypes(aTypes) {
				(aTypes || []).forEach(function (oType) {
					(oType.property || []).forEach(function (oProperty) {
						var sAnnotationName,
							oInterface,
							sSemantics,
							oTarget,
							oUnitPath,
							sUnitPath = oProperty["sap:unit"],
							oUnitProperty;

						if (sUnitPath) {
							oInterface = {
								getModel : function () {
									return oMetaModel;
								},
								getPath : function () {
									return oType.$path;
								}
							};
							oUnitPath = {"Path" : sUnitPath};
							oTarget = _AnnotationHelperBasics.followPath(oInterface, oUnitPath);
							if (oTarget && oTarget.resolvedPath) {
								oUnitProperty = oMetaModel.getProperty(oTarget.resolvedPath);
								sSemantics = oUnitProperty["sap:semantics"];
								if (sSemantics === "unit-of-measure") {
									sAnnotationName = "Org.OData.Measures.V1.Unit";
								} else if (sSemantics === "currency-code") {
									sAnnotationName = "Org.OData.Measures.V1.ISOCurrency";
								} else if (Log.isLoggable(iWARNING, sLoggingModule)) {
									Log.warning("Unsupported sap:semantics='"
											+ sSemantics + "' at sap:unit='" + sUnitPath + "'; "
											+ "expected 'currency-code' or 'unit-of-measure'",
										oType.namespace + "." + oType.name + "/" + oProperty.name,
										sLoggingModule);
								}
								// Do not overwrite an existing annotation
								if (sAnnotationName && !(sAnnotationName in oProperty)) {
									oProperty[sAnnotationName] = oUnitPath;
								}
							} else if (Log.isLoggable(iWARNING, sLoggingModule)) {
								Log.warning("Path '" + sUnitPath
										+ "' for sap:unit cannot be resolved",
									oType.namespace + "." + oType.name + "/" + oProperty.name,
									sLoggingModule);
							}
						}
					});
				});
			}
Process all types in the given array.
@param {object[]} [aTypes] A list of complex types or entity types.