mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Changed the visual representation of PyFileImpl to be more Python module-like (PY-6923)
For modules only names are shown (no extensions). For '__init__.py' files representing packages only package names are shown (its parent directories).
This commit is contained in:
@@ -16,15 +16,19 @@
|
||||
package com.jetbrains.python.psi.impl;
|
||||
|
||||
import com.intellij.extapi.psi.PsiFileBase;
|
||||
import com.intellij.icons.AllIcons;
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.lang.Language;
|
||||
import com.intellij.navigation.ItemPresentation;
|
||||
import com.intellij.openapi.fileTypes.FileType;
|
||||
import com.intellij.openapi.roots.ProjectFileIndex;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.VfsUtilCore;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.scope.PsiScopeProcessor;
|
||||
import com.intellij.psi.stubs.StubElement;
|
||||
import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.util.PsiModificationTracker;
|
||||
import com.intellij.psi.util.QualifiedName;
|
||||
@@ -33,11 +37,15 @@ import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.MultiMap;
|
||||
import com.intellij.util.indexing.IndexingDataKeys;
|
||||
import com.jetbrains.python.*;
|
||||
import com.jetbrains.python.PyElementTypes;
|
||||
import com.jetbrains.python.PyNames;
|
||||
import com.jetbrains.python.PythonFileType;
|
||||
import com.jetbrains.python.PythonLanguage;
|
||||
import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache;
|
||||
import com.jetbrains.python.documentation.DocStringUtil;
|
||||
import com.jetbrains.python.inspections.PythonVisitorFilter;
|
||||
import com.jetbrains.python.psi.*;
|
||||
import com.jetbrains.python.psi.resolve.QualifiedNameFinder;
|
||||
import com.jetbrains.python.psi.resolve.RatedResolveResult;
|
||||
import com.jetbrains.python.psi.resolve.ResolveImportUtil;
|
||||
import com.jetbrains.python.psi.resolve.VariantsProcessor;
|
||||
@@ -49,6 +57,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
|
||||
public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression {
|
||||
@@ -770,4 +779,78 @@ public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression {
|
||||
}
|
||||
return elementType == PyElementTypes.IMPORT_STATEMENT || elementType == PyElementTypes.FROM_IMPORT_STATEMENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemPresentation getPresentation() {
|
||||
return new ItemPresentation() {
|
||||
@Override
|
||||
public String getPresentableText() {
|
||||
return getModuleName(PyFileImpl.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocationString() {
|
||||
final String name = getLocationName();
|
||||
return name != null ? "(" + name + ")" : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Icon getIcon(final boolean open) {
|
||||
if (PyUtil.isPackage(PyFileImpl.this)) {
|
||||
return AllIcons.Modules.SourceFolder;
|
||||
}
|
||||
return PyFileImpl.this.getIcon(0);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private String getModuleName(@NotNull PyFile file) {
|
||||
if (PyUtil.isPackage(file)) {
|
||||
final PsiDirectory dir = file.getContainingDirectory();
|
||||
if (dir != null) {
|
||||
return dir.getName();
|
||||
}
|
||||
}
|
||||
return FileUtil.getNameWithoutExtension(file.getName());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String getLocationName() {
|
||||
final QualifiedName name = QualifiedNameFinder.findShortestImportableQName(PyFileImpl.this);
|
||||
if (name != null) {
|
||||
final QualifiedName prefix = name.removeTail(1);
|
||||
if (prefix.getComponentCount() > 0) {
|
||||
return prefix.toString();
|
||||
}
|
||||
}
|
||||
final String relativePath = getRelativeContainerPath();
|
||||
if (relativePath != null) {
|
||||
return relativePath;
|
||||
}
|
||||
final PsiDirectory psiDirectory = getParent();
|
||||
if (psiDirectory != null) {
|
||||
return psiDirectory.getVirtualFile().getPresentableUrl();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String getRelativeContainerPath() {
|
||||
final PsiDirectory psiDirectory = getParent();
|
||||
if (psiDirectory != null) {
|
||||
final VirtualFile virtualFile = getVirtualFile();
|
||||
if (virtualFile != null) {
|
||||
final VirtualFile root = ProjectFileIndex.SERVICE.getInstance(getProject()).getContentRootForFile(virtualFile);
|
||||
if (root != null) {
|
||||
final VirtualFile parent = virtualFile.getParent();
|
||||
final VirtualFile rootParent = root.getParent();
|
||||
if (rootParent != null && parent != null) {
|
||||
return VfsUtilCore.getRelativePath(parent, rootParent, File.separatorChar);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user