@@ -316,16 +316,17 @@ module.exports = function usedPropTypesInstructions(context, components, utils)
316316 break ;
317317 case 'ArrowFunctionExpression' :
318318 case 'FunctionDeclaration' :
319- case 'FunctionExpression' :
319+ case 'FunctionExpression' : {
320320 if ( node . params . length === 0 ) {
321321 break ;
322322 }
323323 type = 'destructuring' ;
324- properties = node . params [ 0 ] . properties ;
325- if ( inSetStateUpdater ( ) ) {
326- properties = node . params [ 1 ] . properties ;
327- }
324+ const propParam = inSetStateUpdater ( ) ? node . params [ 1 ] : node . params [ 0 ] ;
325+ properties = propParam . type === 'AssignmentPattern'
326+ ? propParam . left . properties
327+ : propParam . properties ;
328328 break ;
329+ }
329330 case 'VariableDeclarator' :
330331 for ( let i = 0 , j = node . id . properties . length ; i < j ; i ++ ) {
331332 // let {props: {firstname}} = this
@@ -421,7 +422,13 @@ module.exports = function usedPropTypesInstructions(context, components, utils)
421422 * FunctionDeclaration, or FunctionExpression
422423 */
423424 function markDestructuredFunctionArgumentsAsUsed ( node ) {
424- const destructuring = node . params && node . params [ 0 ] && node . params [ 0 ] . type === 'ObjectPattern' ;
425+ const param = node . params && inSetStateUpdater ( ) ? node . params [ 1 ] : node . params [ 0 ] ;
426+
427+ const destructuring = param && (
428+ param . type === 'ObjectPattern' ||
429+ param . type === 'AssignmentPattern' && param . left . type === 'ObjectPattern'
430+ ) ;
431+
425432 if ( destructuring && ( components . get ( node ) || components . get ( node . parent ) ) ) {
426433 markPropTypesAsUsed ( node ) ;
427434 }
0 commit comments