function getReportNodes(node) {
  const { value } = node
  if (!value) {
    return []
  }
  const { expression } = value
  if (!expression) {
    return []
  }

  let elements
  if (expression.type === 'ObjectExpression') {
    elements = [expression]
  } else if (expression.type === 'ArrayExpression') {
    elements = expression.elements
  } else {
    return []
  }
  const staticProperties = []
  for (const element of elements) {
    if (!element) {
      continue
    }
    if (element.type !== 'ObjectExpression') {
      return staticProperties
    }

    let isAllStatic = true
    for (const prop of element.properties) {
      if (prop.type === 'SpreadElement' || prop.computed) {
        // If `SpreadElement` or computed property exists, it gets only the static properties before it.
        return staticProperties
      }
      if (isStaticValue(prop)) {
        staticProperties.push(prop)
      } else {
        isAllStatic = false
      }
    }
    if (!isAllStatic) {
      // If non-static object exists, it gets only the static properties up to that object.
      return staticProperties
    }
  }
  // If all properties are static properties, it returns one root node.
  return [node]
}
Gets the static properties of a given expression node.
- If `SpreadElement` or computed property exists, it gets only the static properties before it.
  `:style="{ color: 'red', display: 'flex', ...spread, width: '16px' }"`
             ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^
- If non-static object exists, it gets only the static properties up to that object.
  `:style="[ { color: 'red' }, { display: 'flex', color, width: '16px' }, { height: '16px' } ]"`
               ^^^^^^^^^^^^      ^^^^^^^^^^^^^^^         ^^^^^^^^^^^^^
- If all properties are static properties, it returns one root node.
  `:style="[ { color: 'red' }, { display: 'flex', width: '16px' } ]"`
   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@param {VDirective} node `:style` node to check
@returns {Property[] | [VDirective]} the static properties.