@Override public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { if (!super.isAvailable(project, editor, file) || !(file instanceof JetFile)) { return false; } // When running single test 'isAvailable()' is invoked multiple times, so we need to clear // lists. overriddenNonOverridableMembers.clear(); containingDeclarationsNames.clear(); DeclarationDescriptor descriptor = ResolvePackage.resolveToDescriptor(element); if (!(descriptor instanceof CallableMemberDescriptor)) return false; for (CallableMemberDescriptor overriddenDescriptor : getAllDeclaredNonOverridableOverriddenDescriptors((CallableMemberDescriptor) descriptor)) { assert overriddenDescriptor.getKind() == DECLARATION : "Can only be applied to declarations."; PsiElement overriddenMember = descriptorToDeclaration(overriddenDescriptor); if (overriddenMember == null || !QuickFixUtil.canModifyElement(overriddenMember) || !(overriddenMember instanceof JetCallableDeclaration)) { return false; } String containingDeclarationName = overriddenDescriptor.getContainingDeclaration().getName().asString(); overriddenNonOverridableMembers.add((JetCallableDeclaration) overriddenMember); containingDeclarationsNames.add(containingDeclarationName); } return overriddenNonOverridableMembers.size() > 0; }
@Nullable public final FunctionDescriptor getCurrentFunctionDescriptor() { if (currentFunctionDescriptor == null) { PsiElement element = getDeclaration(); if (element instanceof JetFunction) { currentFunctionDescriptor = (FunctionDescriptor) ResolvePackage.resolveToDescriptor((JetFunction) element); } else if (element instanceof JetClass) { currentFunctionDescriptor = ((ClassDescriptor) ResolvePackage.resolveToDescriptor((JetClass) element)) .getUnsubstitutedPrimaryConstructor(); } else if (element instanceof PsiMethod) { currentFunctionDescriptor = ResolvePackage.getJavaMethodDescriptor((PsiMethod) element); } } return currentFunctionDescriptor; }
private static List<FunctionDescriptor> generateFunctionsToAdd(JetNamedFunction functionElement) { FunctionDescriptor functionDescriptor = (FunctionDescriptor) ResolvePackage.resolveToDescriptor(functionElement); DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration(); if (!(containingDeclaration instanceof ClassDescriptor)) return Collections.emptyList(); List<FunctionDescriptor> functions = Lists.newArrayList(); ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration; // TODO: filter out impossible supertypes (for example when argument's type isn't visible in a // superclass). for (ClassDescriptor supertypeDescriptor : getSupertypes(classDescriptor)) { if (KotlinBuiltIns.isAnyOrNullableAny(supertypeDescriptor.getDefaultType())) continue; functions.add(generateFunctionSignatureForType(functionDescriptor, supertypeDescriptor)); } return functions; }