PyType (@NotNull PsiElement resolved, @NotNull Context context) { if (resolved instanceof PySubscriptionExpression subscriptionExpr) { final PyExpression operand = subscriptionExpr.getOperand(); final Collection<String> operandNames = resolveToQualifiedNames(operand, context.getTypeContext()); if (operandNames.contains(CALLABLE)) { final PyExpression indexExpr = subscriptionExpr.getIndexExpression(); if (indexExpr instanceof PyTupleExpression tupleExpr) { final PyExpression[] elements = tupleExpr.getElements(); if (elements.length == 2) { final PyExpression parametersExpr = elements[0]; final PyExpression returnTypeExpr = elements[1]; if (parametersExpr instanceof PyListLiteralExpression listExpr) { final List<PyCallableParameter> parameters = new ArrayList<>(); for (PyExpression argExpr : listExpr.getElements()) { parameters.add(PyCallableParameterImpl.nonPsi(Ref.deref(getType(argExpr, context)))); } final PyType returnType = Ref.deref(getType(returnTypeExpr, context)); return new PyCallableTypeImpl(parameters, returnType); } if (isEllipsis(parametersExpr)) { return new PyCallableTypeImpl(null, Ref.deref(getType(returnTypeExpr, context))); } if (parametersExpr instanceof PyReferenceExpression) { if (Ref.deref(getType(parametersExpr, context.myContext)) instanceof PyParamSpecType paramSpec) { final var parameter = PyCallableParameterImpl.nonPsi(parametersExpr.getName(), paramSpec); return new PyCallableTypeImpl(Collections.singletonList(parameter), Ref.deref(getType(returnTypeExpr, context))); } } if (parametersExpr instanceof PySubscriptionExpression && isConcatenate(parametersExpr, context.myContext)) { final var concatenateParameters = getConcatenateParametersTypes((PySubscriptionExpression)parametersExpr, context.myContext); if (concatenateParameters != null) { final var concatenate = new PyConcatenateType(concatenateParameters.first, concatenateParameters.second); final var parameter = PyCallableParameterImpl.nonPsi(parametersExpr.getName(), concatenate); return new PyCallableTypeImpl(Collections.singletonList(parameter), Ref.deref(getType(returnTypeExpr, context))); } } } } } } else if (resolved instanceof PyTargetExpression) { if (resolveToQualifiedNames((PyTargetExpression)resolved, context.getTypeContext()).contains(CALLABLE)) { return new PyCallableTypeImpl(null, null); } } return null; }