void (@NotNull PsiDocComment comment, @NotNull Document document) { //region Parse existing doc comment parameters. List<String> current = new ArrayList<>(); Map<String, Pair<TextRange, String>> tagInfoByName = new HashMap<>(); for (PsiDocTag tag : comment.getTags()) { if (!PARAM_TAG_NAME.equals(tag.getName())) { continue; } PsiDocTagValue valueElement = tag.getValueElement(); if (valueElement == null) { continue; } String paramName = valueElement.getText(); if (paramName != null) { current.add(paramName); tagInfoByName.put(paramName, parseTagValue(tag, document)); } } //endregion //region Calculate desired parameters order List<String> ordered = new ArrayList<>(); PsiJavaDocumentedElement owner = comment.getOwner(); if ((owner instanceof PsiMethod)) { PsiParameter[] parameters = ((PsiMethod)owner).getParameterList().getParameters(); for (PsiParameter parameter : parameters) { ordered.add(parameter.getName()); } } if (owner instanceof PsiTypeParameterListOwner) { PsiTypeParameter[] typeParameters = ((PsiTypeParameterListOwner)owner).getTypeParameters(); for (PsiTypeParameter parameter : typeParameters) { ordered.add(String.format("<%s>", parameter.getName())); } } //endregion //region Fix order if necessary. if (current.size() != ordered.size()) { // Something is wrong, stop the processing. return; } boolean changed = false; for (int i = current.size() - 1; i >= 0; i--) { String newTag = ordered.get(i); String oldTag = current.get(i); if (newTag.equals(oldTag)) { continue; } TextRange range = tagInfoByName.get(oldTag).first; document.replaceString(range.getStartOffset(), range.getEndOffset(), tagInfoByName.get(newTag).second); changed = true; } if (changed) { PsiDocumentManager manager = PsiDocumentManager.getInstance(comment.getProject()); manager.commitDocument(document); } //endregion }