mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-19 13:02:30 +07:00
[java-inspections] More ModCommands (IDEA-322693)
GitOrigin-RevId: 872930704951f58571b072b6c85a5400574029f8
This commit is contained in:
committed by
intellij-monorepo-bot
parent
8d4aecd03f
commit
6b65e3797e
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user