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;
}
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);
}
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);
}
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;
}
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);
}
Aggregations