Skip to content

Commit

Permalink
fix: python names with dot should be processed correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
gangz committed Nov 3, 2022
1 parent 66db5d5 commit 6bd17bb
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 8 deletions.
21 changes: 15 additions & 6 deletions src/main/java/depends/extractor/python/union/ExpressionUsage.java
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,9 @@ private boolean isAlias(Expr_stmtContext exprAssign) {
return false;
}
String theName = exprAssign.testlist_star_expr().getText();

List<String> assignNames = this.getName(exprAssign.assign_part().testlist_star_expr());
if (assignNames.size()==0) return false;
String assignName = assignNames.get(0);
String assignName = namesToDot(assignNames);
Entity type = bindingResolver.resolveName(context.lastContainer(), GenericName.build(assignName),true);
if (type==null)
return false;
Expand All @@ -128,6 +127,17 @@ private boolean isAlias(Expr_stmtContext exprAssign) {
return true;
}

private String namesToDot(List<String> assignNames) {
StringBuilder sb = new StringBuilder();
for (String s:assignNames){
if (sb.length()>0){
sb.append(".");
}
sb.append(s);
}
return sb.toString();
}

private boolean containArguments(Expr_stmtContext expr) {
final boolean[] containsArgument = {false};
PythonParserBaseListener visitor = new PythonParserBaseListener() {
Expand Down Expand Up @@ -335,9 +345,8 @@ class NameCollector extends PythonParserBaseVisitor<Void>{
this.names = names;
}
@Override
public Void visitAtom(AtomContext ctx) {
if (ctx.name()!=null)
names.add(ctx.name().getText());
return super.visitAtom(ctx);
public Void visitName(NameContext ctx) {
names.add(ctx.getText());
return super.visitName(ctx);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package depends.extractor.python;

import depends.entity.AliasEntity;
import depends.entity.Entity;
import depends.extractor.python.union.PythonFileParser;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

public class PythonClassAssignmentTest extends PythonParserTest {
@Before
Expand All @@ -27,6 +28,6 @@ public void class_assignment_should_be_treat_as_alias() throws IOException {
}
resolveAllBindings();
Entity classB = entityRepo.getEntity(withPackageName(srcs[0],"class_assignment","ClassB"));
assertNotNull(classB);
assertTrue(classB instanceof AliasEntity);
}
}
8 changes: 8 additions & 0 deletions src/test/resources/python-code-examples/class_assignment.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
from relations_of_same_package import class_assignment_base as base_def

class ClassA(object):
pass

ClassB = ClassA



M = base_def.BaseHyperParams

class Foo(M):
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class BaseHyperParams:
pass

0 comments on commit 6bd17bb

Please sign in to comment.