Skip to content

Commit 514ded9

Browse files
SONARPY-2424 Document limitation on AliasDescriptor to PythonType conversion (#2226)
1 parent bf7232a commit 514ded9

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AliasDescriptorToPythonTypeConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
public class AliasDescriptorToPythonTypeConverter implements DescriptorToPythonTypeConverter {
2424
@Override
2525
public PythonType convert(ConversionContext ctx, Descriptor from) {
26-
// We should try to retrieve the original type if possible, instead of recreating it
26+
// SONARPY-2423: We should try to retrieve the original type if possible, instead of recreating it
2727
return ctx.convert(((AliasDescriptor) from).originalDescriptor());
2828
}
2929
}

python-frontend/src/test/java/org/sonar/python/types/v2/TypeCheckerTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,33 @@ class B: pass
300300
assertThat(localTypeChecker.typeCheckBuilder().isTypeOrInstanceWithName("my_package.unknown.A").check(aType)).isEqualTo(TriBool.UNKNOWN);
301301
}
302302

303+
@Test
304+
void typesFromAliasDescriptor() {
305+
ProjectLevelSymbolTable projectLevelSymbolTable = ProjectLevelSymbolTable.empty();
306+
ProjectLevelTypeTable projectLevelTypeTable = new ProjectLevelTypeTable(projectLevelSymbolTable);
307+
PythonFile pythonFile = PythonTestUtils.pythonFile("mod.py");
308+
TypeChecker localTypeChecker = new TypeChecker(projectLevelTypeTable);
309+
var fileInput = parseAndInferTypes(projectLevelTypeTable, pythonFile, """
310+
from fastapi.responses import Response as A
311+
from starlette.responses import Response as B
312+
A
313+
B
314+
"""
315+
);
316+
var aType = ((ExpressionStatement) fileInput.statements().statements().get(2)).expressions().get(0).typeV2();
317+
var bType = ((ExpressionStatement) fileInput.statements().statements().get(3)).expressions().get(0).typeV2();
318+
319+
// SONARPY-2423, the types for A and B should be identical, since fastapi.responses.Response is an alias to starlette.responses.Response
320+
assertThat(localTypeChecker.typeCheckBuilder().isTypeOrInstanceWithName("fastapi.responses.Response").check(aType)).isEqualTo(TriBool.TRUE);
321+
assertThat(localTypeChecker.typeCheckBuilder().isTypeOrInstanceWithName("fastapi.responses.Response").check(bType)).isEqualTo(TriBool.FALSE);
322+
323+
assertThat(localTypeChecker.typeCheckBuilder().isTypeOrInstanceWithName("starlette.responses.Response").check(aType)).isEqualTo(TriBool.FALSE);
324+
assertThat(localTypeChecker.typeCheckBuilder().isTypeOrInstanceWithName("starlette.responses.Response").check(bType)).isEqualTo(TriBool.TRUE);
325+
326+
assertThat(aType).isNotEqualTo(bType);
327+
}
328+
329+
303330

304331
@Test
305332
void testIsInstance() {

0 commit comments

Comments
 (0)