Skip to content

Commit adc1973

Browse files
sonar-nigel[bot]Vibe Bot
authored andcommitted
SONARPY-638 Fix S5720 false positive on Enum._generate_next_value_ (#929)
Co-authored-by: Vibe Bot <vibe-bot@sonarsource.com> GitOrigin-RevId: fe66b00074a56902d8c633f3bb531d1d79b83e8b
1 parent 7c45b14 commit adc1973

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

python-checks/src/main/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheck.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ private boolean isRelevantMethod(ClassDef classDef, ClassSymbol classSymbol, Fun
9393
return false;
9494
}
9595

96+
// Skip _generate_next_value_ in Enum subclasses: it is a static protocol method per the Python docs
97+
if ("_generate_next_value_".equals(functionDef.name().name()) && classSymbol.isOrExtends("enum.Enum")) {
98+
return false;
99+
}
100+
96101
// Skip if the class has a ignored decorator
97102
if (functionDef.decorators().stream().anyMatch(this::isNonInstanceMethodDecorator)) {
98103
return false;

python-checks/src/test/resources/checks/instanceMethodSelfAsFirst.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,39 @@ def used_as_decorator_call(method): # OK
182182

183183
@used_as_decorator_call()
184184
def decorated(self): ...
185+
186+
from enum import Enum, auto
187+
import enum
188+
189+
# Do not raise on _generate_next_value_ in Enum subclasses
190+
class MyAutoName(Enum):
191+
def _generate_next_value_(name, start, count, last_values): # OK
192+
return name
193+
194+
class Animal(Enum):
195+
def _generate_next_value_(name, start, count, last_values): # OK
196+
return name.lower()
197+
198+
DOG = auto()
199+
CAT = auto()
200+
201+
class UpperCaseEnum(enum.Enum):
202+
def _generate_next_value_(name, start, count, last_values): # OK
203+
return name.upper()
204+
205+
class NotAnEnum:
206+
def _generate_next_value_(name, start, count, last_values): # Noncompliant
207+
return name
208+
209+
class EnumWithOtherMethod(Enum):
210+
def regular_method(arg): # Noncompliant
211+
pass
212+
213+
# Indirect Enum subclass: _generate_next_value_ should also be exempt
214+
class BaseAutoEnum(Enum):
215+
def _generate_next_value_(name, start, count, last_values): # OK
216+
return name.upper()
217+
218+
class DerivedAutoEnum(BaseAutoEnum):
219+
def _generate_next_value_(name, start, count, last_values): # OK
220+
return name.lower()

0 commit comments

Comments
 (0)