function isAssociativeWith (nodeA, nodeB, parenthesis) {
  // ParenthesisNodes are only ignored when not in 'keep' mode
  const a = (parenthesis !== 'keep') ? nodeA.getContent() : nodeA
  const b = (parenthesis !== 'keep') ? nodeA.getContent() : nodeB
  const identifierA = a.getIdentifier()
  const identifierB = b.getIdentifier()
  const index = getPrecedence(a, parenthesis)
  if (index === null) {
    // node isn't in the list
    return null
  }
  const property = properties[index][identifierA]

  if (hasOwnProperty(property, 'associativeWith') &&
      (property.associativeWith instanceof Array)) {
    for (let i = 0; i < property.associativeWith.length; i++) {
      if (property.associativeWith[i] === identifierB) {
        return true
      }
    }
    return false
  }

  // associativeWith is not defined
  return null
}
Check if an operator is associative with another operator.
Returns either true or false or null if not defined.

@param {Node} nodeA
@param {Node} nodeB
@param {string} parenthesis
@return {boolean | null}