From 0424db1b07286f6926dec24f430e770ed4ad00bd Mon Sep 17 00:00:00 2001 From: maksim-grebeniuk-sonarsource <122789225+maksim-grebeniuk-sonarsource@users.noreply.github.com> Date: Fri, 3 Feb 2023 17:20:09 +0100 Subject: [PATCH] SONARPY-1257 fix quality flaws (#1365) --- .../AbstractUnreadPrivateMembersCheck.java | 24 +++++++++---------- .../org/sonar/python/checks/cdk/CdkUtils.java | 13 ---------- .../sonar/python/semantic/BuiltinSymbols.java | 15 ++++++------ 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/AbstractUnreadPrivateMembersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AbstractUnreadPrivateMembersCheck.java index e3378a96df..ba13286770 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AbstractUnreadPrivateMembersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AbstractUnreadPrivateMembersCheck.java @@ -38,19 +38,17 @@ public abstract class AbstractUnreadPrivateMembersCheck extends PythonSubscripti @Override public void initialize(Context context) { String memberPrefix = memberPrefix(); - context.registerSyntaxNodeConsumer(CLASSDEF, ctx -> { - Optional.of(ctx.syntaxNode()) - .map(ClassDef.class::cast) - // avoid checking for classes with decorators since it is impossible to analyze its final behavior - .filter(classDef -> classDef.decorators().isEmpty()) - .map(TreeUtils::getClassSymbolFromDef) - .map(ClassSymbol::declaredMembers) - .stream() - .flatMap(Collection::stream) - .filter(s -> s.name().startsWith(memberPrefix) && !s.name().endsWith("__") && equalsToKind(s) && isNeverRead(s)) - .filter(Predicate.not(this::isException)) - .forEach(symbol -> reportIssue(ctx, symbol)); - }); + context.registerSyntaxNodeConsumer(CLASSDEF, ctx -> Optional.of(ctx.syntaxNode()) + .map(ClassDef.class::cast) + // avoid checking for classes with decorators since it is impossible to analyze its final behavior + .filter(classDef -> classDef.decorators().isEmpty()) + .map(TreeUtils::getClassSymbolFromDef) + .map(ClassSymbol::declaredMembers) + .stream() + .flatMap(Collection::stream) + .filter(s -> s.name().startsWith(memberPrefix) && !s.name().endsWith("__") && equalsToKind(s) && isNeverRead(s)) + .filter(Predicate.not(this::isException)) + .forEach(symbol -> reportIssue(ctx, symbol))); } protected boolean isException(Symbol symbol) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java index cd3a12cd33..e18cb137e4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java @@ -290,19 +290,6 @@ public SubscriptionContext ctx() { } } - /** - * In the case of unpacking expression, we cannot generate flows at the moment. - * However, to avoid a wrong interpretation of the unpacked expression in the context of absent arguments, - * an alternative dummy must be returned, which should not lead to false positives. - * The resolving of such expressions can be improved by SONARPY-1164 if necessary. - */ - static class UnresolvedExpressionFlow extends ExpressionFlow { - - private UnresolvedExpressionFlow(SubscriptionContext ctx) { - super(ctx, new LinkedList<>()); - } - } - /** * Dataclass to store a resolved KeyValuePair structure */ diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/BuiltinSymbols.java b/python-frontend/src/main/java/org/sonar/python/semantic/BuiltinSymbols.java index d9dbbda7f9..78fa81ea57 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/BuiltinSymbols.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/BuiltinSymbols.java @@ -30,6 +30,10 @@ private BuiltinSymbols() { // empty constructor } + + public static final String CLASS_METHOD_DECORATOR = "classmethod"; + public static final String STATIC_METHOD_DECORATOR = "staticmethod"; + /** * See https://docs.python.org/3/library/constants.html#built-in-consts */ @@ -70,7 +74,7 @@ private BuiltinSymbols() { "enumerate", "input", "oct", - "staticmethod", + STATIC_METHOD_DECORATOR, "bool", "eval", "int", @@ -101,7 +105,7 @@ private BuiltinSymbols() { "list", "range", "vars", - "classmethod", + CLASS_METHOD_DECORATOR, "getattr", "locals", "repr", @@ -124,7 +128,7 @@ private BuiltinSymbols() { "divmod", "input", "open", - "staticmethod", + STATIC_METHOD_DECORATOR, "all", "enumerate", "int", @@ -165,7 +169,7 @@ private BuiltinSymbols() { "long", "reload", "vars", - "classmethod", + CLASS_METHOD_DECORATOR, "getattr", "map", "repr", @@ -339,8 +343,5 @@ public static Set all() { return all; } - public static final String CLASS_METHOD_DECORATOR = "classmethod"; - public static final String STATIC_METHOD_DECORATOR = "staticmethod"; - public static final Set STATIC_AND_CLASS_METHOD_DECORATORS = Set.of(CLASS_METHOD_DECORATOR, STATIC_METHOD_DECORATOR); }