QualifiedName (@NotNull VirtualFile root, @NotNull VirtualFile file) { String relativePath = VfsUtilCore.getRelativePath(file, root, VfsUtilCore.VFS_SEPARATOR_CHAR); if (StringUtil.isEmpty(relativePath)) { return null; } List<String> components = new ArrayList<>(StringUtil.split(relativePath, VfsUtilCore.VFS_SEPARATOR)); if (components.isEmpty()) { return null; } int lastIndex = components.size() - 1; String nameWithoutExtension = FileUtilRt.getNameWithoutExtension(components.get(lastIndex)); if (!file.isDirectory() && nameWithoutExtension.equals(PyNames.INIT)) { components.remove(lastIndex); } else { components.set(lastIndex, nameWithoutExtension); } if (components.isEmpty() || ContainerUtil.exists(components, part -> part.contains("."))) { return null; } // A qualified name might still contain "-stubs" non-identifier part as its first component. return PyStubPackages.convertStubToRuntimePackageName(QualifiedName.fromComponents(components)); }