Skip to content

Commit d1cc4bd

Browse files
SONARPY-1889 share v2 TypeChed between PythonVisitorContext instances
1 parent 994aa2c commit d1cc4bd

File tree

7 files changed

+35
-12
lines changed

7 files changed

+35
-12
lines changed

python-checks/src/test/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.sonar.python.caching.CacheContextImpl;
4141
import org.sonar.python.parser.PythonParser;
4242
import org.sonar.python.semantic.ProjectLevelSymbolTable;
43+
import org.sonar.python.semantic.v2.TypeShed;
4344
import org.sonar.python.tree.IPythonTreeMaker;
4445
import org.sonar.python.tree.PythonTreeMaker;
4546

@@ -161,7 +162,7 @@ private static PythonVisitorContext createVisitorContext(PythonParser parser, Py
161162

162163
return new PythonVisitorContext(fileInput,
163164
pythonFile, null, "",
164-
ProjectLevelSymbolTable.empty(), CacheContextImpl.dummyCache(), SonarProduct.SONARLINT);
165+
ProjectLevelSymbolTable.empty(), new TypeShed(), CacheContextImpl.dummyCache(), SonarProduct.SONARLINT);
165166
}
166167

167168
private static String applyQuickFix(String codeWithIssue, PythonQuickFix quickFix) {

python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.sonar.python.semantic.v2.ProjectLevelTypeTable;
3535
import org.sonar.python.semantic.v2.SymbolTableBuilderV2;
3636
import org.sonar.python.semantic.v2.TypeInferenceV2;
37+
import org.sonar.python.semantic.v2.TypeShed;
3738

3839
public class PythonVisitorContext extends PythonInputFileContext {
3940

@@ -48,7 +49,8 @@ public PythonVisitorContext(FileInput rootTree, PythonFile pythonFile, @Nullable
4849
SymbolTableBuilder symbolTableBuilder = packageName != null ? new SymbolTableBuilder(packageName, pythonFile) : new SymbolTableBuilder(pythonFile);
4950
symbolTableBuilder.visitFileInput(rootTree);
5051
var symbolTable = new SymbolTableBuilderV2(rootTree).build();
51-
new TypeInferenceV2(new ProjectLevelTypeTable(ProjectLevelSymbolTable.empty()), pythonFile, symbolTable).inferTypes(rootTree);
52+
var projectLevelTypeTable = new ProjectLevelTypeTable(ProjectLevelSymbolTable.empty(), new TypeShed());
53+
new TypeInferenceV2(projectLevelTypeTable, pythonFile, symbolTable).inferTypes(rootTree);
5254
}
5355

5456
public PythonVisitorContext(FileInput rootTree, PythonFile pythonFile, @Nullable File workingDirectory, String packageName,
@@ -60,18 +62,20 @@ public PythonVisitorContext(FileInput rootTree, PythonFile pythonFile, @Nullable
6062

6163
var symbolTable = new SymbolTableBuilderV2(rootTree)
6264
.build();
63-
new TypeInferenceV2(new ProjectLevelTypeTable(ProjectLevelSymbolTable.from(projectLevelSymbolTable)), pythonFile, symbolTable).inferTypes(rootTree);
65+
var projectLevelTypeTable = new ProjectLevelTypeTable(ProjectLevelSymbolTable.from(projectLevelSymbolTable), new TypeShed());
66+
new TypeInferenceV2(projectLevelTypeTable, pythonFile, symbolTable).inferTypes(rootTree);
6467
}
6568

6669
public PythonVisitorContext(FileInput rootTree, PythonFile pythonFile, @Nullable File workingDirectory, String packageName,
67-
ProjectLevelSymbolTable projectLevelSymbolTable, CacheContext cacheContext, SonarProduct sonarProduct) {
70+
ProjectLevelSymbolTable projectLevelSymbolTable, TypeShed typeShed, CacheContext cacheContext, SonarProduct sonarProduct) {
6871
super(pythonFile, workingDirectory, cacheContext, sonarProduct);
6972
this.rootTree = rootTree;
7073
this.parsingException = null;
7174
new SymbolTableBuilder(packageName, pythonFile, projectLevelSymbolTable).visitFileInput(rootTree);
7275
var symbolTable = new SymbolTableBuilderV2(rootTree)
7376
.build();
74-
new TypeInferenceV2(new ProjectLevelTypeTable(ProjectLevelSymbolTable.from(projectLevelSymbolTable)), pythonFile, symbolTable).inferTypes(rootTree);
77+
var projectLevelTypeTable = new ProjectLevelTypeTable(ProjectLevelSymbolTable.from(projectLevelSymbolTable), typeShed);
78+
new TypeInferenceV2(projectLevelTypeTable, pythonFile, symbolTable).inferTypes(rootTree);
7579
}
7680

7781
public PythonVisitorContext(PythonFile pythonFile, RecognitionException parsingException) {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ public class ProjectLevelTypeTable {
3131
private final ModuleType rootModule;
3232

3333
public ProjectLevelTypeTable(ProjectLevelSymbolTable projectLevelSymbolTable) {
34-
this.symbolsModuleTypeProvider = new SymbolsModuleTypeProvider(projectLevelSymbolTable);
34+
this(projectLevelSymbolTable, new TypeShed());
35+
}
36+
37+
public ProjectLevelTypeTable(ProjectLevelSymbolTable projectLevelSymbolTable, TypeShed typeShed) {
38+
this.symbolsModuleTypeProvider = new SymbolsModuleTypeProvider(projectLevelSymbolTable, typeShed);
3539
this.rootModule = this.symbolsModuleTypeProvider.createBuiltinModule();
3640
}
3741

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ public class SymbolsModuleTypeProvider {
4848
private final ProjectLevelSymbolTable projectLevelSymbolTable;
4949
private final TypeShed typeShed;
5050

51-
public SymbolsModuleTypeProvider(ProjectLevelSymbolTable projectLevelSymbolTable) {
51+
public SymbolsModuleTypeProvider(ProjectLevelSymbolTable projectLevelSymbolTable, TypeShed typeShed) {
5252
this.projectLevelSymbolTable = projectLevelSymbolTable;
53-
typeShed = new TypeShed();
53+
this.typeShed = typeShed;
5454
}
5555

5656
public ModuleType createBuiltinModule() {

python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.sonar.python.parser.PythonParser;
4040
import org.sonar.python.semantic.ProjectLevelSymbolTable;
4141
import org.sonar.python.semantic.SymbolImpl;
42+
import org.sonar.python.semantic.v2.TypeShed;
4243
import org.sonar.python.tree.FileInputImpl;
4344
import org.sonar.python.tree.PythonTreeMaker;
4445

@@ -95,15 +96,16 @@ void globalSymbols() {
9596
void sonar_product() {
9697
CacheContextImpl cacheContext = CacheContextImpl.dummyCache();
9798
ProjectLevelSymbolTable projectLevelSymbolTable = ProjectLevelSymbolTable.empty();
99+
var typeShed = new TypeShed();
98100
String myPackage = "my_package";
99101
File workingDirectory = null;
100102
PythonFile pythonFile = pythonFile("my_module.py");
101103
FileInput fileInput = mock(FileInputImpl.class);
102104

103-
PythonVisitorContext pythonVisitorContext = new PythonVisitorContext(fileInput, pythonFile, workingDirectory, myPackage, projectLevelSymbolTable, cacheContext, SonarProduct.SONARLINT);
105+
PythonVisitorContext pythonVisitorContext = new PythonVisitorContext(fileInput, pythonFile, workingDirectory, myPackage, projectLevelSymbolTable, typeShed, cacheContext, SonarProduct.SONARLINT);
104106
assertThat(pythonVisitorContext.sonarProduct()).isEqualTo(SonarProduct.SONARLINT);
105107

106-
pythonVisitorContext = new PythonVisitorContext(fileInput, pythonFile, workingDirectory, myPackage, projectLevelSymbolTable, cacheContext, SonarProduct.SONARQUBE);
108+
pythonVisitorContext = new PythonVisitorContext(fileInput, pythonFile, workingDirectory, myPackage, projectLevelSymbolTable, typeShed, cacheContext, SonarProduct.SONARQUBE);
107109
assertThat(pythonVisitorContext.sonarProduct()).isEqualTo(SonarProduct.SONARQUBE);
108110

109111
pythonVisitorContext = new PythonVisitorContext(fileInput, pythonFile, workingDirectory, myPackage, projectLevelSymbolTable, cacheContext);

sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonScanner.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,14 @@ protected void scanFile(InputFile inputFile) {
106106
AstNode astNode = parser.parse(pythonFile.content());
107107
PythonTreeMaker treeMaker = getTreeMaker(inputFile);
108108
FileInput parse = treeMaker.fileInput(astNode);
109-
visitorContext = new PythonVisitorContext(
110-
parse, pythonFile, getWorkingDirectory(context), indexer.packageName(inputFile), indexer.projectLevelSymbolTable(), indexer.cacheContext(), context.runtime().getProduct());
109+
visitorContext = new PythonVisitorContext(parse,
110+
pythonFile,
111+
getWorkingDirectory(context),
112+
indexer.packageName(inputFile),
113+
indexer.projectLevelSymbolTable(),
114+
indexer.typeShed(),
115+
indexer.cacheContext(),
116+
context.runtime().getProduct());
111117
if (fileType == InputFile.Type.MAIN) {
112118
saveMeasures(inputFile, visitorContext);
113119
}

sonar-python-plugin/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.sonar.plugins.python.api.tree.FileInput;
3939
import org.sonar.python.parser.PythonParser;
4040
import org.sonar.python.semantic.ProjectLevelSymbolTable;
41+
import org.sonar.python.semantic.v2.TypeShed;
4142
import org.sonar.python.tree.PythonTreeMaker;
4243

4344
import static org.sonar.python.semantic.SymbolUtils.pythonPackageName;
@@ -51,11 +52,16 @@ public abstract class PythonIndexer {
5152
private final Map<URI, String> packageNames = new HashMap<>();
5253
private final PythonParser parser = PythonParser.create();
5354
private final ProjectLevelSymbolTable projectLevelSymbolTable = new ProjectLevelSymbolTable();
55+
private final TypeShed typeShed = new TypeShed();
5456

5557
public ProjectLevelSymbolTable projectLevelSymbolTable() {
5658
return projectLevelSymbolTable;
5759
}
5860

61+
public TypeShed typeShed() {
62+
return typeShed;
63+
}
64+
5965
public String packageName(InputFile inputFile) {
6066
return packageNames.computeIfAbsent(inputFile.uri(), k -> pythonPackageName(inputFile.file(), projectBaseDirAbsolutePath));
6167
}

0 commit comments

Comments
 (0)