void (PsiTypeParameterList oldTypeParameterList, final Project project, final PsiClass psiClass, final PsiClass targetClass, final boolean includeClassName) { final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project); PsiJavaCodeReferenceElement ref = elementFactory.createClassReferenceElement(psiClass); try { if (psiClass.isInterface()) { ref = (PsiJavaCodeReferenceElement)targetClass.getImplementsList().add(ref); } else { ref = (PsiJavaCodeReferenceElement)targetClass.getExtendsList().add(ref); } if (psiClass.hasModifierProperty(PsiModifier.SEALED) && psiClass.getContainingFile() != targetClass.getContainingFile()) { String createdClassName = Objects.requireNonNull(targetClass.getQualifiedName()); SealedUtils.addClassToPermitsList(psiClass, createdClassName); } if (psiClass.hasTypeParameters() || includeClassName) { final Editor editor = CodeInsightUtil.positionCursorAtLBrace(project, targetClass.getContainingFile(), targetClass); final TemplateBuilderImpl templateBuilder = editor != null ? (TemplateBuilderImpl)TemplateBuilderFactory.getInstance().createTemplateBuilder(targetClass) : null; if (includeClassName && templateBuilder != null) { templateBuilder.replaceElement(targetClass.getNameIdentifier(), targetClass.getName()); } if (oldTypeParameterList != null) { for (PsiTypeParameter parameter : oldTypeParameterList.getTypeParameters()) { final PsiElement param = ref.getParameterList().add(elementFactory.createTypeElement(elementFactory.createType(parameter))); if (templateBuilder != null) { templateBuilder.replaceElement(param, param.getText()); } } final PsiTypeParameterList typeParameterList = targetClass.getTypeParameterList(); assert typeParameterList != null; typeParameterList.replace(oldTypeParameterList); } if (templateBuilder != null) { templateBuilder.setEndVariableBefore(ref); final Template template = templateBuilder.buildTemplate(); template.addEndVariable(); PsiClassOwner containingFile = (PsiClassOwner)targetClass.getContainingFile(); int idxInFile = ArrayUtil.find(containingFile.getClasses(), targetClass); PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument()); final TextRange textRange = targetClass.getTextRange(); final RangeMarker startClassOffset = editor.getDocument().createRangeMarker(textRange.getStartOffset(), textRange.getEndOffset()); editor.getDocument().deleteString(textRange.getStartOffset(), textRange.getEndOffset()); CreateFromUsageBaseFix.startTemplate(editor, template, project, new TemplateEditingAdapter() { @Override public void templateFinished(@NotNull Template template, boolean brokenOff) { try { LOG.assertTrue(startClassOffset.isValid(), startClassOffset); final PsiClass aTargetClass; if (idxInFile >= 0) { PsiClass[] classes = containingFile.getClasses(); LOG.assertTrue(idxInFile < classes.length, "idx: " + idxInFile + "; len: " + classes.length); aTargetClass = classes[idxInFile]; } else { final PsiElement psiElement = containingFile.findElementAt(startClassOffset.getStartOffset()); aTargetClass = PsiTreeUtil.getParentOfType(psiElement, PsiClass.class); LOG.assertTrue(aTargetClass != null, psiElement); } if (!brokenOff) { chooseAndImplement(psiClass, project, aTargetClass, editor); } } finally { startClassOffset.dispose(); } } }, getTitle(psiClass)); } } } catch (IncorrectOperationException e) { LOG.error(e); } }