From 214288237c850f20540c746b9d8a9f596ca41b4a Mon Sep 17 00:00:00 2001 From: Lexxxzy Date: Mon, 7 Oct 2024 17:00:42 +0300 Subject: [PATCH] Fix func keyword usage in Golike structs and interfaces --- lizard_languages/golike.py | 21 +++++++++++++++++++++ test/test_languages/testGo.py | 25 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/lizard_languages/golike.py b/lizard_languages/golike.py index caa15837..a1314607 100644 --- a/lizard_languages/golike.py +++ b/lizard_languages/golike.py @@ -13,11 +13,32 @@ def _state_global(self, token): if token == self.FUNC_KEYWORD: self._state = self._function_name self.context.push_new_function('') + elif token == 'type': + self._state = self._type_definition elif token in '{': self.sub_state(self.statemachine_clone()) elif token in '}': self.statemachine_return() + def _type_definition(self, token): + self._state = self._after_type_name + + def _after_type_name(self, token): + if token == 'struct': + self._state = self._struct_definition + elif token == 'interface': + self._state = self._interface_definition + else: + self._state = self._state_global + + @CodeStateMachine.read_inside_brackets_then("{}", "_state_global") + def _struct_definition(self, tokens): + pass + + @CodeStateMachine.read_inside_brackets_then("{}", "_state_global") + def _interface_definition(self, tokens): + pass + def _function_name(self, token): if token != '`': if token == '(': diff --git a/test/test_languages/testGo.py b/test/test_languages/testGo.py index 22fce2a3..5a6462d6 100644 --- a/test/test_languages/testGo.py +++ b/test/test_languages/testGo.py @@ -127,3 +127,28 @@ class c { } ''') self.assertEqual(0, len(result)) + def test_struct_with_func_followed_by_function_with_receiver(self): + result = get_go_function_list(''' + type Geometry struct { + isEqual func(float64, float64) error + } + + func (g *Geometry) sayGoodbye() { } + ''') + + self.assertEqual(1, len(result)) + self.assertEqual("sayGoodbye", result[0].name) + + def test_interface_with_func_followed_by_function_with_receiver(self): + result = get_go_function_list(''' + type MyComparator struct{} + + type Comparator interface { + Handle(func(int) string) + } + + func (m MyComparator) Handle(f func(int) string) {} + ''') + + self.assertEqual(1, len(result)) + self.assertEqual("Handle", result[0].name)