function validatePropertyDeep(oPropertyHelper, oProperty, aProperties, sPath, oPropertySection, mAttributeSection) {
		const bTopLevel = sPath == null;

		if (bTopLevel) {
			mAttributeSection = _private.get(oPropertyHelper).mAttributeMetadata;
			oPropertySection = oProperty;
		}

		for (const sAttribute in oPropertySection) {
			let mAttribute = mAttributeSection[sAttribute];
			const sAttributePath = bTopLevel ? sAttribute : sPath + "." + sAttribute;
			const vValue = oPropertySection[sAttribute];

			// Consider legacy alias
			if (!mAttribute) {
				mAttribute = mAttributeSection[Object.entries(mLegacyAlias).find((aEntry) => aEntry[1] === sAttribute)?.[0]];
			}

			if (!mAttribute) {
				reportInvalidProperty("Property contains invalid attribute '" + sAttributePath + "'.", oProperty);
			} else if (PropertyHelper.isPropertyComplex(oProperty) && !mAttribute.inComplexProperty.allowed) {
				reportInvalidProperty("Complex property contains invalid attribute '" + sAttributePath + "'.", oProperty);
			} else if (typeof mAttribute.type === "object" && vValue && typeof vValue === "object") {
				validatePropertyDeep(
					oPropertyHelper, oProperty, aProperties, sAttributePath, vValue, mAttribute.type
				);
			} else if (vValue != null && !getAttributeDataType(mAttribute.type).isValid(vValue)) {
				// Optional attributes may have null or undefined as value.
				throwInvalidPropertyError("The value of '" + sAttributePath + "' is invalid.", oProperty);
			} else if (vValue && typeof mAttribute.type === "string" && mAttribute.type.startsWith("PropertyReference")) {
				validatePropertyReferences(
					oPropertyHelper, oProperty, aProperties, sAttributePath, vValue, mAttribute
				);
			}
		}
	}
Validates a property. The entire array of properties needs to be provided for validation of a complex property.

<b>Note for classes that override this method:</b>
No other method of the helper must be called from here. The properties are not yet stored in the helper, and therefore
any method that tries to access them might not work as expected.

@param {sap.ui.mdc.util.PropertyInfo} oProperty The property to validate
@param {sap.ui.mdc.util.PropertyInfo[]} aProperties The entire array properties
@param {sap.ui.mdc.util.PropertyInfo[]} [aPreviousProperties] The previous set of properties to validate against
@throws {Error} If the property is invalid
@protected