Skip to content

Commit f820a1d

Browse files
Fixed FQN bug with aliasing
1 parent b4fe25e commit f820a1d

2 files changed

Lines changed: 23 additions & 1 deletion

File tree

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,12 @@ private void createImportedNames(List<AliasedName> importedNames, @Nullable Stri
320320
Name alias = module.alias();
321321
if (fromModuleName != null) {
322322
currentScope().addImportedSymbol(alias == null ? nameTree : alias, fullyQualifiedName, globalSymbolsByFQN);
323+
} else if (alias != null) {
324+
String fullName = module.dottedName().names().stream().map(Name::name).collect(Collectors.joining("."));
325+
currentScope().addModuleSymbol(alias, fullName, globalSymbolsByModuleName, globalSymbolsByFQN);
323326
} else {
324-
currentScope().addModuleSymbol(alias == null ? nameTree : alias, fullyQualifiedName, globalSymbolsByModuleName, globalSymbolsByFQN);
327+
// It's a simple case - no "from" imports or aliasing
328+
currentScope().addModuleSymbol(nameTree, fullyQualifiedName, globalSymbolsByModuleName, globalSymbolsByFQN);
325329
}
326330
});
327331
}

python-frontend/src/test/java/org/sonar/python/semantic/FullyQualifiedNameTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ public void callee_qualified_expression_alias() {
6464
assertNameAndQualifiedName(tree, "fn", "mod.fn");
6565
}
6666

67+
@Test
68+
public void submodule_alias() {
69+
FileInput tree = parse(
70+
"import mod.submod as alias",
71+
"alias.fn()"
72+
);
73+
assertNameAndQualifiedName(tree, "fn", "mod.submod.fn");
74+
}
75+
6776
@Test
6877
public void import_alias_reassigned() {
6978
FileInput tree = parse(
@@ -375,6 +384,15 @@ public void from_import_alias() {
375384
assertNameAndQualifiedName(tree, "g", "mod.fn");
376385
}
377386

387+
@Test
388+
public void from_import_submodule_alias() {
389+
FileInput tree = parse(
390+
"from mod.submod import fn as g",
391+
"g('foo')"
392+
);
393+
assertNameAndQualifiedName(tree, "g", "mod.submod.fn");
394+
}
395+
378396
@Test
379397
public void from_import_relative() {
380398
FileInput tree = parse(

0 commit comments

Comments
 (0)