function parseUI5Types(sComplexType) {
		let oParsed;
		try {
			oParsed = typeParser.parseSimpleTypes(sComplexType, isUI5Type);
		} catch (e) {
			log.error("Error parsing type: " + sComplexType);
			log.error(e);
			oParsed = { template: sComplexType };
		}

		const result = {};

		if (oParsed.template !== '${0}') { // default is '${0}', so omit if not required
			result.template = oParsed.template;
		}

		if (oParsed.simpleTypes?.length) { // it can be empty if none of the included simple types satisfied the filter function
			result.UI5Types = oParsed.simpleTypes;
		}

		return result;
	}
Returns an object with the parsed custom-type information, namely:
- types: array of the parsed UI5 types inside the given complex type
- template: the template string with placeholders for the parsed UI5 types

Examples:

- parseUI5Types("sap.ui.core.ID | sap.ui.core.Control") returns
  {
    template: "${0} | ${1}",
    UI5Types: ["sap.ui.core.ID", "sap.ui.core.Control"]
  }

- parseUI5Types("Array<sap.ui.core.Control>") returns
   {
     template: "Array<${0}>",
     UI5Types: ["sap.ui.core.Control"]
   }

- parseUI5Types("Array<sap.ui.core.ID|string>") returns
   {
     template: "Array<${0} | string>", // built-in types remain unchanged in the template
     UI5Types: ["sap.ui.core.ID"]
   }

- parseUI5Types("Object<string, sap.ui.core.Control>") returns
   {
     template: "Object<string, ${0}>", // built-in types remain unchanged in the template
     UI5Types: ["sap.ui.core.Control"]
   }

- parseUI5Types("string") returns
   {
     template: "string" // skip the types array if empty
   }

- parseUI5Types("sap.ui.core.Control") returns
   {
     UI5Types: ["sap.ui.core.Control"] // skip template if its value is "${0}" (default value)
   }
@param {string} sComplexType
@returns {{template=: string, UI5Types=: string[]}}