preserve comments: simplifiable annotation

This commit is contained in:
Anna.Kozlova
2017-11-30 14:49:59 +01:00
parent a6d2989523
commit b5cc35f1df
@@ -29,6 +29,7 @@ import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.InspectionGadgetsFix;
import com.siyeh.ig.psiutils.CommentTracker;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -79,16 +80,17 @@ public class SimplifiableAnnotationInspection extends BaseInspection implements
return;
}
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
final String annotationText = buildAnnotationText(annotation);
CommentTracker tracker = new CommentTracker();
final String annotationText = buildAnnotationText(annotation, tracker);
final PsiAnnotation newAnnotation = factory.createAnnotationFromText(annotationText, element);
annotation.replace(newAnnotation);
tracker.replaceAndRestoreComments(annotation, newAnnotation);
}
private static String buildAnnotationText(PsiAnnotation annotation) {
private static String buildAnnotationText(PsiAnnotation annotation, CommentTracker tracker) {
final StringBuilder out = new StringBuilder("@");
final PsiJavaCodeReferenceElement nameReferenceElement = annotation.getNameReferenceElement();
assert nameReferenceElement != null;
out.append(nameReferenceElement.getText());
out.append(tracker.markUnchanged(nameReferenceElement).getText());
final PsiAnnotationParameterList parameterList = annotation.getParameterList();
final PsiNameValuePair[] attributes = parameterList.getAttributes();
if (attributes.length == 0) {
@@ -101,7 +103,7 @@ public class SimplifiableAnnotationInspection extends BaseInspection implements
if (name != null && !PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME.equals(name)) {
out.append(name).append('=');
}
buildAttributeValueText(attribute.getValue(), out);
buildAttributeValueText(attribute.getValue(), out, tracker);
}
else {
for (int i = 0; i < attributes.length; i++) {
@@ -110,25 +112,29 @@ public class SimplifiableAnnotationInspection extends BaseInspection implements
out.append(',');
}
out.append(attribute.getName()).append('=');
buildAttributeValueText(attribute.getValue(), out);
buildAttributeValueText(attribute.getValue(), out, tracker);
}
}
out.append(')');
return out.toString();
}
private static StringBuilder buildAttributeValueText(PsiAnnotationMemberValue value, StringBuilder out) {
private static void buildAttributeValueText(PsiAnnotationMemberValue value,
StringBuilder out,
CommentTracker tracker) {
if (value instanceof PsiArrayInitializerMemberValue) {
final PsiArrayInitializerMemberValue arrayValue = (PsiArrayInitializerMemberValue)value;
final PsiAnnotationMemberValue[] initializers = arrayValue.getInitializers();
if (initializers.length == 1) {
return out.append(initializers[0].getText());
out.append(tracker.markUnchanged(initializers[0]).getText());
return;
}
}
else if (value instanceof PsiAnnotation) {
return out.append(buildAnnotationText((PsiAnnotation)value));
out.append(buildAnnotationText((PsiAnnotation)value, tracker));
return;
}
return out.append(value.getText());
out.append(tracker.markUnchanged(value).getText());
}
}