Search in sources :

Example 26 with PyType

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

the class PyQtTypeProvider method getReturnType.

@Override
public Ref<PyType> getReturnType(@NotNull PyCallable callable, @NotNull TypeEvalContext context) {
    if (PyNames.INIT.equals(callable.getName()) && callable instanceof PyFunction) {
        final PyFunction function = (PyFunction) callable;
        final PyClass containingClass = function.getContainingClass();
        if (containingClass != null && ourQt4Signal.equals(containingClass.getName())) {
            final String classQName = containingClass.getQualifiedName();
            if (classQName != null) {
                final QualifiedName name = QualifiedName.fromDottedString(classQName);
                final String qtVersion = name.getComponents().get(0);
                final PyClass aClass = PyClassNameIndex.findClass(qtVersion + "." + ourQtBoundSignal, function.getProject());
                if (aClass != null) {
                    final PyType type = new PyClassTypeImpl(aClass, false);
                    return Ref.create(type);
                }
            }
        }
    }
    return null;
}
Also used : PyClass(com.jetbrains.python.psi.PyClass) PyClassTypeImpl(com.jetbrains.python.psi.types.PyClassTypeImpl) PyFunction(com.jetbrains.python.psi.PyFunction) QualifiedName(com.intellij.psi.util.QualifiedName) PyType(com.jetbrains.python.psi.types.PyType)

Example 27 with PyType

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

the class PyTypeCheckerInspectionProblemRegistrar method getSingleCalleeProblemMessage.

@NotNull
private static String getSingleCalleeProblemMessage(@NotNull PyTypeCheckerInspection.AnalyzeArgumentResult argumentResult, @NotNull TypeEvalContext context) {
    final PyType actualType = argumentResult.getActualType();
    final PyType expectedType = argumentResult.getExpectedType();
    // see PyTypeCheckerInspection.Visitor.analyzeArgument()
    assert actualType != null;
    // see PyTypeCheckerInspection.Visitor.analyzeArgument()
    assert expectedType != null;
    final String actualTypeName = PythonDocumentationProvider.getTypeName(actualType, context);
    if (expectedType instanceof PyStructuralType) {
        final Set<String> expectedAttributes = ((PyStructuralType) expectedType).getAttributeNames();
        final Set<String> actualAttributes = getAttributes(actualType, context);
        if (actualAttributes != null) {
            final Sets.SetView<String> missingAttributes = Sets.difference(expectedAttributes, actualAttributes);
            if (missingAttributes.size() == 1) {
                return String.format("Type '%s' doesn't have expected attribute '%s'", actualTypeName, missingAttributes.iterator().next());
            } else {
                return String.format("Type '%s' doesn't have expected attributes %s", actualTypeName, StringUtil.join(missingAttributes, s -> String.format("'%s'", s), ", "));
            }
        }
    }
    final String expectedTypeRepresentation = getSingleCalleeExpectedTypeRepresentation(expectedType, argumentResult.getExpectedTypeAfterSubstitution(), context);
    return String.format("Expected type %s, got '%s' instead", expectedTypeRepresentation, actualTypeName);
}
Also used : TypeEvalContext(com.jetbrains.python.psi.types.TypeEvalContext) PyNames(com.jetbrains.python.PyNames) PythonDocumentationProvider(com.jetbrains.python.documentation.PythonDocumentationProvider) PyType(com.jetbrains.python.psi.types.PyType) StringUtil(com.intellij.openapi.util.text.StringUtil) Predicate(java.util.function.Predicate) PyClassLikeType(com.jetbrains.python.psi.types.PyClassLikeType) Set(java.util.Set) ContainerUtil(com.intellij.util.containers.ContainerUtil) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) Nullable(org.jetbrains.annotations.Nullable) List(java.util.List) PsiElement(com.intellij.psi.PsiElement) XmlStringUtil(com.intellij.xml.util.XmlStringUtil) com.jetbrains.python.psi(com.jetbrains.python.psi) Optional(java.util.Optional) ObjectUtils(com.intellij.util.ObjectUtils) PyStructuralType(com.jetbrains.python.psi.types.PyStructuralType) ProblemHighlightType(com.intellij.codeInspection.ProblemHighlightType) NotNull(org.jetbrains.annotations.NotNull) Sets(com.google.common.collect.Sets) PyType(com.jetbrains.python.psi.types.PyType) PyStructuralType(com.jetbrains.python.psi.types.PyStructuralType) NotNull(org.jetbrains.annotations.NotNull)

Example 28 with PyType

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

the class AddMethodQuickFix method getClassType.

private static PyClassType getClassType(@NotNull final PsiElement problemElement) {
    if ((problemElement instanceof PyQualifiedExpression)) {
        final PyExpression qualifier = ((PyQualifiedExpression) problemElement).getQualifier();
        if (qualifier == null)
            return null;
        final PyType type = TypeEvalContext.userInitiated(problemElement.getProject(), problemElement.getContainingFile()).getType(qualifier);
        return type instanceof PyClassType ? (PyClassType) type : null;
    }
    final PyClass pyClass = PsiTreeUtil.getParentOfType(problemElement, PyClass.class);
    return pyClass != null ? new PyClassTypeImpl(pyClass, false) : null;
}
Also used : PyClassTypeImpl(com.jetbrains.python.psi.types.PyClassTypeImpl) PyClassType(com.jetbrains.python.psi.types.PyClassType) PyType(com.jetbrains.python.psi.types.PyType)

Example 29 with PyType

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

the class PyiUtil method findSimilarElement.

@Nullable
private static PsiElement findSimilarElement(@NotNull PyElement element, @NotNull PyFile file) {
    if (element instanceof PyFile) {
        return file;
    }
    final ScopeOwner owner = ScopeUtil.getScopeOwner(element);
    final String name = element.getName();
    if (owner != null && name != null) {
        assert owner != element;
        final PsiElement originalOwner = findSimilarElement(owner, file);
        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();
                final List<? extends RatedResolveResult> resolveResults = instanceType.resolveMember(name, null, AccessDirection.READ, PyResolveContext.noImplicits(), 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 30 with PyType

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

the class ResolveImportUtil method resolveMemberFromReferenceTypeProviders.

@NotNull
private static List<RatedResolveResult> resolveMemberFromReferenceTypeProviders(@NotNull PsiElement parent, @NotNull String referencedName) {
    final PyResolveContext resolveContext = PyResolveContext.defaultContext();
    final PyType refType = PyReferenceExpressionImpl.getReferenceTypeFromProviders(parent, resolveContext.getTypeEvalContext(), null);
    if (refType != null) {
        final List<? extends RatedResolveResult> result = refType.resolveMember(referencedName, null, AccessDirection.READ, resolveContext);
        if (result != null) {
            return Lists.newArrayList(result);
        }
    }
    return Collections.emptyList();
}
Also used : PyType(com.jetbrains.python.psi.types.PyType) NotNull(org.jetbrains.annotations.NotNull)

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