function inspectPrimordialAssignments(
  ast,
  namedIntrinsics = defaultNamedIntrinsics
) {
  /** @type {PrimordialAssignment[]} */
  const results = []
  traverse(ast, {
    AssignmentExpression: function (path) {
      const { node } = path
      const { left } = node
      // select for assignment to a property
      if (!isMemberLikeExpression(left)) {
        return
      }
      const { property, computed } = left
      // skip if property name is a variable
      if (computed) {
        return
      }
      if (property.type !== 'Identifier') {
        return
      }
      // check for assignment to intrinsic
      const memberPath = memberExpressionChainToPath(left)
      const rootIdentifierName = memberPath[0]
      // check if it looks like we're assigning to an intrinsic
      const looksLikeIntrinsic = namedIntrinsics.includes(rootIdentifierName)
      if (!looksLikeIntrinsic) {
        return
      }
      // check if this shadowed reference and not the intrinsic
      const binding = path.scope.getBinding(rootIdentifierName)
      if (binding) {
        return
      }
      // its a match!
      results.push({ node, path, memberPath })
    },
  })
  return results
}
@param {import('@babel/types').Node} ast
@param {readonly string[]} namedIntrinsics
@returns {PrimordialAssignment[]}