mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
change signature: preserve param javadoc when name was changed (IDEA-87521)
This commit is contained in:
+14
-3
@@ -20,12 +20,15 @@ import com.intellij.lang.StdLanguages;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.CodeStyleManager;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.codeStyle.VariableKind;
|
||||
import com.intellij.psi.javadoc.PsiDocTag;
|
||||
import com.intellij.psi.scope.processor.VariablesProcessor;
|
||||
import com.intellij.psi.scope.util.PsiScopesUtil;
|
||||
import com.intellij.psi.util.*;
|
||||
@@ -790,7 +793,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
|
||||
methodThrowsList.getTextRange().getEndOffset());
|
||||
}
|
||||
|
||||
private static void fixJavadocsForChangedMethod(PsiMethod method, JavaChangeInfo changeInfo, int newParamsLength) throws IncorrectOperationException {
|
||||
private static void fixJavadocsForChangedMethod(final PsiMethod method, final JavaChangeInfo changeInfo, int newParamsLength) throws IncorrectOperationException {
|
||||
final PsiParameter[] parameters = method.getParameterList().getParameters();
|
||||
final JavaParameterInfo[] newParms = changeInfo.getNewParameters();
|
||||
LOG.assertTrue(parameters.length <= newParamsLength);
|
||||
@@ -799,11 +802,19 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
|
||||
for (int i = 0; i < newParamsLength; i++) {
|
||||
JavaParameterInfo newParm = newParms[i];
|
||||
if (newParm.getOldIndex() < 0 ||
|
||||
!newParm.getName().equals(oldParameterNames[newParm.getOldIndex()])) {
|
||||
!(newParm.getName().equals(oldParameterNames[newParm.getOldIndex()]) || newParm.getOldIndex() == i || newParm.getTypeText().equals(changeInfo.getOldParameterTypes()[newParm.getOldIndex()]))) {
|
||||
newParameters.add(parameters[i]);
|
||||
}
|
||||
}
|
||||
RefactoringUtil.fixJavadocsForParams(method, newParameters);
|
||||
RefactoringUtil.fixJavadocsForParams(method, newParameters, new Condition<Pair<PsiParameter, String>>() {
|
||||
@Override
|
||||
public boolean value(Pair<PsiParameter, String> pair) {
|
||||
final PsiParameter parameter = pair.first;
|
||||
final String oldParamName = pair.second;
|
||||
final int idx = Arrays.binarySearch(oldParameterNames, oldParamName);
|
||||
return idx >= 0 && (parameter.getType().equalsToText(changeInfo.getOldParameterTypes()[idx]) || idx == method.getParameterList().getParameterIndex(parameter));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static PsiParameter createNewParameter(JavaChangeInfo changeInfo, JavaParameterInfo newParm,
|
||||
|
||||
@@ -31,6 +31,7 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.VfsUtil;
|
||||
@@ -42,6 +43,7 @@ import com.intellij.psi.codeStyle.VariableKind;
|
||||
import com.intellij.psi.controlFlow.ControlFlowUtil;
|
||||
import com.intellij.psi.javadoc.PsiDocComment;
|
||||
import com.intellij.psi.javadoc.PsiDocTag;
|
||||
import com.intellij.psi.javadoc.PsiDocTagValue;
|
||||
import com.intellij.psi.search.LocalSearchScope;
|
||||
import com.intellij.psi.search.SearchScope;
|
||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
||||
@@ -1046,6 +1048,12 @@ public class RefactoringUtil {
|
||||
}
|
||||
|
||||
public static void fixJavadocsForParams(PsiMethod method, Set<PsiParameter> newParameters) throws IncorrectOperationException {
|
||||
fixJavadocsForParams(method, newParameters, Condition.FALSE);
|
||||
}
|
||||
|
||||
public static void fixJavadocsForParams(PsiMethod method,
|
||||
Set<PsiParameter> newParameters,
|
||||
Condition<Pair<PsiParameter, String>> eqCondition) throws IncorrectOperationException {
|
||||
final PsiDocComment docComment = method.getDocComment();
|
||||
if (docComment == null) return;
|
||||
final PsiParameter[] parameters = method.getParameterList().getParameters();
|
||||
@@ -1061,6 +1069,16 @@ public class RefactoringUtil {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
for (PsiDocTag paramTag : paramTags) {
|
||||
final String paramName = getNameOfReferencedParameter(paramTag);
|
||||
if (eqCondition.value(new Pair<PsiParameter, String>(parameter, paramName))) {
|
||||
tagForParam.put(parameter, paramTag);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!found && !newParameters.contains(parameter)) {
|
||||
tagForParam.put(parameter, null);
|
||||
}
|
||||
@@ -1071,11 +1089,16 @@ public class RefactoringUtil {
|
||||
if (tagForParam.containsKey(parameter)) {
|
||||
final PsiDocTag psiDocTag = tagForParam.get(parameter);
|
||||
if (psiDocTag != null) {
|
||||
newTags.add((PsiDocTag)psiDocTag.copy());
|
||||
final PsiDocTag copy = (PsiDocTag)psiDocTag.copy();
|
||||
final PsiDocTagValue valueElement = copy.getValueElement();
|
||||
if (valueElement != null) {
|
||||
valueElement.replace(createParamTag(parameter).getValueElement());
|
||||
}
|
||||
newTags.add(copy);
|
||||
}
|
||||
}
|
||||
else {
|
||||
newTags.add(JavaPsiFacade.getInstance(method.getProject()).getElementFactory().createParamTag(parameter.getName(), ""));
|
||||
newTags.add(createParamTag(parameter));
|
||||
}
|
||||
}
|
||||
PsiElement anchor = paramTags.length > 0 ? paramTags[0].getPrevSibling() : null;
|
||||
@@ -1087,6 +1110,10 @@ public class RefactoringUtil {
|
||||
}
|
||||
}
|
||||
|
||||
private static PsiDocTag createParamTag(PsiParameter parameter) {
|
||||
return JavaPsiFacade.getInstance(parameter.getProject()).getElementFactory().createParamTag(parameter.getName(), "");
|
||||
}
|
||||
|
||||
public static PsiDirectory createPackageDirectoryInSourceRoot(PackageWrapper aPackage, final VirtualFile sourceRoot)
|
||||
throws IncorrectOperationException {
|
||||
final PsiDirectory[] directories = aPackage.getDirectories();
|
||||
|
||||
Reference in New Issue
Block a user