whole_func_string: function getName(path) {
      let namedNode
  
      path.find(parentPath => {
        if (parentPath.isObjectProperty()) {
          // const X = { Y: glamorous }
          namedNode = parentPath.node.key
        } else if (parentPath.isVariableDeclarator()) {
          // let X; X = glamorous
          namedNode = parentPath.node.id
        } else if (parentPath.isStatement()) {
          // we've hit a statement, we should stop crawling up
          return true
        }
  
        // we've got an displayName (if we need it) no need to continue
        if (namedNode) {
          return true
        }
        return false
      })
  
      // identifiers are the only thing we can reliably get a name from
      return t.isIdentifier(namedNode) ? namedNode.name : undefined
    }
func_code_string: function getName(path) {
      let namedNode
  
      path.find(parentPath => {
        if (parentPath.isObjectProperty()) {
          // const X = { Y: glamorous }
          namedNode = parentPath.node.key
        } else if (parentPath.isVariableDeclarator()) {
          // let X; X = glamorous
          namedNode = parentPath.node.id
        } else if (parentPath.isStatement()) {
          // we've hit a statement, we should stop crawling up
          return true
        }
  
        // we've got an displayName (if we need it) no need to continue
        if (namedNode) {
          return true
        }
        return false
      })
  
      // identifiers are the only thing we can reliably get a name from
      return t.isIdentifier(namedNode) ? namedNode.name : undefined
    }
func_documentation_string: credit: https://github.com/styled-components/babel-plugin-styled-components/blob/37a13e9c21c52148ce6e403100df54c0b1561a88/src/utils/getName.js