Skip to content

Commit be9649f

Browse files
SONARPY-967 Handle Typeshed Python2 modules whose name differ from th… (#1068)
1 parent 3ad66bc commit be9649f

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

python-frontend/src/main/java/org/sonar/python/types/TypeShed.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,14 @@ public class TypeShed {
7575
private static final Set<String> BUILTINS_TO_DISAMBIGUATE = new HashSet<>(
7676
Arrays.asList(INT, FLOAT, COMPLEX, STR, BuiltinTypes.SET, DICT, LIST, TUPLE, NONE_TYPE, BOOL, "type", "super", "frozenset", "memoryview"));
7777

78+
// This is needed for some Python 2 modules whose name differ from their Python 3 counterpart by capitalization only.
79+
private static final Map<String, String> MODULES_TO_DISAMBIGUATE = new HashMap<>();
80+
static {
81+
MODULES_TO_DISAMBIGUATE.put("ConfigParser", "2@ConfigParser");
82+
MODULES_TO_DISAMBIGUATE.put("Queue", "2@Queue");
83+
MODULES_TO_DISAMBIGUATE.put("SocketServer", "2@SocketServer");
84+
}
85+
7886
static {
7987
BUILTINS_TO_DISAMBIGUATE.addAll(BuiltinSymbols.EXCEPTIONS);
8088
}
@@ -305,7 +313,8 @@ private static boolean isAmbiguousSymbolOfClasses(Symbol symbol) {
305313
}
306314

307315
private static Map<String, Symbol> getSymbolsFromProtobufModule(String moduleName, String dirName) {
308-
InputStream resource = TypeShed.class.getResourceAsStream(dirName + moduleName + ".protobuf");
316+
String fileName = MODULES_TO_DISAMBIGUATE.getOrDefault(moduleName, moduleName);
317+
InputStream resource = TypeShed.class.getResourceAsStream(dirName + fileName + ".protobuf");
309318
if (resource == null) {
310319
return Collections.emptyMap();
311320
}

python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,4 +534,44 @@ public void stubFilesSymbols_third_party_symbols_should_not_be_null() {
534534
symbolsForModule("six");
535535
assertThat(TypeShed.stubFilesSymbols()).doesNotContainNull();
536536
}
537+
538+
@Test
539+
public void modules_whose_name_differ_by_capitalization_only() {
540+
// Python 2, import SocketServer
541+
setPythonVersions(PythonVersionUtils.fromString("2.7"));
542+
Map<String, Symbol> socketServer = symbolsForModule("SocketServer");
543+
assertThat(socketServer).isNotEmpty();
544+
SymbolImpl baseServer = (SymbolImpl) socketServer.get("BaseServer");
545+
assertThat(baseServer.validForPythonVersions()).containsExactlyInAnyOrder("27");
546+
547+
// Python 2, import socketserver
548+
socketServer = symbolsForModule("socketserver");
549+
assertThat(socketServer).isEmpty();
550+
551+
// Python 3, import SocketServer
552+
setPythonVersions(PythonVersionUtils.fromString("3.10"));
553+
socketServer = symbolsForModule("SocketServer");
554+
assertThat(socketServer).isEmpty();
555+
556+
// Python 3, import socketserver
557+
socketServer = symbolsForModule("socketserver");
558+
assertThat(socketServer).isNotEmpty();
559+
baseServer = (SymbolImpl) socketServer.get("BaseServer");
560+
assertThat(baseServer.validForPythonVersions()).containsExactlyInAnyOrder("35", "36", "37", "38", "39", "310");
561+
562+
// Unknown Python version, import SocketServer
563+
// in this case we assume Python2 module is imported
564+
setPythonVersions();
565+
socketServer = symbolsForModule("SocketServer");
566+
assertThat(socketServer).isNotEmpty();
567+
baseServer = (SymbolImpl) socketServer.get("BaseServer");
568+
assertThat(baseServer.validForPythonVersions()).containsExactlyInAnyOrder("27");
569+
570+
// Unknown Python version, import socketserver
571+
// in this case we assume Python3 module is imported
572+
socketServer = symbolsForModule("socketserver");
573+
assertThat(socketServer).isNotEmpty();
574+
baseServer = (SymbolImpl) socketServer.get("BaseServer");
575+
assertThat(baseServer.validForPythonVersions()).containsExactlyInAnyOrder("35", "36", "37", "38", "39", "310");
576+
}
537577
}

0 commit comments

Comments
 (0)