Search in sources :

Example 1 with PyType

use of com.jetbrains.python.psi.types.PyType in project intellij-community by JetBrains.

the class PyUserSkeletonsUtil method getUserSkeleton.

@Nullable
private static PsiElement getUserSkeleton(@NotNull PyElement element, @NotNull PyFile skeletonFile, @Nullable TypeEvalContext context) {
    if (element instanceof PyFile) {
        return skeletonFile;
    }
    final ScopeOwner owner = ScopeUtil.getScopeOwner(element);
    final String name = element.getName();
    if (owner != null && name != null) {
        assert owner != element;
        final PsiElement originalOwner = getUserSkeleton(owner, skeletonFile, context);
        if (originalOwner instanceof PyClass) {
            final PyClass classOwner = (PyClass) originalOwner;
            final PyType type = TypeEvalContext.codeInsightFallback(classOwner.getProject()).getType(classOwner);
            if (type instanceof PyClassLikeType) {
                final PyClassLikeType classType = (PyClassLikeType) type;
                final PyClassLikeType instanceType = classType.toInstance();
                PyResolveContext resolveContext = PyResolveContext.noImplicits();
                if (context != null) {
                    resolveContext = resolveContext.withTypeEvalContext(context);
                }
                final List<? extends RatedResolveResult> resolveResults = instanceType.resolveMember(name, null, AccessDirection.READ, resolveContext, false);
                if (resolveResults != null && !resolveResults.isEmpty()) {
                    return resolveResults.get(0).getElement();
                }
            }
        } else if (originalOwner instanceof PyFile) {
            return ((PyFile) originalOwner).getElementNamed(name);
        }
    }
    return null;
}
Also used : ScopeOwner(com.jetbrains.python.codeInsight.controlflow.ScopeOwner) PyType(com.jetbrains.python.psi.types.PyType) PyClassLikeType(com.jetbrains.python.psi.types.PyClassLikeType) PsiElement(com.intellij.psi.PsiElement) Nullable(org.jetbrains.annotations.Nullable)

Example 2 with PyType

use of com.jetbrains.python.psi.types.PyType in project intellij-community by JetBrains.

the class PyDebugProcess method getSourcePositionForType.

@Nullable
@Override
public XSourcePosition getSourcePositionForType(String typeName) {
    XSourcePosition currentPosition = getCurrentFrameSourcePosition();
    final PsiFile file = getPsiFile(currentPosition);
    if (file == null || typeName == null || !(file instanceof PyFile))
        return null;
    final PyType pyType = resolveTypeFromString(typeName, file);
    return pyType == null ? null : typeToPosition(pyType);
}
Also used : PyType(com.jetbrains.python.psi.types.PyType) PsiFile(com.intellij.psi.PsiFile) Nullable(org.jetbrains.annotations.Nullable)

Example 3 with PyType

use of com.jetbrains.python.psi.types.PyType in project intellij-community by JetBrains.

the class PyiTypeTest method assertType.

private static void assertType(@NotNull String expectedType, @NotNull PyTypedElement element, @NotNull TypeEvalContext context) {
    final PyType actual = context.getType(element);
    final String actualType = PythonDocumentationProvider.getTypeName(actual, context);
    assertEquals("Failed in " + context + " context", expectedType, actualType);
}
Also used : PyType(com.jetbrains.python.psi.types.PyType)

Example 4 with PyType

use of com.jetbrains.python.psi.types.PyType in project intellij-community by JetBrains.

the class NumpyDocStringTypeProvider method getCallType.

@Nullable
@Override
public Ref<PyType> getCallType(@NotNull PyFunction function, @Nullable PyCallSiteExpression callSite, @NotNull TypeEvalContext context) {
    if (isApplicable(function)) {
        final PyExpression callee = callSite instanceof PyCallExpression ? ((PyCallExpression) callSite).getCallee() : null;
        final NumpyDocString docString = forFunction(function, callee);
        if (docString != null) {
            final List<SectionField> returns = docString.getReturnFields();
            final PyPsiFacade facade = getPsiFacade(function);
            switch(returns.size()) {
                case 0:
                    return null;
                case 1:
                    // Function returns single value
                    return Optional.ofNullable(returns.get(0).getType()).filter(StringUtil::isNotEmpty).map(typeName -> isUfuncType(function, typeName) ? facade.parseTypeAnnotation("T", function) : parseNumpyDocType(function, typeName)).map(Ref::create).orElse(null);
                default:
                    // Function returns a tuple
                    final List<PyType> unionMembers = new ArrayList<>();
                    final List<PyType> members = new ArrayList<>();
                    for (int i = 0; i < returns.size(); i++) {
                        final String memberTypeName = returns.get(i).getType();
                        final PyType returnType = StringUtil.isNotEmpty(memberTypeName) ? parseNumpyDocType(function, memberTypeName) : null;
                        final boolean isOptional = StringUtil.isNotEmpty(memberTypeName) && memberTypeName.contains("optional");
                        if (isOptional && i != 0) {
                            if (members.size() > 1) {
                                unionMembers.add(facade.createTupleType(members, function));
                            } else if (members.size() == 1) {
                                unionMembers.add(members.get(0));
                            }
                        }
                        members.add(returnType);
                        if (i == returns.size() - 1 && isOptional) {
                            unionMembers.add(facade.createTupleType(members, function));
                        }
                    }
                    final PyType type = unionMembers.isEmpty() ? facade.createTupleType(members, function) : facade.createUnionType(unionMembers);
                    return Ref.create(type);
            }
        }
    }
    return null;
}
Also used : PyType(com.jetbrains.python.psi.types.PyType) SectionField(com.jetbrains.python.documentation.docstrings.SectionBasedDocString.SectionField) NumpyDocString(com.jetbrains.python.documentation.docstrings.NumpyDocString) NumpyDocString(com.jetbrains.python.documentation.docstrings.NumpyDocString) Nullable(org.jetbrains.annotations.Nullable)

Example 5 with PyType

use of com.jetbrains.python.psi.types.PyType in project intellij-community by JetBrains.

the class NumpyDocStringTypeProvider method parseSingleNumpyDocType.

@Nullable
private static PyType parseSingleNumpyDocType(@NotNull PsiElement anchor, @NotNull String typeString) {
    final PyPsiFacade facade = getPsiFacade(anchor);
    final String realTypeName = getNumpyRealTypeName(typeString);
    PyType type = facade.parseTypeAnnotation(realTypeName, anchor);
    if (type != null) {
        return type;
    }
    type = facade.parseTypeAnnotation(typeString, anchor);
    if (type != null) {
        return type;
    }
    return getNominalType(anchor, typeString);
}
Also used : PyType(com.jetbrains.python.psi.types.PyType) NumpyDocString(com.jetbrains.python.documentation.docstrings.NumpyDocString) Nullable(org.jetbrains.annotations.Nullable)

Aggregations

PyType (com.jetbrains.python.psi.types.PyType)42 TypeEvalContext (com.jetbrains.python.psi.types.TypeEvalContext)13 PsiElement (com.intellij.psi.PsiElement)11 Nullable (org.jetbrains.annotations.Nullable)9 PyClassType (com.jetbrains.python.psi.types.PyClassType)6 NotNull (org.jetbrains.annotations.NotNull)6 PsiFile (com.intellij.psi.PsiFile)5 ArrayList (java.util.ArrayList)5 PyClassLikeType (com.jetbrains.python.psi.types.PyClassLikeType)4 PyClassTypeImpl (com.jetbrains.python.psi.types.PyClassTypeImpl)4 NumpyDocString (com.jetbrains.python.documentation.docstrings.NumpyDocString)3 PyExpression (com.jetbrains.python.psi.PyExpression)3 FileASTNode (com.intellij.lang.FileASTNode)2 TextRange (com.intellij.openapi.util.TextRange)2 PsiReference (com.intellij.psi.PsiReference)2 IncorrectOperationException (com.intellij.util.IncorrectOperationException)2 ScopeOwner (com.jetbrains.python.codeInsight.controlflow.ScopeOwner)2 PyClass (com.jetbrains.python.psi.PyClass)2 PyFunctionBuilder (com.jetbrains.python.psi.impl.PyFunctionBuilder)2 PyStructuralType (com.jetbrains.python.psi.types.PyStructuralType)2