mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
PY-15366 No completion for matplotlib figure
matplotlib uses numpy docstrings. Added numpy to the user code ( due to PY-4717 Support for NumpyDoc)
This commit is contained in:
@@ -17,6 +17,8 @@ package com.jetbrains.numpy.codeInsight;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleUtilCore;
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
@@ -24,6 +26,7 @@ import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.jetbrains.numpy.documentation.NumPyDocString;
|
||||
import com.jetbrains.numpy.documentation.NumPyDocStringParameter;
|
||||
import com.jetbrains.python.documentation.PyDocumentationSettings;
|
||||
import com.jetbrains.python.psi.*;
|
||||
import com.jetbrains.python.psi.impl.PyBuiltinCache;
|
||||
import com.jetbrains.python.psi.impl.PyExpressionCodeFragmentImpl;
|
||||
@@ -83,7 +86,7 @@ public class NumpyDocStringTypeProvider extends PyTypeProviderBase {
|
||||
@Nullable
|
||||
@Override
|
||||
public PyType getCallType(@NotNull PyFunction function, @Nullable PyCallSiteExpression callSite, @NotNull TypeEvalContext context) {
|
||||
if (isInsideNumPy(function)) {
|
||||
if (isApplicable(function)) {
|
||||
final PyExpression callee = callSite instanceof PyCallExpression ? ((PyCallExpression)callSite).getCallee() : null;
|
||||
final NumPyDocString docString = NumPyDocString.forFunction(function, callee);
|
||||
if (docString != null) {
|
||||
@@ -140,7 +143,7 @@ public class NumpyDocStringTypeProvider extends PyTypeProviderBase {
|
||||
@Nullable
|
||||
@Override
|
||||
public Ref<PyType> getParameterType(@NotNull PyNamedParameter parameter, @NotNull PyFunction function, @NotNull TypeEvalContext context) {
|
||||
if (isInsideNumPy(function)) {
|
||||
if (isApplicable(function)) {
|
||||
final String name = parameter.getName();
|
||||
if (name != null) {
|
||||
final PyType type = getParameterType(function, name);
|
||||
@@ -153,19 +156,31 @@ public class NumpyDocStringTypeProvider extends PyTypeProviderBase {
|
||||
}
|
||||
|
||||
private static boolean isInsideNumPy(@NotNull PsiElement element) {
|
||||
if (ApplicationManager.getApplication().isUnitTestMode()) return true;
|
||||
final PsiFile file = element.getContainingFile();
|
||||
|
||||
if (file != null) {
|
||||
final PyPsiFacade facade = getPsiFacade(element);
|
||||
final VirtualFile virtualFile = file.getVirtualFile();
|
||||
if (virtualFile != null) {
|
||||
final String name = facade.findShortestImportableName(virtualFile, element);
|
||||
return name != null && name.startsWith("numpy.");
|
||||
return name != null && (name.startsWith("numpy.") || name.startsWith("matplotlib."));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean isApplicable(@NotNull PsiElement element) {
|
||||
if (ApplicationManager.getApplication().isUnitTestMode()) return true;
|
||||
final Module module = ModuleUtilCore.findModuleForPsiElement(element);
|
||||
if (module != null){
|
||||
if (PyDocumentationSettings.getInstance(module).isNumpyFormat(element.getContainingFile())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return isInsideNumPy(element);
|
||||
}
|
||||
|
||||
private static PyPsiFacade getPsiFacade(@NotNull PsiElement anchor) {
|
||||
return PyPsiFacade.getInstance(anchor.getProject());
|
||||
}
|
||||
@@ -237,7 +252,7 @@ public class NumpyDocStringTypeProvider extends PyTypeProviderBase {
|
||||
|
||||
private static boolean isUfuncType(@NotNull PsiElement anchor, @NotNull final String typeString) {
|
||||
for (String typeName : NumPyDocString.getNumpyUnionType(typeString)) {
|
||||
if (anchor instanceof PyFunction && NumpyUfuncs.isUFunc(((PyFunction)anchor).getName()) &&
|
||||
if (anchor instanceof PyFunction && isInsideNumPy(anchor) && NumpyUfuncs.isUFunc(((PyFunction)anchor).getName()) &&
|
||||
("array_like".equals(typeName) || "ndarray".equals(typeName))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -26,8 +26,9 @@ public class DocStringFormat {
|
||||
public static final String PLAIN = "Plain";
|
||||
public static final String EPYTEXT = "Epytext";
|
||||
public static final String REST = "reStructuredText";
|
||||
public static final String NUMPY = "NumPy";
|
||||
|
||||
public static final List<String> ALL = ImmutableList.of(PLAIN, EPYTEXT, REST);
|
||||
public static final List<String> ALL = ImmutableList.of(PLAIN, EPYTEXT, REST, NUMPY);
|
||||
|
||||
private DocStringFormat() {
|
||||
}
|
||||
|
||||
@@ -53,6 +53,10 @@ public class PyDocumentationSettings implements PersistentStateComponent<PyDocum
|
||||
return isFormat(file, DocStringFormat.REST);
|
||||
}
|
||||
|
||||
public boolean isNumpyFormat(PsiFile file) {
|
||||
return isFormat(file, DocStringFormat.NUMPY);
|
||||
}
|
||||
|
||||
public boolean isPlain(PsiFile file) {
|
||||
return isFormat(file, DocStringFormat.PLAIN);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user