PsiElement (@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 classOwner) { final var fallbackContext = TypeEvalContext.codeInsightFallback(classOwner.getProject()); final PyType type = fallbackContext.getType(classOwner); if (type instanceof PyClassLikeType classType) { final PyClassLikeType instanceType = classType.toInstance(); final PyResolveContext resolveContext = PyResolveContext.defaultContext(ObjectUtils.notNull(context, fallbackContext)); 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; }