void (Object item, PsiFile file, final Document document, final int segmentStart, final int segmentEnd, boolean noImport) { final Project project = file.getProject(); List<PsiClass> classes = new ArrayList<>(); if (item instanceof PsiClass) { classes.add((PsiClass)item); } else if (item instanceof PsiClassType) { PsiTypesUtil.TypeParameterSearcher searcher = new PsiTypesUtil.TypeParameterSearcher(); ((PsiClassType)item).accept(searcher); classes.addAll(searcher.getTypeParameters()); } if (!classes.isEmpty()) { for (PsiClass aClass : classes) { if (aClass instanceof PsiTypeParameter) { PsiElement element = file.findElementAt(segmentStart); PsiMethod method = PsiTreeUtil.getParentOfType(element, PsiMethod.class); if (method != null) { if (!method.hasModifierProperty(PsiModifier.STATIC)) { PsiTypeParameterListOwner owner = ((PsiTypeParameter)aClass).getOwner(); if (PsiTreeUtil.isAncestor(owner, method, false)) { continue; } } PsiTypeParameterList paramList = method.getTypeParameterList(); PsiTypeParameter[] params = paramList != null ? paramList.getTypeParameters() : PsiTypeParameter.EMPTY_ARRAY; for (PsiTypeParameter param : params) { if (param.getName().equals(aClass.getName())) return; } try { if (paramList == null) { final PsiTypeParameterList newList = JVMElementFactories.getFactory(method.getLanguage(), project).createTypeParameterList(); paramList = (PsiTypeParameterList)method.addAfter(newList, method.getModifierList()); } paramList.add(aClass.copy()); PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document); } catch (IncorrectOperationException e) { LOG.error(e); } } } else if (!noImport) { addImportForClass(document, aClass, segmentStart, segmentEnd); PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document); } } } }