[java-inspections] More ModCommands (IDEA-322693)

GitOrigin-RevId: 872930704951f58571b072b6c85a5400574029f8
This commit is contained in:
Tagir Valeev
2023-07-06 17:39:47 +02:00
committed by intellij-monorepo-bot
parent 8d4aecd03f
commit 6b65e3797e
4 changed files with 38 additions and 45 deletions

View File

@@ -4,10 +4,12 @@ package com.intellij.codeInspection;
import com.intellij.codeInsight.ExceptionUtil;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil;
import com.intellij.java.JavaBundle;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.SuggestedNameInfo;
import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.PsiTreeUtil;
@@ -97,13 +99,13 @@ public class BulkFileAttributesReadInspection extends AbstractBaseJavaLocalInspe
boolean needsTryCatchBlock = needsTryCatchBlock(anchor);
if (!needsTryCatchBlock) {
varCalls.forEach(call -> myHolder.registerProblem(call, JavaBundle.message("inspection.bulk.file.attributes.read.message"),
new ReplaceWithBulkCallFix(myIsOnTheFly)));
new ReplaceWithBulkCallFix()));
return;
}
if (myIsOnTheFly) {
varCalls.forEach(call -> myHolder.registerProblem(call, JavaBundle.message("inspection.bulk.file.attributes.read.message"),
ProblemHighlightType.INFORMATION,
new ReplaceWithBulkCallFix(true)));
new ReplaceWithBulkCallFix()));
}
});
}
@@ -161,12 +163,8 @@ public class BulkFileAttributesReadInspection extends AbstractBaseJavaLocalInspe
}
}
private static class ReplaceWithBulkCallFix implements LocalQuickFix {
private final boolean myIsOnTheFly;
private ReplaceWithBulkCallFix(boolean isOnTheFly) {
myIsOnTheFly = isOnTheFly;
private static class ReplaceWithBulkCallFix extends PsiUpdateModCommandQuickFix {
private ReplaceWithBulkCallFix() {
}
@Override
@@ -175,8 +173,8 @@ public class BulkFileAttributesReadInspection extends AbstractBaseJavaLocalInspe
}
@Override
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
PsiMethodCallExpression call = ObjectUtils.tryCast(descriptor.getPsiElement(), PsiMethodCallExpression.class);
protected void applyFix(@NotNull Project project, @NotNull PsiElement element, @NotNull ModPsiUpdater updater) {
PsiMethodCallExpression call = ObjectUtils.tryCast(element, PsiMethodCallExpression.class);
if (!FILE_ATTR_CALL_MATCHER.test(call)) return;
FileVariableModel fileVariable = FileVariableModel.create(call);
if (fileVariable == null) return;
@@ -188,36 +186,35 @@ public class BulkFileAttributesReadInspection extends AbstractBaseJavaLocalInspe
if (fileVarName == null) return;
AttributesVariableModel attributesVariable = AttributesVariableModel.create(fileVarName, fileVariable.myScope, anchor);
if (attributesVariable == null) return;
List<String> names =
new VariableNameGenerator(anchor, VariableKind.LOCAL_VARIABLE).byType(attributesVariable.myType).byName(attributesVariable.myName)
.generateAll(true);
String name = names.get(0);
final PsiDeclarationStatement declaration;
PsiReference[] usages = new PsiReference[fileVariable.myAttributeCalls.size() + (attributesVariable.myNeedsTryCatch ? 1 : 0)];
if (!attributesVariable.myNeedsTryCatch) {
declaration =
addDeclaration(parent, anchor, attributesVariable.myName, attributesVariable.myType, attributesVariable.myInitializer);
declaration = addDeclaration(parent, anchor, name, attributesVariable.myType, attributesVariable.myInitializer);
}
else {
declaration = addDeclaration(parent, anchor, attributesVariable.myName, attributesVariable.myType, null);
PsiExpressionStatement assignment = addAssignment(parent, anchor, attributesVariable.myName, attributesVariable.myInitializer);
declaration = addDeclaration(parent, anchor, name, attributesVariable.myType, null);
PsiExpressionStatement assignment = addAssignment(parent, anchor, name, attributesVariable.myInitializer);
assignment = surroundWithTryCatch(assignment);
if (assignment == null) return;
PsiExpression lhs = getLhs(assignment);
if (lhs == null) return;
PsiReference lhsRef = lhs.getReference();
if (lhsRef == null) return;
usages[usages.length - 1] = lhsRef;
}
List<PsiMethodCallExpression> attrCalls = fileVariable.myAttributeCalls;
for (int i = 0; i < attrCalls.size(); i++) {
PsiMethodCallExpression attrCall = attrCalls.get(i);
String replacement = getBulkCallReplacement(attributesVariable.myName, attrCall);
attrCall = (PsiMethodCallExpression)PsiReplacementUtil.replaceExpressionAndShorten(attrCall, replacement, new CommentTracker());
usages[i] = getTopLevelQualifier(attrCall).getReference();
String replacement = getBulkCallReplacement(name, attrCall);
PsiReplacementUtil.replaceExpressionAndShorten(attrCall, replacement, new CommentTracker());
}
if (!myIsOnTheFly) return;
PsiVariable attrsVariable = (PsiVariable)declaration.getDeclaredElements()[0];
HighlightUtils.showRenameTemplate(fileVariable.myScope, attrsVariable, usages);
updater.rename(attrsVariable, names);
}
private static @NotNull PsiExpressionStatement addAssignment(@NotNull PsiElement parent,
@@ -263,14 +260,6 @@ public class BulkFileAttributesReadInspection extends AbstractBaseJavaLocalInspe
return attrsVarName + "." + ATTR_REPLACEMENTS.get(attrMethodName) + "()";
}
private static @NotNull PsiElement getTopLevelQualifier(@NotNull PsiMethodCallExpression methodCall) {
PsiElement qualifier = PsiUtil.skipParenthesizedExprUp(methodCall.getMethodExpression().getQualifier());
while (qualifier instanceof PsiMethodCallExpression call) {
qualifier = PsiUtil.skipParenthesizedExprUp(call.getMethodExpression().getQualifier());
}
return Objects.requireNonNull(qualifier);
}
private static class FileVariableModel {
private final PsiVariable myFileVariable;
private final PsiElement myScope;

View File

@@ -1,8 +1,12 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInspection.javaDoc
import com.intellij.codeInspection.*
import com.intellij.codeInspection.LocalInspectionTool
import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.codeInspection.PsiUpdateModCommandQuickFix
import com.intellij.java.JavaBundle
import com.intellij.modcommand.ModPsiUpdater
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.text.StringUtil
@@ -41,13 +45,13 @@ class ReplaceWithJavadocInspection : LocalInspectionTool() {
}
}
class ReplaceWithJavadocFix : LocalQuickFix {
class ReplaceWithJavadocFix : PsiUpdateModCommandQuickFix() {
override fun getFamilyName(): String {
return JavaBundle.message("inspection.replace.with.javadoc")
}
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
val element = descriptor.psiElement as? PsiComment ?: return
override fun applyFix(project: Project, element: PsiElement, updater: ModPsiUpdater) {
if (element !is PsiComment) return
val method = element.parent ?: return
val child = method.firstChild as? PsiComment ?: return

View File

@@ -5,13 +5,13 @@ import java.nio.file.attribute.BasicFileAttributes;
class Foo {
void printDirectory(File file1, File file2) throws IOException {
BasicFileAttributes readAttributes1 = Files.readAttributes(file1.toPath(), BasicFileAttributes.class);
if (readAttributes1.isDirectory()) {
System.out.println(readAttributes1.size());
BasicFileAttributes fileAttributes = Files.readAttributes(file1.toPath(), BasicFileAttributes.class);
if (fileAttributes.isDirectory()) {
System.out.println(fileAttributes.size());
}
BasicFileAttributes readAttributes = Files.readAttributes(file2.toPath(), BasicFileAttributes.class);
if (readAttributes.isRegularFile()) {
System.out.println(readAttributes.size());
BasicFileAttributes basicFileAttributes = Files.readAttributes(file2.toPath(), BasicFileAttributes.class);
if (basicFileAttributes.isRegularFile()) {
System.out.println(basicFileAttributes.size());
}
}
}

View File

@@ -5,6 +5,7 @@ import com.intellij.codeInsight.Nullability;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightingFeature;
import com.intellij.codeInspection.compiler.JavacQuirksInspectionVisitor;
import com.intellij.codeInspection.dataFlow.NullabilityUtil;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.openapi.diagnostic.Attachment;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
@@ -594,7 +595,7 @@ public class LambdaCanBeMethodReferenceInspection extends AbstractBaseJavaLocalI
return typeElement != null && !typeElement.isInferredType() && PsiTypesUtil.hasTypeAnnotation(typeElement.getType());
}
private static class ReplaceWithMethodRefFix implements LocalQuickFix {
private static class ReplaceWithMethodRefFix extends PsiUpdateModCommandQuickFix {
private final boolean mySafeQualifier;
ReplaceWithMethodRefFix(boolean mayChangeSemantics) {
@@ -615,10 +616,9 @@ public class LambdaCanBeMethodReferenceInspection extends AbstractBaseJavaLocalI
}
@Override
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
PsiElement element = descriptor.getPsiElement();
if (element instanceof PsiLambdaExpression) {
MethodReferenceCandidate methodReferenceCandidate = extractMethodReferenceCandidateExpression(((PsiLambdaExpression)element).getBody());
protected void applyFix(@NotNull Project project, @NotNull PsiElement element, @NotNull ModPsiUpdater updater) {
if (element instanceof PsiLambdaExpression lambda) {
MethodReferenceCandidate methodReferenceCandidate = extractMethodReferenceCandidateExpression(lambda.getBody());
if (methodReferenceCandidate == null) return;
element = methodReferenceCandidate.myExpression;
}