Skip to content

Commit ccfa4e5

Browse files
andreaguarinoguillaume-dequenne
authored andcommitted
SONARPY-938 Deserialize typeshed imported modules from protobuf
1 parent fffc1d1 commit ccfa4e5

File tree

3 files changed

+14
-7
lines changed

3 files changed

+14
-7
lines changed

python-frontend/src/main/java/org/sonar/python/semantic/SymbolImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ void addOrCreateChildUsage(Name name, Usage.Kind kind) {
137137
((SymbolImpl) symbol).addUsage(name, kind);
138138
}
139139

140-
void addChildSymbol(Symbol symbol) {
140+
public void addChildSymbol(Symbol symbol) {
141141
childrenSymbolByName.put(symbol.name(), symbol);
142142
}
143143

@@ -167,7 +167,7 @@ public void removeUsages() {
167167
childrenSymbolByName.values().forEach(symbol -> ((SymbolImpl) symbol).removeUsages());
168168
}
169169

170-
Map<String, Symbol> getChildrenSymbolByName() {
170+
public Map<String, Symbol> getChildrenSymbolByName() {
171171
return Collections.unmodifiableMap(childrenSymbolByName);
172172
}
173173

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ private static Set<Symbol> commonSymbols(Map<String, Symbol> symbolsPython2, Map
165165
public static Set<Symbol> symbolsForModule(String moduleName) {
166166
if (!TypeShed.typeShedSymbols.containsKey(moduleName)) {
167167
Set<Symbol> symbols = searchTypeShedForModule(moduleName);
168-
Map<String, Symbol> symbolsByFqn = symbols.stream().collect(Collectors.toMap(Symbol::fullyQualifiedName, s -> s));
168+
Map<String, Symbol> symbolsByFqn = symbols.stream().collect(Collectors.toMap(Symbol::fullyQualifiedName, s -> s, (fst, snd) -> fst));
169169
typeShedSymbols.put(moduleName, symbolsByFqn);
170170
return symbols;
171171
}
@@ -470,7 +470,13 @@ public static Set<Symbol> symbolsFromDescriptor(Set<Object> descriptors, boolean
470470
symbols.add(fromOverloadedFunction(((OverloadedFunctionSymbol) descriptor), isInsideClass));
471471
}
472472
if (descriptor instanceof SymbolsProtos.VarSymbol) {
473-
symbols.add(new SymbolImpl((SymbolsProtos.VarSymbol) descriptor));
473+
SymbolsProtos.VarSymbol varSymbol = (SymbolsProtos.VarSymbol) descriptor;
474+
SymbolImpl symbol = new SymbolImpl(varSymbol);
475+
if (varSymbol.getIsImportedModule()) {
476+
Set<Symbol> moduleExportedSymbols = searchTypeShedForModule(varSymbol.getFullyQualifiedName());
477+
moduleExportedSymbols.forEach(symbol::addChildSymbol);
478+
}
479+
symbols.add(symbol);
474480
}
475481
}
476482
return symbols;

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,10 @@ public void package_inner_submodules_symbols() {
193193
@Test
194194
public void package_relative_import() {
195195
Map<String, Symbol> osSymbols = symbolsForModule("os");
196-
// TODO: Add imported symbols SONARPY-938
197-
// Symbol sysSymbol = osSymbols.get("sys");
198-
// assertThat(sysSymbol.kind()).isEqualTo(Kind.AMBIGUOUS);
196+
Symbol sysSymbol = osSymbols.get("sys");
197+
assertThat(sysSymbol.kind()).isEqualTo(Kind.OTHER);
198+
Set<String> sysExportedSymbols = symbolsForModule("sys").keySet();
199+
assertThat(((SymbolImpl) sysSymbol).getChildrenSymbolByName().values()).extracting(Symbol::name).containsAll(sysExportedSymbols);
199200

200201
Symbol timesResult = osSymbols.get("times_result");
201202
assertThat(timesResult.kind()).isEqualTo(Kind.CLASS);

0 commit comments

Comments
 (0)