function resolveObjectPatternChain (valueNode, keyNode, keyChain) {
	let chainSequence = [];

	if (valueNode && valueNode.type === Syntax.ObjectPattern) {
		for (let i = 0; i < valueNode.properties.length; i++) {
			chainSequence = chainSequence.concat(
				resolveObjectPatternChain(
					valueNode.properties[i].value,
					valueNode.properties[i].key,
					[...keyChain, valueNode.properties[i].key.name] )
			);
		}
	} else if (valueNode && valueNode.type === Syntax.ArrayPattern) {
		for (let i = 0; i < valueNode.elements.length; i++) {
			chainSequence = chainSequence.concat(
				resolveObjectPatternChain(
					valueNode.elements[i],
					valueNode.elements[i],
					[...keyChain, String(i)]
				)
			);
		}
	} else {

		const result = { original: keyNode.name, path: keyChain.join(".") };

		if (keyNode.name !== valueNode.name) {
			// Renaming
			result.renamed = valueNode.name;
		}

		chainSequence.push(result);
	}

	return chainSequence;
}
Resolves (nested) Object/ArrayPattern nodes and builds a "path"

@param {Node} valueNode
@param {Node} keyNode
@param {Array<String>} keyChain
@returns Array<Object<Node, Node, Array<String>>>