25
25
import java .util .Map ;
26
26
import java .util .Optional ;
27
27
import java .util .Set ;
28
+ import java .util .function .Function ;
28
29
import java .util .function .Predicate ;
29
30
import java .util .stream .Collectors ;
30
31
import javax .annotation .Nullable ;
31
32
import org .sonar .plugins .python .api .symbols .AmbiguousSymbol ;
32
33
import org .sonar .plugins .python .api .symbols .ClassSymbol ;
33
34
import org .sonar .plugins .python .api .symbols .FunctionSymbol ;
34
35
import org .sonar .plugins .python .api .symbols .Symbol ;
36
+ import org .sonar .python .semantic .ClassSymbolImpl ;
35
37
import org .sonar .python .semantic .ProjectLevelSymbolTable ;
36
- import org .sonar .python .types . TypeShed ;
38
+ import org .sonar .python .semantic . SymbolImpl ;
37
39
import org .sonar .python .types .v2 .ClassType ;
38
40
import org .sonar .python .types .v2 .FunctionType ;
39
41
import org .sonar .python .types .v2 .Member ;
44
46
45
47
public class SymbolsModuleTypeProvider {
46
48
private final ProjectLevelSymbolTable projectLevelSymbolTable ;
49
+ private final TypeShed typeShed ;
47
50
48
51
public SymbolsModuleTypeProvider (ProjectLevelSymbolTable projectLevelSymbolTable ) {
49
52
this .projectLevelSymbolTable = projectLevelSymbolTable ;
53
+ typeShed = new TypeShed ();
50
54
}
51
55
52
56
public ModuleType createBuiltinModule () {
53
- return createModuleFromSymbols (null , null , TypeShed .builtinSymbols ().values ());
57
+ return createModuleFromSymbols (null , null , typeShed .builtinSymbols ().values ());
54
58
}
55
59
56
60
public ModuleType createModuleType (List <String > moduleFqn , ModuleType parent ) {
@@ -71,7 +75,7 @@ private Optional<ModuleType> createModuleTypeFromProjectLevelSymbolTable(String
71
75
}
72
76
73
77
private Optional <ModuleType > createModuleTypeFromTypeShed (String moduleName , String moduleFqn , ModuleType parent ) {
74
- return Optional .ofNullable (TypeShed . symbolsForModuleWithoutStoreInCache (moduleFqn ))
78
+ return Optional .ofNullable (typeShed . symbolsForModule (moduleFqn ))
75
79
.filter (Predicate .not (Map ::isEmpty ))
76
80
.map (typeShedModuleSymbols -> createModuleFromSymbols (moduleName , parent , typeShedModuleSymbols .values ()));
77
81
}
@@ -143,11 +147,32 @@ private PythonType convertToClassType(ClassSymbol symbol, Map<Symbol, PythonType
143
147
Set <Member > members =
144
148
symbol .declaredMembers ().stream ().map (m -> new Member (m .name (), convertToType (m , createdTypesBySymbol ))).collect (Collectors .toSet ());
145
149
classType .members ().addAll (members );
146
- List <PythonType > superClasses = symbol .superClasses ().stream ().map (s -> convertToType (s , createdTypesBySymbol )).toList ();
147
- classType .superClasses ().addAll (superClasses );
150
+
151
+
152
+ Optional .of (symbol )
153
+ .filter (ClassSymbolImpl .class ::isInstance )
154
+ .map (ClassSymbolImpl .class ::cast )
155
+ .filter (ClassSymbolImpl ::shouldSearchHierarchyInTypeshed )
156
+ .map (ClassSymbol ::superClassesFqn )
157
+ .map (fqns -> fqns .stream ().map (this ::typeshedSymbolWithFQN ))
158
+ .or (() -> Optional .of (symbol )
159
+ .map (ClassSymbol ::superClasses )
160
+ .map (Collection ::stream ))
161
+ .stream ()
162
+ .flatMap (Function .identity ())
163
+ .map (s -> convertToType (s , createdTypesBySymbol ))
164
+ .forEach (classType .superClasses ()::add );
165
+
148
166
return classType ;
149
167
}
150
168
169
+ private Symbol typeshedSymbolWithFQN (String fullyQualifiedName ) {
170
+ String [] fqnSplitByDot = fullyQualifiedName .split ("\\ ." );
171
+ String localName = fqnSplitByDot [fqnSplitByDot .length - 1 ];
172
+ Symbol symbol = typeShed .symbolWithFQN (fullyQualifiedName );
173
+ return symbol == null ? new SymbolImpl (localName , fullyQualifiedName ) : ((SymbolImpl ) symbol ).copyWithoutUsages ();
174
+ }
175
+
151
176
private PythonType convertToUnionType (AmbiguousSymbol ambiguousSymbol , Map <Symbol , PythonType > createdTypesBySymbol ) {
152
177
Set <PythonType > pythonTypes = ambiguousSymbol .alternatives ().stream ().map (a -> convertToType (a , createdTypesBySymbol )).collect (Collectors .toSet ());
153
178
return new UnionType (pythonTypes );
0 commit comments