function createNamespaceTree(allSymbols) {

	info(`create namespace tree (${allSymbols.length} symbols)`);

	const aRootNamespaces = [];
	const aTypes = allSymbols.filter((symbol) => isFirstClassSymbol(symbol));

	for (let i = 0; i < aTypes.length; i++) { // loop with a for-loop as it can handle concurrent modifications

		const symbol = aTypes[i];
		if ( symbol.memberof ) {

			let parent = lookup(symbol.memberof);
			if ( !parent ) {
				warning(`create missing namespace '${symbol.memberof}' (referenced by ${symbol.longname})`);
				parent = makeNamespace(symbol.memberof);
				aTypes.push(parent); // concurrent modification: parent will be processed later in this loop
			}
			symbol.__ui5.parent = parent;
			parent.__ui5.children = parent.__ui5.children || [];
			parent.__ui5.children.push(symbol);

		} else if ( symbol.longname !== ANONYMOUS_LONGNAME ) {

			aRootNamespaces.push(symbol);

		}
	}

	return aRootNamespaces;
}
Completes the tree of namespaces.

Namespaces for which content is available but which have not been documented
are created as dummy, public namespace with empty documentation.

@param {Array<doclet.Doclet>} allSymbols Array of all symbols to be published
@returns {Array<doclet.Doclet>} Array of all root namespaces