text: /**
   * @fileoverview Flag shouldComponentUpdate when extending PureComponent
   */
  'use strict'
  
  const Components = require('../util/Components')
  const astUtil = require('../util/ast')
  const docsUrl = require('../util/docsUrl')
  
  function errorMessage (node) {
    return `${node} does not need shouldComponentUpdate when extending React.PureComponent.`
  }
  
  // ------------------------------------------------------------------------------
  // Rule Definition
  // ------------------------------------------------------------------------------
  
  module.exports = {
    meta: {
      docs: {
        description: 'Flag shouldComponentUpdate when extending PureComponent',
        category: 'Possible Errors',
        recommended: false,
        url: docsUrl('no-redundant-should-component-update')
      },
      schema: []
    },
  
    create: Components.detect((context, components, utils) => {
      /**
       * Checks for shouldComponentUpdate property
       * @param {ASTNode} node The AST node being checked.
       * @returns {Boolean} Whether or not the property exists.
       */
      function hasShouldComponentUpdate (node) {
        const properties = astUtil.getComponentProperties(node)
        return properties.some(property => {
          const name = astUtil.getPropertyName(property)
          return name === 'shouldComponentUpdate'
        })
      }
  
      /**
       * Get name of node if available
       * @param {ASTNode} node The AST node being checked.
       * @return {String} The name of the node
       */
      function getNodeName (node) {
        if (node.id) {
          return node.id.name
        } else if (node.parent && node.parent.id) {
          return node.parent.id.name
        }
        return ''
      }
  
      /**
       * Checks for violation of rule
       * @param {ASTNode} node The AST node being checked.
       */
      function checkForViolation (node) {
        if (utils.isPureComponent(node)) {
          const hasScu = hasShouldComponentUpdate(node)
          if (hasScu) {
            const className = getNodeName(node)
            context.report({
              node: node,
              message: errorMessage(className)
            })
          }
        }
      }
  
      return {
        ClassDeclaration: checkForViolation,
        ClassExpression: checkForViolation
      }
    })
  }
  