Skip to content

Commit 9229a56

Browse files
authored
Fix python sys.path collecting algorithm (#1890)
1 parent 9d358d7 commit 9229a56

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

utbot-intellij-python/src/main/kotlin/org/utbot/intellij/plugin/language/python/PythonDialogProcessor.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,11 @@ fun getDirectoriesForSysPath(
318318
if (element != null) {
319319
val directory = element.parent
320320
if (directory is PsiDirectory) {
321-
importedPaths.add(directory.virtualFile)
321+
// If we have `import a.b.c` we need to add syspath to module `a` only
322+
val additionalLevel = importTarget.importedQName?.componentCount?.dec() ?: 0
323+
directory.topParent(additionalLevel)?.let { dir ->
324+
importedPaths.add(dir.virtualFile)
325+
}
322326
}
323327
}
324328
}
@@ -329,7 +333,11 @@ fun getDirectoriesForSysPath(
329333
importTarget.resolveImportSourceCandidates().forEach {
330334
val directory = it.parent
331335
if (directory is PsiDirectory ) {
332-
importedPaths.add(directory.virtualFile)
336+
// If we have `from a.b.c import d` we need to add syspath to module `a` only
337+
val additionalLevel = importTarget.importSourceQName?.componentCount?.dec() ?: 0
338+
directory.topParent(additionalLevel)?.let { dir ->
339+
importedPaths.add(dir.virtualFile)
340+
}
333341
}
334342
}
335343
}

utbot-intellij-python/src/main/kotlin/org/utbot/intellij/plugin/language/python/Utils.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.intellij.openapi.project.Project
44
import com.intellij.openapi.roots.ProjectFileIndex
55
import com.intellij.openapi.vfs.VfsUtil
66
import com.intellij.openapi.vfs.VirtualFile
7+
import com.intellij.psi.PsiDirectory
78
import com.intellij.psi.PsiElement
89
import com.jetbrains.python.psi.PyClass
910
import com.jetbrains.python.psi.PyDecorator
@@ -55,4 +56,12 @@ fun fineFunction(function: PyFunction): Boolean =
5556

5657
fun fineClass(pyClass: PyClass): Boolean =
5758
getAncestors(pyClass).dropLast(1).all { it !is PyClass && it !is PyFunction } &&
58-
pyClass.methods.any { fineFunction(it) }
59+
pyClass.methods.any { fineFunction(it) }
60+
61+
fun PsiDirectory.topParent(level: Int): PsiDirectory? {
62+
var directory: PsiDirectory? = this
63+
repeat(level) {
64+
directory = directory?.parent
65+
}
66+
return directory
67+
}

0 commit comments

Comments
 (0)