From 1e86cb6810ba70a2de0d8679ea87df7afca24c73 Mon Sep 17 00:00:00 2001 From: rmorshea Date: Fri, 16 Sep 2022 23:53:32 -0700 Subject: [PATCH] only check hook usage inside calls --- flake8_idom_hooks/rules_of_hooks.py | 7 ++- .../custom_component_decorator_pattern.py | 4 +- tests/cases/custom_hook_function_pattern.py | 4 +- tests/cases/hook_usage.py | 59 +++++++++++++------ tests/cases/no_exhaustive_deps.py | 2 +- 5 files changed, 51 insertions(+), 25 deletions(-) diff --git a/flake8_idom_hooks/rules_of_hooks.py b/flake8_idom_hooks/rules_of_hooks.py index 5356ac5..c8ac79d 100644 --- a/flake8_idom_hooks/rules_of_hooks.py +++ b/flake8_idom_hooks/rules_of_hooks.py @@ -45,8 +45,13 @@ def visit_FunctionDef(self, node: ast.FunctionDef) -> None: with set_current(self, function=node): self.generic_visit(node) + def visit_Call(self, node: ast.Call) -> None: + with set_current(self, call=node): + self.generic_visit(node) + def _visit_hook_usage(self, node: ast.Name | ast.Attribute) -> None: - self._check_if_propper_hook_usage(node) + if self._current_call: + self._check_if_propper_hook_usage(node) visit_Attribute = _visit_hook_usage visit_Name = _visit_hook_usage diff --git a/tests/cases/custom_component_decorator_pattern.py b/tests/cases/custom_component_decorator_pattern.py index 54e546f..73e592a 100644 --- a/tests/cases/custom_component_decorator_pattern.py +++ b/tests/cases/custom_component_decorator_pattern.py @@ -2,11 +2,11 @@ def check_normal_pattern(): if True: # error: ROH102 hook 'use_state' used inside if statement - use_state + use_state() @custom_component def check_custom_pattern(): if True: # error: ROH102 hook 'use_state' used inside if statement - use_state + use_state() diff --git a/tests/cases/custom_hook_function_pattern.py b/tests/cases/custom_hook_function_pattern.py index c1b5b35..0655ff5 100644 --- a/tests/cases/custom_hook_function_pattern.py +++ b/tests/cases/custom_hook_function_pattern.py @@ -2,6 +2,6 @@ def check(): if True: # this get's ignored because of custom pattern - use_ignore_this + use_ignore_this() # error: ROH102 hook 'use_state' used inside if statement - use_state + use_state() diff --git a/tests/cases/hook_usage.py b/tests/cases/hook_usage.py index 87724ce..f08509a 100644 --- a/tests/cases/hook_usage.py +++ b/tests/cases/hook_usage.py @@ -2,11 +2,29 @@ from idom import component +@component +def HookInIfNoCall(): + if True: + # Ok, hook was not called + use_state + + @component def HookInIf(): if True: # error: ROH102 hook 'use_state' used inside if statement - use_state + use_state() + + +@component +def HookInIfInExpression(): + if True: + ( + None + or + # error: ROH102 hook 'use_state' used inside if statement + use_state + )() @component @@ -15,7 +33,7 @@ def HookInElif(): pass elif True: # error: ROH102 hook 'use_state' used inside if statement - use_state + use_state() @component @@ -24,14 +42,14 @@ def HookInElse(): pass else: # error: ROH102 hook 'use_state' used inside if statement - use_state + use_state() @component def HookInIfExp(): ( # error: ROH102 hook 'use_state' used inside inline if expression - use_state + use_state() if True else None ) @@ -44,7 +62,7 @@ def HookInElseOfIfExp(): if True else # error: ROH102 hook 'use_state' used inside inline if expression - use_state + use_state() ) @@ -52,7 +70,7 @@ def HookInElseOfIfExp(): def HookInTry(): try: # error: ROH102 hook 'use_state' used inside try statement - use_state + use_state() except: pass @@ -63,7 +81,7 @@ def HookInExcept(): raise ValueError() except: # error: ROH102 hook 'use_state' used inside try statement - use_state + use_state() @component @@ -72,21 +90,21 @@ def HookInFinally(): pass finally: # error: ROH102 hook 'use_state' used inside try statement - use_state + use_state() @component def HookInForLoop(): for i in range(3): # error: ROH102 hook 'use_state' used inside for loop - use_state + use_state() @component def HookInWhileLoop(): while True: # error: ROH102 hook 'use_state' used inside while loop - use_state + use_state() def outer_function(): @@ -97,39 +115,42 @@ def use_state(): def generic_function(): # error: ROH101 hook 'use_state' used outside component or hook definition - use_state + use_state() @component def use_state(): - use_other + use_other() @component def Component(): - use_state + use_state() @idom.component def IdomLongImportComponent(): - use_state + use_state() @component def use_custom_hook(): - use_state + use_state() # ok since 'use_state' is not the last attribute module.use_state.other +# ok since use state is not called +module.use_effect + # error: ROH101 hook 'use_effect' used outside component or hook definition module.use_effect() def not_hook_or_component(): # error: ROH101 hook 'use_state' used outside component or hook definition - use_state + use_state() @component @@ -137,7 +158,7 @@ def make_component(): # nested component definitions are ok. @component def NestedComponent(): - use_state + use_state() some_global_variable @@ -154,11 +175,11 @@ def Component(): @component def Component(): # this is ok since the conditional is outside the component - use_state + use_state() @component def use_other(): - use_state + use_state() @component diff --git a/tests/cases/no_exhaustive_deps.py b/tests/cases/no_exhaustive_deps.py index fb1d6fa..167d348 100644 --- a/tests/cases/no_exhaustive_deps.py +++ b/tests/cases/no_exhaustive_deps.py @@ -1,7 +1,7 @@ # confirm that we're still checking for other errors def generic_function(): # error: ROH101 hook 'use_state' used outside component or hook definition - use_state + use_state() @component