From a8c215a217a0aad3aad4d1d2c55c1927a0e260e3 Mon Sep 17 00:00:00 2001 From: Andrea Guarino Date: Fri, 7 Aug 2020 15:31:12 +0200 Subject: [PATCH] Remove incorrect harcoded mapping for 'typing.DefaultDict' and 'typing.Deque' --- .../org/sonar/python/types/InferredTypes.java | 2 - .../sonar/python/types/InferredTypesTest.java | 53 ++++++++++++++++--- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/python-frontend/src/main/java/org/sonar/python/types/InferredTypes.java b/python-frontend/src/main/java/org/sonar/python/types/InferredTypes.java index ef6b108d11..1332b1304d 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/InferredTypes.java +++ b/python-frontend/src/main/java/org/sonar/python/types/InferredTypes.java @@ -55,8 +55,6 @@ public class InferredTypes { ALIASED_ANNOTATIONS.put("typing.Dict", BuiltinTypes.DICT); ALIASED_ANNOTATIONS.put("typing.Set", BuiltinTypes.SET); ALIASED_ANNOTATIONS.put("typing.FrozenSet", "frozenset"); - ALIASED_ANNOTATIONS.put("typing.Deque", "deque"); - ALIASED_ANNOTATIONS.put("typing.DefaultDict", "defaultdict"); ALIASED_ANNOTATIONS.put("typing.Type", "type"); } diff --git a/python-frontend/src/test/java/org/sonar/python/types/InferredTypesTest.java b/python-frontend/src/test/java/org/sonar/python/types/InferredTypesTest.java index 60d5310680..f584ababa7 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/InferredTypesTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/InferredTypesTest.java @@ -27,6 +27,7 @@ import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.TypeAnnotation; +import org.sonar.plugins.python.api.types.BuiltinTypes; import org.sonar.plugins.python.api.types.InferredType; import org.sonar.python.PythonTestUtils; import org.sonar.python.semantic.AmbiguousSymbolImpl; @@ -41,6 +42,8 @@ import static org.sonar.python.types.InferredTypes.fromTypeshedTypeAnnotation; import static org.sonar.python.types.InferredTypes.or; import static org.sonar.python.types.InferredTypes.runtimeType; +import static org.sonar.python.types.InferredTypes.typeName; +import static org.sonar.python.types.InferredTypes.typeSymbols; import static org.sonar.python.types.TypeShed.typeShedClass; public class InferredTypesTest { @@ -92,17 +95,55 @@ public void ambiguous_class_symbol() { @Test public void test_aliased_type_annotations() { - TypeAnnotation typeAnnotation = typeAnnotation( + assertAliasedTypeAnnotation(BuiltinTypes.LIST, "from typing import List", - "l : List[int]" + "l : List[int]"); + + assertAliasedTypeAnnotation(BuiltinTypes.TUPLE, + "from typing import Tuple", + "l : Tuple[int]" ); - assertThat(fromTypeshedTypeAnnotation(typeAnnotation)).isEqualTo(InferredTypes.LIST); - typeAnnotation = typeAnnotation( + assertAliasedTypeAnnotation(BuiltinTypes.DICT, "from typing import Dict", - "l : Dict[int, string]" + "l : Dict[int, str]" + ); + + assertAliasedTypeAnnotation(BuiltinTypes.SET, + "from typing import Set", + "l : Set[int]" + ); + + assertAliasedTypeAnnotation("frozenset", + "from typing import FrozenSet", + "l : FrozenSet[int]" + ); + + assertAliasedTypeAnnotation("type", + "from typing import Type", + "l : Type[int]" ); - assertThat(fromTypeshedTypeAnnotation(typeAnnotation)).isEqualTo(InferredTypes.DICT); + + TypeAnnotation typeAnnotation = typeAnnotation( + "from typing import DefaultDict", + "l : DefaultDict[int, str]" + ); + InferredType type = fromTypeAnnotation(typeAnnotation); + assertThat(typeName(type)).isEqualTo("DefaultDict[int, str]"); + + typeAnnotation = typeAnnotation( + "from typing import Deque", + "l : Deque[int]" + ); + type = fromTypeAnnotation(typeAnnotation); + assertThat(typeName(type)).isEqualTo("Deque[int]"); + } + + private void assertAliasedTypeAnnotation(String type, String... code) { + TypeAnnotation typeAnnotation = typeAnnotation(code); + ClassSymbol typeClass = typeShedClass(type); + assertThat(fromTypeshedTypeAnnotation(typeAnnotation)).isEqualTo(runtimeType(typeClass)); + assertThat(typeSymbols(fromTypeAnnotation(typeAnnotation))).containsExactly(typeClass); } @Test