Skip to content

Commit b97c921

Browse files
SONARPY-1007 S5644 (ItemOperationsTypeCheck) should not raise when accessing type with generics (#1120)
1 parent bdacac1 commit b97c921

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.sonar.plugins.python.api.tree.Tree;
3434
import org.sonar.python.tree.TreeUtils;
3535

36+
import static org.sonar.python.tree.TreeUtils.getSymbolFromTree;
3637
import static org.sonar.python.tree.TreeUtils.nameFromExpression;
3738

3839
public abstract class ItemOperationsType extends PythonSubscriptionCheck {
@@ -47,7 +48,7 @@ public void initialize(Context context) {
4748

4849
private void checkSubscription(SubscriptionContext ctx) {
4950
SubscriptionExpression subscriptionExpression = (SubscriptionExpression) ctx.syntaxNode();
50-
if (isWithinTypeAnnotation(subscriptionExpression)) {
51+
if (isWithinTypeAnnotation(subscriptionExpression) || isTypeSubscription(subscriptionExpression.object())) {
5152
return;
5253
}
5354
Map<LocationInFile, String> secondaries = new HashMap<>();
@@ -69,6 +70,11 @@ private void checkSubscription(SubscriptionContext ctx) {
6970
}
7071
}
7172

73+
// Avoid FPs on alias with type generics like `alias = type[Foo]`
74+
private static boolean isTypeSubscription(Expression subscriptionObject) {
75+
return getSymbolFromTree(subscriptionObject).filter(symbol -> "type".equals(symbol.fullyQualifiedName())).isPresent();
76+
}
77+
7278
private static boolean isWithinTypeAnnotation(SubscriptionExpression subscriptionExpression) {
7379
return TreeUtils.firstAncestor(subscriptionExpression,
7480
t -> t.is(Tree.Kind.PARAMETER_TYPE_ANNOTATION, Tree.Kind.RETURN_TYPE_ANNOTATION, Tree.Kind.VARIABLE_TYPE_ANNOTATION)) != null;

python-checks/src/test/resources/checks/itemOperationsTypeCheck/itemOperations_getitem.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,6 @@ def python3_9():
189189
from asyncio import Future
190190
class A(Future[TSource]): ...
191191

192+
193+
def python3_10():
194+
type_alias = type[Exception]

0 commit comments

Comments
 (0)