entry : errors.entrySet()) {
+ holder.newProblem(entry.getValue())
+ .range(entry.getKey())
+ .create();
}
}
}
@@ -83,7 +84,9 @@ public void visitAnnotation(@Nonnull PsiAnnotation annotation) {
error.getRange().getEndOffset()
);
}
- holder.registerProblem(value, actualRange, error.getMessage());
+ holder.newProblem(LocalizeValue.of(error.getMessage()))
+ .range(value, actualRange)
+ .create();
}
}
checkMutationContract(annotation, method);
@@ -93,17 +96,19 @@ private void checkMutationContract(PsiAnnotation annotation, PsiMethod method) {
String mutationContract = AnnotationUtil.getStringAttributeValue(annotation, MutationSignature.ATTR_MUTATES);
if (StringUtil.isNotEmpty(mutationContract)) {
boolean pure = Boolean.TRUE.equals(AnnotationUtil.getBooleanAttributeValue(annotation, "pure"));
- String error;
+ LocalizeValue error;
if (pure) {
- error = "Pure method cannot have mutation contract";
+ error = LocalizeValue.localizeTODO("Pure method cannot have mutation contract");
}
else {
error = MutationSignature.checkSignature(mutationContract, method);
}
- if (error != null) {
+ if (error != LocalizeValue.empty()) {
PsiAnnotationMemberValue value = annotation.findAttributeValue(MutationSignature.ATTR_MUTATES);
assert value != null;
- holder.registerProblem(value, error);
+ holder.newProblem(error)
+ .range(value)
+ .create();
}
}
}
@@ -155,15 +160,15 @@ public static ParseException checkContract(PsiMethod method, String text) {
if (!PsiType.BOOLEAN.equals(type) && !type.equalsToText(CommonClassNames.JAVA_LANG_BOOLEAN)) {
LocalizeValue message = LocalizeValue.localizeTODO(
"Contract clause '" + contract + "': parameter #" + (i + 1) + " has '" +
- type.getPresentableText() + "' type (expected boolean)"
+ type.getPresentableText() + "' type (expected boolean)"
);
return ParseException.forConstraint(message, text, clauseIndex, i);
}
break;
}
}
- LocalizeValue problem = LocalizeValue.localizeTODO(contract.getReturnValue().getMethodCompatibilityProblem(method));
- if (problem != null) {
+ LocalizeValue problem = contract.getReturnValue().getMethodCompatibilityProblem(method);
+ if (problem != LocalizeValue.empty()) {
return ParseException.forReturnValue(problem, text, clauseIndex);
}
if (possibleContracts != null) {
diff --git a/plugin/src/main/java/com/intellij/java/impl/codeInspection/dataFlow/EditContractIntention.java b/plugin/src/main/java/com/intellij/java/impl/codeInspection/dataFlow/EditContractIntention.java
index d0b51adc1..42106cdea 100644
--- a/plugin/src/main/java/com/intellij/java/impl/codeInspection/dataFlow/EditContractIntention.java
+++ b/plugin/src/main/java/com/intellij/java/impl/codeInspection/dataFlow/EditContractIntention.java
@@ -12,26 +12,25 @@
import com.intellij.java.language.psi.PsiAnnotation;
import com.intellij.java.language.psi.PsiMethod;
import com.intellij.java.language.psi.PsiModifierListOwner;
+import consulo.annotation.access.RequiredReadAction;
import consulo.annotation.component.ExtensionImpl;
-import consulo.application.ApplicationManager;
import consulo.codeEditor.Editor;
import consulo.language.editor.DaemonCodeAnalyzer;
import consulo.language.editor.intention.BaseIntentionAction;
import consulo.language.editor.intention.IntentionMetaData;
import consulo.language.editor.intention.LowPriorityAction;
-import consulo.language.psi.PsiElement;
import consulo.language.psi.PsiFile;
import consulo.language.util.IncorrectOperationException;
import consulo.localize.LocalizeValue;
import consulo.project.Project;
+import consulo.ui.annotation.RequiredUIAccess;
import consulo.ui.ex.awt.*;
import consulo.ui.ex.awt.event.DocumentAdapter;
import consulo.util.lang.StringUtil;
+import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import org.jetbrains.annotations.Contract;
-import jakarta.annotation.Nonnull;
-
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.*;
@@ -43,172 +42,182 @@
@ExtensionImpl
@IntentionMetaData(ignoreId = "id.EditContractIntention", fileExtensions = "java", categories = {"Java", "Annotations"})
public class EditContractIntention extends BaseIntentionAction implements LowPriorityAction {
- private static final String ourPrompt = "Please specify the contract text" +
- "Example: _, null -> false
" +
- "See intention action description for more details";
-
- public EditContractIntention() {
- setText(LocalizeValue.localizeTODO("Edit method contract"));
- }
-
- @Nullable
- private static PsiMethod getTargetMethod(Editor editor, PsiFile file) {
- final PsiModifierListOwner owner = AddAnnotationPsiFix.getContainer(file, editor.getCaretModel().getOffset(), true);
- if (owner instanceof PsiMethod && ExternalAnnotationsManagerImpl.areExternalAnnotationsApplicable(owner)) {
- PsiElement original = owner.getOriginalElement();
- return original instanceof PsiMethod ? (PsiMethod)original : (PsiMethod)owner;
+ private static final String ourPrompt = "Please specify the contract text
" +
+ "Example: _, null -> false
" +
+ "See intention action description for more details";
+
+ public EditContractIntention() {
+ setText(LocalizeValue.localizeTODO("Edit method contract"));
}
- return null;
- }
-
- @Override
- public boolean isAvailable(@Nonnull Project project, Editor editor, PsiFile file) {
- final PsiMethod method = getTargetMethod(editor, file);
- if (method != null) {
- boolean hasContract = JavaMethodContractUtil.findContractAnnotation(method) != null;
- setText(LocalizeValue.localizeTODO(hasContract ? "Edit method contract of '" + method.getName() + "'" : "Add method contract to '" + method.getName() + "'"));
- return true;
+
+ @Nullable
+ @RequiredReadAction
+ private static PsiMethod getTargetMethod(Editor editor, PsiFile file) {
+ PsiModifierListOwner owner = AddAnnotationPsiFix.getContainer(file, editor.getCaretModel().getOffset(), true);
+ if (owner instanceof PsiMethod ownerMethod && ExternalAnnotationsManagerImpl.areExternalAnnotationsApplicable(owner)) {
+ return owner.getOriginalElement() instanceof PsiMethod originalMethod ? originalMethod : ownerMethod;
+ }
+ return null;
}
- return false;
- }
-
- @Override
- public void invoke(@Nonnull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
- final PsiMethod method = getTargetMethod(editor, file);
- assert method != null;
- PsiAnnotation existingAnno = AnnotationUtil.findAnnotationInHierarchy(method, Collections.singleton(Contract.class.getName()));
- String oldContract = existingAnno == null ? null : AnnotationUtil.getStringAttributeValue(existingAnno, "value");
- boolean oldPure = existingAnno != null && Boolean.TRUE.equals(AnnotationUtil.getBooleanAttributeValue(existingAnno, "pure"));
- String oldMutates = existingAnno == null ? null : AnnotationUtil.getStringAttributeValue(existingAnno, "mutates");
-
- JBTextField contractText = new JBTextField(oldContract);
- JBTextField mutatesText = new JBTextField(oldMutates);
- JCheckBox pureCB = createPureCheckBox(oldPure);
- DialogBuilder builder = createDialog(project, contractText, pureCB, mutatesText);
- DocumentAdapter validator = new DocumentAdapter() {
- @Override
- protected void textChanged(@Nonnull DocumentEvent e) {
- String contractError = getContractErrorMessage(contractText.getText(), method);
- if (contractError != null) {
- builder.setOkActionEnabled(false);
- builder.setErrorText(contractError, contractText);
+
+ @Override
+ @RequiredReadAction
+ public boolean isAvailable(@Nonnull Project project, Editor editor, PsiFile file) {
+ PsiMethod method = getTargetMethod(editor, file);
+ if (method != null) {
+ boolean hasContract = JavaMethodContractUtil.findContractAnnotation(method) != null;
+ setText(LocalizeValue.localizeTODO(
+ hasContract ? "Edit method contract of '" + method.getName() + "'" : "Add method contract to '" + method.getName() + "'"
+ ));
+ return true;
}
- else {
- String mutatesError = getMutatesErrorMessage(mutatesText.getText(), method);
- if (mutatesError != null) {
- builder.setOkActionEnabled(false);
- builder.setErrorText(mutatesError, mutatesText);
- }
- else {
- builder.setOkActionEnabled(true);
- builder.setErrorText(null);
- }
+ return false;
+ }
+
+ @Override
+ @RequiredUIAccess
+ public void invoke(@Nonnull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
+ final PsiMethod method = getTargetMethod(editor, file);
+ assert method != null;
+ PsiAnnotation existingAnno = AnnotationUtil.findAnnotationInHierarchy(method, Collections.singleton(Contract.class.getName()));
+ String oldContract = existingAnno == null ? null : AnnotationUtil.getStringAttributeValue(existingAnno, "value");
+ boolean oldPure = existingAnno != null && Boolean.TRUE.equals(AnnotationUtil.getBooleanAttributeValue(existingAnno, "pure"));
+ String oldMutates = existingAnno == null ? null : AnnotationUtil.getStringAttributeValue(existingAnno, "mutates");
+
+ JBTextField contractText = new JBTextField(oldContract);
+ JBTextField mutatesText = new JBTextField(oldMutates);
+ JCheckBox pureCB = createPureCheckBox(oldPure);
+ DialogBuilder builder = createDialog(project, contractText, pureCB, mutatesText);
+ DocumentAdapter validator = new DocumentAdapter() {
+ @Override
+ protected void textChanged(@Nonnull DocumentEvent e) {
+ String contractError = getContractErrorMessage(contractText.getText(), method);
+ if (contractError != null) {
+ builder.setOkActionEnabled(false);
+ builder.setErrorText(contractError, contractText);
+ }
+ else {
+ LocalizeValue mutatesError = getMutatesErrorMessage(mutatesText.getText(), method);
+ if (mutatesError != LocalizeValue.empty()) {
+ builder.setOkActionEnabled(false);
+ builder.setErrorText(mutatesError.get(), mutatesText);
+ }
+ else {
+ builder.setOkActionEnabled(true);
+ builder.setErrorText(null);
+ }
+ }
+ }
+ };
+ Runnable updateControls = () -> {
+ if (pureCB.isSelected()) {
+ mutatesText.setText("");
+ mutatesText.setEnabled(false);
+ }
+ else {
+ mutatesText.setEnabled(true);
+ }
+ };
+ pureCB.addChangeListener(e -> updateControls.run());
+ contractText.getDocument().addDocumentListener(validator);
+ mutatesText.getDocument().addDocumentListener(validator);
+ updateControls.run();
+ if (builder.showAndGet()) {
+ updateContract(method, contractText.getText(), pureCB.isSelected(), mutatesText.getText());
}
- }
- };
- Runnable updateControls = () -> {
- if (pureCB.isSelected()) {
- mutatesText.setText("");
- mutatesText.setEnabled(false);
- }
- else {
- mutatesText.setEnabled(true);
- }
- };
- pureCB.addChangeListener(e -> updateControls.run());
- contractText.getDocument().addDocumentListener(validator);
- mutatesText.getDocument().addDocumentListener(validator);
- updateControls.run();
- if (builder.showAndGet()) {
- updateContract(method, contractText.getText(), pureCB.isSelected(), mutatesText.getText());
}
- }
-
- private static DialogBuilder createDialog(@Nonnull Project project,
- JBTextField contractText,
- JCheckBox pureCB,
- JBTextField mutatesText) {
- JPanel panel = new JPanel(new GridBagLayout());
-
- GridBagConstraints constraints =
- new GridBagConstraints(0, 0, 2, 1, 4.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, JBUI.insets(2), 0, 0);
- panel.add(Messages.configureMessagePaneUi(new JTextPane(), ourPrompt), constraints);
- constraints.gridx = 0;
- constraints.gridy = 1;
- constraints.gridwidth = 1;
- constraints.weightx = 1;
- JLabel contractLabel = new JLabel("Contract:");
- contractLabel.setDisplayedMnemonic('c');
- contractLabel.setLabelFor(contractText);
- panel.add(contractLabel, constraints);
- constraints.gridx = 1;
- constraints.weightx = 3;
- panel.add(contractText, constraints);
- constraints.gridx = 0;
- constraints.gridy = 2;
- constraints.gridwidth = 2;
- constraints.weightx = 4;
- panel.add(pureCB, constraints);
- panel.add(pureCB, constraints);
- if (ApplicationManager.getApplication().isInternal()) {
- constraints.gridx = 0;
- constraints.gridy = 3;
- constraints.weightx = 1;
- constraints.gridwidth = 1;
- JLabel mutatesLabel = new JLabel("Mutates:");
- mutatesLabel.setDisplayedMnemonic('m');
- mutatesLabel.setLabelFor(mutatesText);
- panel.add(mutatesLabel, constraints);
- constraints.gridx = 1;
- constraints.weightx = 3;
- panel.add(mutatesText, constraints);
+
+ private static DialogBuilder createDialog(
+ @Nonnull Project project,
+ JBTextField contractText,
+ JCheckBox pureCB,
+ JBTextField mutatesText
+ ) {
+ JPanel panel = new JPanel(new GridBagLayout());
+
+ GridBagConstraints constraints =
+ new GridBagConstraints(0, 0, 2, 1, 4.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, JBUI.insets(2), 0, 0);
+ panel.add(Messages.configureMessagePaneUi(new JTextPane(), ourPrompt), constraints);
+ constraints.gridx = 0;
+ constraints.gridy = 1;
+ constraints.gridwidth = 1;
+ constraints.weightx = 1;
+ JLabel contractLabel = new JLabel("Contract:");
+ contractLabel.setDisplayedMnemonic('c');
+ contractLabel.setLabelFor(contractText);
+ panel.add(contractLabel, constraints);
+ constraints.gridx = 1;
+ constraints.weightx = 3;
+ panel.add(contractText, constraints);
+ constraints.gridx = 0;
+ constraints.gridy = 2;
+ constraints.gridwidth = 2;
+ constraints.weightx = 4;
+ panel.add(pureCB, constraints);
+ panel.add(pureCB, constraints);
+ if (project.getApplication().isInternal()) {
+ constraints.gridx = 0;
+ constraints.gridy = 3;
+ constraints.weightx = 1;
+ constraints.gridwidth = 1;
+ JLabel mutatesLabel = new JLabel("Mutates:");
+ mutatesLabel.setDisplayedMnemonic('m');
+ mutatesLabel.setLabelFor(mutatesText);
+ panel.add(mutatesLabel, constraints);
+ constraints.gridx = 1;
+ constraints.weightx = 3;
+ panel.add(mutatesText, constraints);
+ }
+
+ DialogBuilder builder = new DialogBuilder(project).setNorthPanel(panel).title("Edit Method Contract");
+ builder.setPreferredFocusComponent(contractText);
+ builder.setHelpId("define_contract_dialog");
+ return builder;
+ }
+
+ private static JCheckBox createPureCheckBox(boolean selected) {
+ JCheckBox pureCB = new NonFocusableCheckBox("Method is pure (has no side effects)");
+ pureCB.setMnemonic('p');
+ pureCB.setSelected(selected);
+ return pureCB;
+ }
+
+ private static void updateContract(PsiMethod method, String contract, boolean pure, String mutates) {
+ Project project = method.getProject();
+ ExternalAnnotationsManager manager = ExternalAnnotationsManager.getInstance(project);
+ manager.deannotate(method, JavaMethodContractUtil.ORG_JETBRAINS_ANNOTATIONS_CONTRACT);
+ PsiAnnotation mockAnno = DefaultInferredAnnotationProvider.createContractAnnotation(project, pure, contract, mutates);
+ if (mockAnno != null) {
+ try {
+ manager.annotateExternally(
+ method,
+ JavaMethodContractUtil.ORG_JETBRAINS_ANNOTATIONS_CONTRACT,
+ method.getContainingFile(),
+ mockAnno.getParameterList().getAttributes()
+ );
+ }
+ catch (ExternalAnnotationsManager.CanceledConfigurationException ignored) {
+ }
+ }
+ DaemonCodeAnalyzer.getInstance(project).restart();
}
- DialogBuilder builder = new DialogBuilder(project).setNorthPanel(panel).title("Edit Method Contract");
- builder.setPreferredFocusComponent(contractText);
- builder.setHelpId("define_contract_dialog");
- return builder;
- }
-
- private static JCheckBox createPureCheckBox(boolean selected) {
- JCheckBox pureCB = new NonFocusableCheckBox("Method is pure (has no side effects)");
- pureCB.setMnemonic('p');
- pureCB.setSelected(selected);
- return pureCB;
- }
-
- private static void updateContract(PsiMethod method, String contract, boolean pure, String mutates) {
- Project project = method.getProject();
- ExternalAnnotationsManager manager = ExternalAnnotationsManager.getInstance(project);
- manager.deannotate(method, JavaMethodContractUtil.ORG_JETBRAINS_ANNOTATIONS_CONTRACT);
- PsiAnnotation mockAnno = DefaultInferredAnnotationProvider.createContractAnnotation(project, pure, contract, mutates);
- if (mockAnno != null) {
- try {
- manager.annotateExternally(method, JavaMethodContractUtil.ORG_JETBRAINS_ANNOTATIONS_CONTRACT, method.getContainingFile(),
- mockAnno.getParameterList().getAttributes());
- }
- catch (ExternalAnnotationsManager.CanceledConfigurationException ignored) {
- }
+ @Nonnull
+ private static LocalizeValue getMutatesErrorMessage(String mutates, PsiMethod method) {
+ return StringUtil.isEmpty(mutates) ? LocalizeValue.empty() : MutationSignature.checkSignature(mutates, method);
}
- DaemonCodeAnalyzer.getInstance(project).restart();
- }
-
- @Nullable
- private static String getMutatesErrorMessage(String mutates, PsiMethod method) {
- return StringUtil.isEmpty(mutates) ? null : MutationSignature.checkSignature(mutates, method);
- }
-
- @Nullable
- private static String getContractErrorMessage(String contract, PsiMethod method) {
- if (StringUtil.isEmpty(contract)) {
- return null;
+
+ @Nullable
+ private static String getContractErrorMessage(String contract, PsiMethod method) {
+ if (StringUtil.isEmpty(contract)) {
+ return null;
+ }
+ StandardMethodContract.ParseException error = ContractInspection.checkContract(method, contract);
+ return error != null ? error.getMessage() : null;
+ }
+
+ @Override
+ public boolean startInWriteAction() {
+ return false;
}
- StandardMethodContract.ParseException error = ContractInspection.checkContract(method, contract);
- return error != null ? error.getMessage() : null;
- }
-
- @Override
- public boolean startInWriteAction() {
- return false;
- }
}
diff --git a/plugin/src/main/java/com/intellij/java/impl/codeInspection/defUse/DefUseInspectionBase.java b/plugin/src/main/java/com/intellij/java/impl/codeInspection/defUse/DefUseInspectionBase.java
index e519b350a..abc56b13b 100644
--- a/plugin/src/main/java/com/intellij/java/impl/codeInspection/defUse/DefUseInspectionBase.java
+++ b/plugin/src/main/java/com/intellij/java/impl/codeInspection/defUse/DefUseInspectionBase.java
@@ -29,7 +29,6 @@
import consulo.localize.LocalizeValue;
import consulo.ui.ex.awt.JBUI;
import jakarta.annotation.Nonnull;
-import org.jetbrains.annotations.NonNls;
import javax.swing.*;
import java.awt.*;
@@ -39,208 +38,204 @@
import java.util.Set;
public abstract class DefUseInspectionBase extends BaseJavaBatchLocalInspectionTool {
- public boolean REPORT_PREFIX_EXPRESSIONS = false;
- public boolean REPORT_POSTFIX_EXPRESSIONS = true;
- public boolean REPORT_REDUNDANT_INITIALIZER = true;
-
- @NonNls
- public static final String SHORT_NAME = "UnusedAssignment";
-
- @Override
- @Nonnull
- public PsiElementVisitor buildVisitorImpl(@Nonnull final ProblemsHolder holder,
- final boolean isOnTheFly,
- LocalInspectionToolSession session,
- Object state) {
- return new JavaElementVisitor() {
- @Override
- @RequiredReadAction
- public void visitMethod(PsiMethod method) {
- checkCodeBlock(method.getBody(), holder, isOnTheFly);
- }
-
- @Override
- public void visitClassInitializer(PsiClassInitializer initializer) {
- checkCodeBlock(initializer.getBody(), holder, isOnTheFly);
- }
- };
- }
-
- @RequiredReadAction
- private void checkCodeBlock(
- final PsiCodeBlock body,
- final ProblemsHolder holder,
- final boolean isOnTheFly
- ) {
- if (body == null) return;
- final Set usedVariables = new HashSet<>();
- List unusedDefs = DefUseUtil.getUnusedDefs(body, usedVariables);
-
- if (unusedDefs != null && !unusedDefs.isEmpty()) {
- Collections.sort(
- unusedDefs,
- (o1, o2) -> {
- int offset1 = o1.getContext().getTextOffset();
- int offset2 = o2.getContext().getTextOffset();
-
- if (offset1 == offset2) return 0;
- if (offset1 < offset2) return -1;
-
- return 1;
- }
- );
-
- for (DefUseUtil.Info info : unusedDefs) {
- PsiElement context = info.getContext();
- PsiVariable psiVariable = info.getVariable();
-
- if (context instanceof PsiDeclarationStatement || context instanceof PsiResourceVariable) {
- if (!info.isRead()) {
- if (!isOnTheFly) {
- holder.registerProblem(
- psiVariable.getNameIdentifier(),
- InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor1("#ref #loc").get(),
- ProblemHighlightType.LIKE_UNUSED_SYMBOL
- );
+ public boolean REPORT_PREFIX_EXPRESSIONS = false;
+ public boolean REPORT_POSTFIX_EXPRESSIONS = true;
+ public boolean REPORT_REDUNDANT_INITIALIZER = true;
+
+ public static final String SHORT_NAME = "UnusedAssignment";
+
+ @Override
+ @Nonnull
+ public PsiElementVisitor buildVisitorImpl(
+ @Nonnull final ProblemsHolder holder,
+ final boolean isOnTheFly,
+ LocalInspectionToolSession session,
+ Object state
+ ) {
+ return new JavaElementVisitor() {
+ @Override
+ @RequiredReadAction
+ public void visitMethod(@Nonnull PsiMethod method) {
+ checkCodeBlock(method.getBody(), holder, isOnTheFly);
}
- } else {
- if (REPORT_REDUNDANT_INITIALIZER) {
- holder.registerProblem(
- psiVariable.getInitializer(),
- InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor2(
- "" + psiVariable.getName() + "",
- "#ref #loc"
- ).get(),
- ProblemHighlightType.LIKE_UNUSED_SYMBOL,
- createRemoveInitializerFix()
- );
+
+ @Override
+ @RequiredReadAction
+ public void visitClassInitializer(@Nonnull PsiClassInitializer initializer) {
+ checkCodeBlock(initializer.getBody(), holder, isOnTheFly);
}
- }
- } else if (context instanceof PsiAssignmentExpression assignment) {
- holder.registerProblem(
- assignment.getLExpression(),
- InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor3(
- assignment.getRExpression().getText(),
- "#ref" + " #loc"
- ).get(),
- ProblemHighlightType.LIKE_UNUSED_SYMBOL
- );
- } else {
- if (context instanceof PsiPrefixExpression && REPORT_PREFIX_EXPRESSIONS ||
- context instanceof PsiPostfixExpression && REPORT_POSTFIX_EXPRESSIONS) {
- holder.registerProblem(
- context,
- InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor4("#ref #loc").get()
- );
- }
- }
- }
+ };
}
- body.accept(new JavaRecursiveElementWalkingVisitor() {
- @Override
- public void visitClass(PsiClass aClass) {
- }
-
- @Override
- public void visitLocalVariable(PsiLocalVariable variable) {
- if (!usedVariables.contains(variable) && variable.getInitializer() == null && !isOnTheFly) {
- holder.registerProblem(
- variable.getNameIdentifier(),
- InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor5("#ref #loc").get(),
- ProblemHighlightType.LIKE_UNUSED_SYMBOL
- );
+ @RequiredReadAction
+ private void checkCodeBlock(PsiCodeBlock body, final ProblemsHolder holder, final boolean isOnTheFly) {
+ if (body == null) {
+ return;
}
- }
-
- @Override
- @RequiredReadAction
- public void visitAssignmentExpression(PsiAssignmentExpression expression) {
- PsiExpression lExpression = expression.getLExpression();
- PsiExpression rExpression = expression.getRExpression();
-
- if (lExpression instanceof PsiReferenceExpression lRef && rExpression instanceof PsiReferenceExpression rRef) {
- if (lRef.resolve() != rRef.resolve()) return;
- PsiExpression lQualifier = lRef.getQualifierExpression();
- PsiExpression rQualifier = rRef.getQualifierExpression();
-
- if ((lQualifier == null && rQualifier == null ||
- lQualifier instanceof PsiThisExpression && rQualifier instanceof PsiThisExpression ||
- lQualifier instanceof PsiThisExpression && rQualifier == null ||
- lQualifier == null && rQualifier instanceof PsiThisExpression) && !isOnTheFly) {
- holder.registerProblem(
- expression,
- InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor6("#ref").get()
+ final Set usedVariables = new HashSet<>();
+ List unusedDefs = DefUseUtil.getUnusedDefs(body, usedVariables);
+
+ if (unusedDefs != null && !unusedDefs.isEmpty()) {
+ Collections.sort(
+ unusedDefs,
+ (o1, o2) -> {
+ int offset1 = o1.getContext().getTextOffset();
+ int offset2 = o2.getContext().getTextOffset();
+
+ if (offset1 == offset2) {
+ return 0;
+ }
+ if (offset1 < offset2) {
+ return -1;
+ }
+
+ return 1;
+ }
);
- }
+
+ for (DefUseUtil.Info info : unusedDefs) {
+ PsiElement context = info.getContext();
+ PsiVariable psiVariable = info.getVariable();
+
+ if (context instanceof PsiDeclarationStatement || context instanceof PsiResourceVariable) {
+ if (!info.isRead()) {
+ if (!isOnTheFly) {
+ holder.newProblem(InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor1("#ref #loc"))
+ .range(psiVariable.getNameIdentifier())
+ .highlightType(ProblemHighlightType.LIKE_UNUSED_SYMBOL)
+ .create();
+ }
+ }
+ else if (REPORT_REDUNDANT_INITIALIZER) {
+ holder.newProblem(InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor2(
+ "" + psiVariable.getName() + "",
+ "#ref #loc"
+ ))
+ .range(psiVariable.getInitializer())
+ .highlightType(ProblemHighlightType.LIKE_UNUSED_SYMBOL)
+ .withFix(createRemoveInitializerFix())
+ .create();
+ }
+ }
+ else if (context instanceof PsiAssignmentExpression assignment) {
+ holder.newProblem(InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor3(
+ assignment.getRExpression().getText(),
+ "#ref" + " #loc"
+ ))
+ .range(assignment.getLExpression())
+ .highlightType(ProblemHighlightType.LIKE_UNUSED_SYMBOL)
+ .create();
+ }
+ else if (context instanceof PsiPrefixExpression && REPORT_PREFIX_EXPRESSIONS
+ || context instanceof PsiPostfixExpression && REPORT_POSTFIX_EXPRESSIONS) {
+ holder.newProblem(InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor4("#ref #loc"))
+ .range(context)
+ .create();
+ }
+ }
}
- }
- });
- }
-
- protected LocalQuickFix createRemoveInitializerFix() {
- return null;
- }
-
- @Override
- public JComponent createOptionsPanel() {
- return new OptionsPanel();
- }
-
- private class OptionsPanel extends JPanel {
- private final JCheckBox myReportPrefix;
- private final JCheckBox myReportPostfix;
- private final JCheckBox myReportInitializer;
-
- private OptionsPanel() {
- super(new GridBagLayout());
-
- GridBagConstraints gc = new GridBagConstraints();
- gc.weighty = 0;
- gc.weightx = 1;
- gc.fill = GridBagConstraints.HORIZONTAL;
- gc.anchor = GridBagConstraints.NORTHWEST;
-
- myReportInitializer = new JCheckBox(InspectionLocalize.inspectionUnusedAssignmentOption2().get());
- myReportInitializer.setSelected(REPORT_REDUNDANT_INITIALIZER);
- myReportInitializer.getModel().addChangeListener(e -> REPORT_REDUNDANT_INITIALIZER = myReportInitializer.isSelected());
- gc.insets = JBUI.insetsBottom(15);
- gc.gridy = 0;
- add(myReportInitializer, gc);
-
- myReportPrefix = new JCheckBox(InspectionLocalize.inspectionUnusedAssignmentOption().get());
- myReportPrefix.setSelected(REPORT_PREFIX_EXPRESSIONS);
- myReportPrefix.getModel().addChangeListener(e -> REPORT_PREFIX_EXPRESSIONS = myReportPrefix.isSelected());
- gc.insets = JBUI.emptyInsets();
- gc.gridy++;
- add(myReportPrefix, gc);
-
- myReportPostfix = new JCheckBox(InspectionLocalize.inspectionUnusedAssignmentOption1().get());
- myReportPostfix.setSelected(REPORT_POSTFIX_EXPRESSIONS);
- myReportPostfix.getModel().addChangeListener(e-> REPORT_POSTFIX_EXPRESSIONS = myReportPostfix.isSelected());
-
- gc.weighty = 1;
- gc.gridy++;
- add(myReportPostfix, gc);
+
+ body.accept(new JavaRecursiveElementWalkingVisitor() {
+ @Override
+ public void visitClass(@Nonnull PsiClass aClass) {
+ }
+
+ @Override
+ public void visitLocalVariable(@Nonnull PsiLocalVariable variable) {
+ if (!usedVariables.contains(variable) && variable.getInitializer() == null && !isOnTheFly) {
+ holder.newProblem(InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor5("#ref #loc"))
+ .range(variable.getNameIdentifier())
+ .highlightType(ProblemHighlightType.LIKE_UNUSED_SYMBOL)
+ .create();
+ }
+ }
+
+ @Override
+ @RequiredReadAction
+ public void visitAssignmentExpression(@Nonnull PsiAssignmentExpression expression) {
+ if (expression.getLExpression() instanceof PsiReferenceExpression lRef
+ && expression.getRExpression() instanceof PsiReferenceExpression rRef) {
+ if (lRef.resolve() != rRef.resolve()) {
+ return;
+ }
+ PsiExpression lQualifier = lRef.getQualifierExpression();
+ PsiExpression rQualifier = rRef.getQualifierExpression();
+
+ if ((lQualifier == null && rQualifier == null
+ || lQualifier instanceof PsiThisExpression && rQualifier instanceof PsiThisExpression
+ || lQualifier instanceof PsiThisExpression && rQualifier == null
+ || lQualifier == null && rQualifier instanceof PsiThisExpression) && !isOnTheFly) {
+ holder.newProblem(InspectionLocalize.inspectionUnusedAssignmentProblemDescriptor6("#ref"))
+ .range(expression)
+ .create();
+ }
+ }
+ }
+ });
+ }
+
+ protected LocalQuickFix createRemoveInitializerFix() {
+ return null;
+ }
+
+ @Override
+ public JComponent createOptionsPanel() {
+ return new OptionsPanel();
+ }
+
+ private class OptionsPanel extends JPanel {
+ private final JCheckBox myReportPrefix;
+ private final JCheckBox myReportPostfix;
+ private final JCheckBox myReportInitializer;
+
+ private OptionsPanel() {
+ super(new GridBagLayout());
+
+ GridBagConstraints gc = new GridBagConstraints();
+ gc.weighty = 0;
+ gc.weightx = 1;
+ gc.fill = GridBagConstraints.HORIZONTAL;
+ gc.anchor = GridBagConstraints.NORTHWEST;
+
+ myReportInitializer = new JCheckBox(InspectionLocalize.inspectionUnusedAssignmentOption2().get());
+ myReportInitializer.setSelected(REPORT_REDUNDANT_INITIALIZER);
+ myReportInitializer.getModel().addChangeListener(e -> REPORT_REDUNDANT_INITIALIZER = myReportInitializer.isSelected());
+ gc.insets = JBUI.insetsBottom(15);
+ gc.gridy = 0;
+ add(myReportInitializer, gc);
+
+ myReportPrefix = new JCheckBox(InspectionLocalize.inspectionUnusedAssignmentOption().get());
+ myReportPrefix.setSelected(REPORT_PREFIX_EXPRESSIONS);
+ myReportPrefix.getModel().addChangeListener(e -> REPORT_PREFIX_EXPRESSIONS = myReportPrefix.isSelected());
+ gc.insets = JBUI.emptyInsets();
+ gc.gridy++;
+ add(myReportPrefix, gc);
+
+ myReportPostfix = new JCheckBox(InspectionLocalize.inspectionUnusedAssignmentOption1().get());
+ myReportPostfix.setSelected(REPORT_POSTFIX_EXPRESSIONS);
+ myReportPostfix.getModel().addChangeListener(e -> REPORT_POSTFIX_EXPRESSIONS = myReportPostfix.isSelected());
+
+ gc.weighty = 1;
+ gc.gridy++;
+ add(myReportPostfix, gc);
+ }
+ }
+
+ @Nonnull
+ @Override
+ public LocalizeValue getDisplayName() {
+ return InspectionLocalize.inspectionUnusedAssignmentDisplayName();
+ }
+
+ @Nonnull
+ @Override
+ public LocalizeValue getGroupDisplayName() {
+ return InspectionLocalize.groupNamesProbableBugs();
+ }
+
+ @Nonnull
+ @Override
+ public String getShortName() {
+ return SHORT_NAME;
}
- }
-
-
- @Override
- @Nonnull
- public LocalizeValue getDisplayName() {
- return InspectionLocalize.inspectionUnusedAssignmentDisplayName();
- }
-
- @Override
- @Nonnull
- public LocalizeValue getGroupDisplayName() {
- return InspectionLocalize.groupNamesProbableBugs();
- }
-
- @Override
- @Nonnull
- public String getShortName() {
- return SHORT_NAME;
- }
}
\ No newline at end of file
diff --git a/plugin/src/main/java/com/intellij/java/impl/codeInspection/duplicateStringLiteral/DuplicateStringLiteralInspection.java b/plugin/src/main/java/com/intellij/java/impl/codeInspection/duplicateStringLiteral/DuplicateStringLiteralInspection.java
index 6d4eaf1b8..d0d4a4936 100644
--- a/plugin/src/main/java/com/intellij/java/impl/codeInspection/duplicateStringLiteral/DuplicateStringLiteralInspection.java
+++ b/plugin/src/main/java/com/intellij/java/impl/codeInspection/duplicateStringLiteral/DuplicateStringLiteralInspection.java
@@ -54,7 +54,6 @@
import consulo.util.lang.StringUtil;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
-import org.jetbrains.annotations.NonNls;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
@@ -67,7 +66,7 @@ public class DuplicateStringLiteralInspection extends BaseLocalInspectionTool {
public int MIN_STRING_LENGTH = 5;
@SuppressWarnings({"WeakerAccess"})
public boolean IGNORE_PROPERTY_KEYS = false;
- @NonNls
+
private static final String BR = "
";
@Override
@@ -80,11 +79,12 @@ public PsiElementVisitor buildVisitorImpl(
) {
return new JavaElementVisitor() {
@Override
- public void visitReferenceExpression(@Nonnull final PsiReferenceExpression expression) {
+ public void visitReferenceExpression(@Nonnull PsiReferenceExpression expression) {
visitExpression(expression);
}
@Override
+ @RequiredReadAction
public void visitLiteralExpression(@Nonnull PsiLiteralExpression expression) {
checkStringLiteralExpression(expression, holder, isOnTheFly);
}
@@ -111,39 +111,37 @@ public String getShortName() {
@RequiredReadAction
private void checkStringLiteralExpression(
- @Nonnull final PsiLiteralExpression originalExpression,
+ @Nonnull PsiLiteralExpression originalExpression,
@Nonnull ProblemsHolder holder,
- final boolean isOnTheFly
+ boolean isOnTheFly
) {
- Object value = originalExpression.getValue();
- if (!(value instanceof String)) {
+ if (!(originalExpression.getValue() instanceof String stringToFind)) {
return;
}
- final Project project = holder.getProject();
+ Project project = holder.getProject();
if (!shouldCheck(project, originalExpression)) {
return;
}
- final String stringToFind = (String) value;
if (stringToFind.isEmpty()) {
return;
}
- final GlobalSearchScope scope = GlobalSearchScope.projectScope(originalExpression.getProject());
- final PsiSearchHelper searchHelper = PsiSearchHelper.SERVICE.getInstance(holder.getFile().getProject());
- final List words = StringUtil.getWordsIn(stringToFind);
+ GlobalSearchScope scope = GlobalSearchScope.projectScope(originalExpression.getProject());
+ PsiSearchHelper searchHelper = PsiSearchHelper.SERVICE.getInstance(holder.getFile().getProject());
+ List words = StringUtil.getWordsIn(stringToFind);
if (words.isEmpty()) {
return;
}
// put longer strings first
Collections.sort(words, (o1, o2) -> o2.length() - o1.length());
- final ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator();
+ ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator();
Set resultFiles = null;
for (String word : words) {
if (word.length() < MIN_STRING_LENGTH) {
continue;
}
progress.checkCanceled();
- final Set files = new HashSet<>();
+ Set files = new HashSet<>();
searchHelper.processAllFilesWithWordInLiterals(word, scope, new CommonProcessors.CollectProcessor<>(files));
if (resultFiles == null) {
resultFiles = files;
@@ -159,9 +157,9 @@ private void checkStringLiteralExpression(
if (resultFiles == null || resultFiles.isEmpty()) {
return;
}
- final List foundExpr = new ArrayList<>();
+ List foundExpr = new ArrayList<>();
- for (final PsiFile file : resultFiles) {
+ for (PsiFile file : resultFiles) {
progress.checkCanceled();
FileViewProvider viewProvider = file.getViewProvider();
// important: skip non-java files with given word in literal (IDEA-126201)
@@ -171,20 +169,26 @@ private void checkStringLiteralExpression(
CharSequence text = viewProvider.getContents();
StringSearcher searcher = new StringSearcher(stringToFind, true, true);
- LowLevelSearchUtil.processTextOccurrences(text, 0, text.length(), searcher, progress, offset -> {
- PsiElement element = file.findElementAt(offset);
- if (element == null || !(element.getParent() instanceof PsiLiteralExpression)) {
+ LowLevelSearchUtil.processTextOccurrences(
+ text,
+ 0,
+ text.length(),
+ searcher,
+ progress,
+ offset -> {
+ PsiElement element = file.findElementAt(offset);
+ if (element == null || !(element.getParent() instanceof PsiLiteralExpression)) {
+ return true;
+ }
+ PsiLiteralExpression expression = (PsiLiteralExpression) element.getParent();
+ if (expression != originalExpression
+ && Comparing.equal(stringToFind, expression.getValue())
+ && shouldCheck(project, expression)) {
+ foundExpr.add(expression);
+ }
return true;
}
- PsiLiteralExpression expression = (PsiLiteralExpression) element.getParent();
- if (expression != originalExpression && Comparing.equal(
- stringToFind,
- expression.getValue()
- ) && shouldCheck(project, expression)) {
- foundExpr.add(expression);
- }
- return true;
- });
+ );
}
if (foundExpr.isEmpty()) {
return;
@@ -211,13 +215,16 @@ private void checkStringLiteralExpression(
String classList;
if (isOnTheFly) {
- classList = StringUtil.join(tenClassesMost, aClass -> {
- final boolean thisFile = aClass.getContainingFile() == originalExpression.getContainingFile();
- //noinspection HardCodedStringLiteral
- return " '" + aClass.getQualifiedName() + "'" +
- (thisFile ? " " + InspectionLocalize.inspectionDuplicatesMessageInThisFile().get()
- : "");
- }, ", " + BR);
+ classList = StringUtil.join(
+ tenClassesMost,
+ aClass -> {
+ boolean thisFile = aClass.getContainingFile() == originalExpression.getContainingFile();
+ //noinspection HardCodedStringLiteral
+ return " '" + aClass.getQualifiedName() + "'" +
+ (thisFile ? " " + InspectionLocalize.inspectionDuplicatesMessageInThisFile() : "");
+ },
+ ", " + BR
+ );
}
else {
classList = StringUtil.join(tenClassesMost, aClass -> "'" + aClass.getQualifiedName() + "'", ", ");
@@ -227,16 +234,16 @@ private void checkStringLiteralExpression(
classList += BR + InspectionLocalize.inspectionDuplicatesMessageMore(classes.size() - 10).get();
}
- String msg = InspectionLocalize.inspectionDuplicatesMessage(classList).get();
-
Collection fixes = new SmartList<>();
if (isOnTheFly) {
- final LocalQuickFix introduceConstFix = createIntroduceConstFix(foundExpr, originalExpression);
+ LocalQuickFix introduceConstFix = createIntroduceConstFix(foundExpr, originalExpression);
fixes.add(introduceConstFix);
}
createReplaceFixes(foundExpr, originalExpression, fixes);
- LocalQuickFix[] array = fixes.toArray(new LocalQuickFix[fixes.size()]);
- holder.registerProblem(originalExpression, msg, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, array);
+ holder.newProblem(InspectionLocalize.inspectionDuplicatesMessage(classList))
+ .range(originalExpression)
+ .withFixes(fixes)
+ .create();
}
private boolean shouldCheck(@Nonnull Project project, @Nonnull PsiLiteralExpression expression) {
@@ -245,23 +252,20 @@ private boolean shouldCheck(@Nonnull Project project, @Nonnull PsiLiteralExpress
}
private static void createReplaceFixes(
- final List foundExpr,
- final PsiLiteralExpression originalExpression,
- final Collection fixes
+ List foundExpr,
+ PsiLiteralExpression originalExpression,
+ Collection fixes
) {
Set constants = new HashSet<>();
for (Iterator iterator = foundExpr.iterator(); iterator.hasNext(); ) {
PsiExpression expression1 = iterator.next();
- PsiElement parent = expression1.getParent();
- if (parent instanceof PsiField field) {
- if (field.getInitializer() == expression1 && field.hasModifierProperty(PsiModifier.STATIC)) {
- constants.add(field);
- iterator.remove();
- }
+ if (expression1.getParent() instanceof PsiField field && field.getInitializer() == expression1 && field.isStatic()) {
+ constants.add(field);
+ iterator.remove();
}
}
- for (final PsiField constant : constants) {
- final PsiClass containingClass = constant.getContainingClass();
+ for (PsiField constant : constants) {
+ PsiClass containingClass = constant.getContainingClass();
if (containingClass == null) {
continue;
}
@@ -270,16 +274,13 @@ private static void createReplaceFixes(
if (!isAccessible && containingClass.getQualifiedName() == null) {
continue;
}
- final LocalQuickFix replaceQuickFix = new ReplaceFix(constant, originalExpression);
+ LocalQuickFix replaceQuickFix = new ReplaceFix(constant, originalExpression);
fixes.add(replaceQuickFix);
}
}
- private static LocalQuickFix createIntroduceConstFix(
- final List foundExpr,
- final PsiLiteralExpression originalExpression
- ) {
- final PsiExpression[] expressions = foundExpr.toArray(new PsiExpression[foundExpr.size() + 1]);
+ private static LocalQuickFix createIntroduceConstFix(List foundExpr, PsiLiteralExpression originalExpression) {
+ PsiExpression[] expressions = foundExpr.toArray(new PsiExpression[foundExpr.size() + 1]);
expressions[foundExpr.size()] = originalExpression;
return new IntroduceLiteralConstantFix(expressions);
@@ -287,17 +288,15 @@ private static LocalQuickFix createIntroduceConstFix(
@Nullable
@RequiredWriteAction
- private static PsiReferenceExpression createReferenceTo(
- final PsiField constant,
- final PsiLiteralExpression context
- ) throws IncorrectOperationException {
+ private static PsiReferenceExpression createReferenceTo(PsiField constant, PsiLiteralExpression context)
+ throws IncorrectOperationException {
PsiElementFactory factory = JavaPsiFacade.getInstance(constant.getProject()).getElementFactory();
PsiReferenceExpression reference = (PsiReferenceExpression) factory.createExpressionFromText(constant.getName(), context);
if (reference.isReferenceTo(constant)) {
return reference;
}
reference = (PsiReferenceExpression) factory.createExpressionFromText("XXX." + constant.getName(), null);
- final PsiReferenceExpression classQualifier = (PsiReferenceExpression) reference.getQualifierExpression();
+ PsiReferenceExpression classQualifier = (PsiReferenceExpression) reference.getQualifierExpression();
PsiClass containingClass = constant.getContainingClass();
if (containingClass.getQualifiedName() == null) {
return null;
@@ -322,7 +321,7 @@ public JComponent createOptionsPanel() {
.addActionListener(e -> IGNORE_PROPERTY_KEYS = optionsPanel.myIgnorePropertyKeyExpressions.isSelected());
optionsPanel.myMinStringLengthField.getDocument().addDocumentListener(new DocumentAdapter() {
@Override
- protected void textChanged(final DocumentEvent e) {
+ protected void textChanged(DocumentEvent e) {
try {
MIN_STRING_LENGTH = Integer.parseInt(optionsPanel.myMinStringLengthField.getText());
}
@@ -344,7 +343,7 @@ public static class OptionsPanel {
private static class IntroduceLiteralConstantFix implements LocalQuickFix {
private final SmartPsiElementPointer[] myExpressions;
- public IntroduceLiteralConstantFix(final PsiExpression[] expressions) {
+ public IntroduceLiteralConstantFix(PsiExpression[] expressions) {
myExpressions = new SmartPsiElementPointer[expressions.length];
for (int i = 0; i < expressions.length; i++) {
PsiExpression expression = expressions[i];
@@ -360,20 +359,20 @@ public LocalizeValue getName() {
}
@Override
- public void applyFix(@Nonnull final Project project, @Nonnull ProblemDescriptor descriptor) {
+ public void applyFix(@Nonnull Project project, @Nonnull ProblemDescriptor descriptor) {
SwingUtilities.invokeLater(() -> {
if (project.isDisposed()) {
return;
}
- final List expressions = new ArrayList<>();
+ List expressions = new ArrayList<>();
for (SmartPsiElementPointer ptr : myExpressions) {
- final PsiElement element = ptr.getElement();
+ PsiElement element = ptr.getElement();
if (element != null) {
expressions.add((PsiExpression) element);
}
}
final PsiExpression[] expressionArray = expressions.toArray(new PsiExpression[expressions.size()]);
- final IntroduceConstantHandlerImpl handler = new IntroduceConstantHandlerImpl() {
+ IntroduceConstantHandlerImpl handler = new IntroduceConstantHandlerImpl() {
@Override
protected OccurrenceManager createOccurrenceManager(PsiExpression selectedExpr, PsiClass parentClass) {
final OccurrenceFilter filter = occurrence -> true;
@@ -425,14 +424,14 @@ public void invoke(
@Nonnull PsiElement startElement,
@Nonnull PsiElement endElement
) {
- final PsiLiteralExpression myOriginalExpression = (PsiLiteralExpression) startElement;
- final PsiField myConstant = myConst.getElement();
- if (myConstant == null || !FileModificationService.getInstance()
- .prepareFileForWrite(myOriginalExpression.getContainingFile())) {
+ PsiLiteralExpression myOriginalExpression = (PsiLiteralExpression) startElement;
+ PsiField myConstant = myConst.getElement();
+ if (myConstant == null
+ || !FileModificationService.getInstance().prepareFileForWrite(myOriginalExpression.getContainingFile())) {
return;
}
try {
- final PsiReferenceExpression reference = createReferenceTo(myConstant, myOriginalExpression);
+ PsiReferenceExpression reference = createReferenceTo(myConstant, myOriginalExpression);
if (reference != null) {
myOriginalExpression.replace(reference);
}
diff --git a/plugin/src/main/java/com/intellij/java/impl/codeInspection/duplicateThrows/DuplicateThrowsInspection.java b/plugin/src/main/java/com/intellij/java/impl/codeInspection/duplicateThrows/DuplicateThrowsInspection.java
index c47b17b70..2017729d9 100644
--- a/plugin/src/main/java/com/intellij/java/impl/codeInspection/duplicateThrows/DuplicateThrowsInspection.java
+++ b/plugin/src/main/java/com/intellij/java/impl/codeInspection/duplicateThrows/DuplicateThrowsInspection.java
@@ -33,82 +33,86 @@
@ExtensionImpl
public class DuplicateThrowsInspection extends BaseLocalInspectionTool {
+ @SuppressWarnings("PublicField")
+ public boolean ignoreSubclassing = false;
- @SuppressWarnings("PublicField")
- public boolean ignoreSubclassing = false;
+ @Override
+ @Nonnull
+ public LocalizeValue getDisplayName() {
+ return InspectionLocalize.inspectionDuplicateThrowsDisplayName();
+ }
- @Override
- @Nonnull
- public LocalizeValue getDisplayName() {
- return InspectionLocalize.inspectionDuplicateThrowsDisplayName();
- }
+ @Override
+ public boolean isEnabledByDefault() {
+ return true;
+ }
- @Override
- public boolean isEnabledByDefault() {
- return true;
- }
+ @Override
+ @Nonnull
+ public LocalizeValue getGroupDisplayName() {
+ return InspectionLocalize.groupNamesDeclarationRedundancy();
+ }
- @Override
- @Nonnull
- public LocalizeValue getGroupDisplayName() {
- return InspectionLocalize.groupNamesDeclarationRedundancy();
- }
+ @Override
+ @Nonnull
+ public String getShortName() {
+ return "DuplicateThrows";
+ }
- @Override
- @Nonnull
- public String getShortName() {
- return "DuplicateThrows";
- }
+ @Nullable
+ @Override
+ public JComponent createOptionsPanel() {
+ return new SingleCheckboxOptionsPanel(
+ InspectionLocalize.inspectionDuplicateThrowsIgnoreSubclassingOption().get(),
+ this,
+ "ignoreSubclassing"
+ );
+ }
- @Nullable
- @Override
- public JComponent createOptionsPanel() {
- return new SingleCheckboxOptionsPanel(
- InspectionLocalize.inspectionDuplicateThrowsIgnoreSubclassingOption().get(),
- this,
- "ignoreSubclassing"
- );
- }
+ @Override
+ @Nonnull
+ public PsiElementVisitor buildVisitorImpl(
+ @Nonnull final ProblemsHolder holder,
+ boolean isOnTheFly,
+ LocalInspectionToolSession session,
+ Object state
+ ) {
+ return new JavaElementVisitor() {
- @Override
- @Nonnull
- public PsiElementVisitor buildVisitorImpl(
- @Nonnull final ProblemsHolder holder,
- boolean isOnTheFly,
- LocalInspectionToolSession session,
- Object state
- ) {
- return new JavaElementVisitor() {
-
- @Override public void visitMethod(@Nonnull PsiMethod method) {
- PsiReferenceList throwsList = method.getThrowsList();
- PsiJavaCodeReferenceElement[] refs = throwsList.getReferenceElements();
- PsiClassType[] types = throwsList.getReferencedTypes();
- for (int i = 0; i < types.length; i++) {
- PsiClassType type = types[i];
- for (int j = i+1; j < types.length; j++) {
- PsiClassType otherType = types[j];
- LocalizeValue problem = null;
- PsiJavaCodeReferenceElement ref = refs[i];
- if (type.equals(otherType)) {
- problem = InspectionLocalize.inspectionDuplicateThrowsProblem();
- }
- else if (!ignoreSubclassing) {
- if (otherType.isAssignableFrom(type)) {
- problem = InspectionLocalize.inspectionDuplicateThrowsMoreGeneralProblem(otherType.getCanonicalText());
- }
- else if (type.isAssignableFrom(otherType)) {
- problem = InspectionLocalize.inspectionDuplicateThrowsMoreGeneralProblem(type.getCanonicalText());
- ref = refs[j];
- type = otherType;
- }
- }
- if (problem != null) {
- holder.registerProblem(ref, problem.get(), ProblemHighlightType.LIKE_UNUSED_SYMBOL, new DeleteThrowsFix(method, type));
+ @Override
+ public void visitMethod(@Nonnull PsiMethod method) {
+ PsiReferenceList throwsList = method.getThrowsList();
+ PsiJavaCodeReferenceElement[] refs = throwsList.getReferenceElements();
+ PsiClassType[] types = throwsList.getReferencedTypes();
+ for (int i = 0; i < types.length; i++) {
+ PsiClassType type = types[i];
+ for (int j = i + 1; j < types.length; j++) {
+ PsiClassType otherType = types[j];
+ LocalizeValue problem = LocalizeValue.empty();
+ PsiJavaCodeReferenceElement ref = refs[i];
+ if (type.equals(otherType)) {
+ problem = InspectionLocalize.inspectionDuplicateThrowsProblem();
+ }
+ else if (!ignoreSubclassing) {
+ if (otherType.isAssignableFrom(type)) {
+ problem = InspectionLocalize.inspectionDuplicateThrowsMoreGeneralProblem(otherType.getCanonicalText());
+ }
+ else if (type.isAssignableFrom(otherType)) {
+ problem = InspectionLocalize.inspectionDuplicateThrowsMoreGeneralProblem(type.getCanonicalText());
+ ref = refs[j];
+ type = otherType;
+ }
+ }
+ if (problem != LocalizeValue.empty()) {
+ holder.newProblem(problem)
+ .range(ref)
+ .withFixes(new DeleteThrowsFix(method, type))
+ .highlightType(ProblemHighlightType.LIKE_UNUSED_SYMBOL)
+ .create();
+ }
+ }
+ }
}
- }
- }
- }
- };
- }
+ };
+ }
}
diff --git a/plugin/src/main/java/com/intellij/java/impl/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java b/plugin/src/main/java/com/intellij/java/impl/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java
index 58ca1b5ca..236c45fae 100644
--- a/plugin/src/main/java/com/intellij/java/impl/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java
+++ b/plugin/src/main/java/com/intellij/java/impl/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java
@@ -8,6 +8,7 @@
import com.intellij.java.language.psi.*;
import com.intellij.java.language.psi.util.MethodSignature;
import com.intellij.java.language.psi.util.PsiUtil;
+import consulo.annotation.access.RequiredReadAction;
import consulo.annotation.component.ExtensionImpl;
import consulo.deadCodeNotWorking.impl.SingleCheckboxOptionsPanel;
import consulo.java.analysis.localize.JavaAnalysisLocalize;
@@ -58,19 +59,20 @@ public JComponent createOptionsPanel() {
);
}
- @Override
@Nonnull
+ @Override
public PsiElementVisitor buildVisitorImpl(
@Nonnull final ProblemsHolder holder,
- final boolean isOnTheFly,
+ boolean isOnTheFly,
LocalInspectionToolSession session,
Object state
) {
final List patternMethods = new ArrayList<>();
return new JavaElementVisitor() {
@Override
+ @RequiredReadAction
public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression methodCall) {
- final PsiExpression[] args = methodCall.getArgumentList().getExpressions();
+ PsiExpression[] args = methodCall.getArgumentList().getExpressions();
if (args.length < 1) {
return;
}
@@ -78,20 +80,23 @@ public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression methodCal
String message =
getSuspiciousMethodCallMessage(methodCall, REPORT_CONVERTIBLE_METHOD_CALLS, patternMethods, args[idx], idx);
if (message != null) {
- holder.registerProblem(methodCall.getArgumentList().getExpressions()[idx], message);
+ holder.newProblem(LocalizeValue.localizeTODO(message))
+ .range(methodCall.getArgumentList().getExpressions()[idx])
+ .create();
}
}
}
@Override
+ @RequiredReadAction
public void visitMethodReferenceExpression(@Nonnull PsiMethodReferenceExpression expression) {
- final PsiType functionalInterfaceType = expression.getFunctionalInterfaceType();
- final PsiClassType.ClassResolveResult functionalInterfaceResolveResult =
+ PsiType functionalInterfaceType = expression.getFunctionalInterfaceType();
+ PsiClassType.ClassResolveResult functionalInterfaceResolveResult =
PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
- final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(functionalInterfaceType);
+ PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(functionalInterfaceType);
if (interfaceMethod != null && interfaceMethod.getParameterList().getParametersCount() == 1) {
- final PsiSubstitutor psiSubstitutor = LambdaUtil.getSubstitutor(interfaceMethod, functionalInterfaceResolveResult);
- final MethodSignature signature = interfaceMethod.getSignature(psiSubstitutor);
+ PsiSubstitutor psiSubstitutor = LambdaUtil.getSubstitutor(interfaceMethod, functionalInterfaceResolveResult);
+ MethodSignature signature = interfaceMethod.getSignature(psiSubstitutor);
String message = SuspiciousMethodCallUtil.getSuspiciousMethodCallMessage(
expression,
signature.getParameterTypes()[0],
@@ -100,7 +105,9 @@ public void visitMethodReferenceExpression(@Nonnull PsiMethodReferenceExpression
0
);
if (message != null) {
- holder.registerProblem(ObjectUtil.notNull(expression.getReferenceNameElement(), expression), message);
+ holder.newProblem(LocalizeValue.of(message))
+ .range(ObjectUtil.notNull(expression.getReferenceNameElement(), expression))
+ .create();
}
}
}
@@ -113,6 +120,7 @@ public String getShortName() {
return "SuspiciousMethodCalls";
}
+ @RequiredReadAction
private static String getSuspiciousMethodCallMessage(
PsiMethodCallExpression methodCall,
boolean reportConvertibleMethodCalls,
@@ -122,7 +130,7 @@ private static String getSuspiciousMethodCallMessage(
) {
PsiType argType = arg.getType();
boolean exactType = arg instanceof PsiNewExpression;
- final String plainMessage = SuspiciousMethodCallUtil
+ String plainMessage = SuspiciousMethodCallUtil
.getSuspiciousMethodCallMessage(methodCall, arg, argType, exactType || reportConvertibleMethodCalls, patternMethods, i);
if (plainMessage != null && !exactType) {
String methodName = methodCall.getMethodExpression().getReferenceName();
diff --git a/plugin/src/main/resources/LOCALIZE-LIB/en_US/consulo.java.JavaRefactoringLocalize.yaml b/plugin/src/main/resources/LOCALIZE-LIB/en_US/consulo.java.JavaRefactoringLocalize.yaml
index 538f70a76..5481ced88 100644
--- a/plugin/src/main/resources/LOCALIZE-LIB/en_US/consulo.java.JavaRefactoringLocalize.yaml
+++ b/plugin/src/main/resources/LOCALIZE-LIB/en_US/consulo.java.JavaRefactoringLocalize.yaml
@@ -204,6 +204,10 @@ inline.method.multiline.method.in.ctor.call:
text: Inline cannot be applied to multiline method in constructor call
inline.method.used.in.javadoc:
text: Inlined method is used in javadoc
+inline.method.used.in.reflection:
+ text: Inlined method is used reflectively
+inline.method.qualifier.usage.side.effect:
+ text: Inlined method is used in method reference with side effects in qualifier
inline.parameter.cannot.find.initializer.warning.message:
text: Cannot find constant initializer for parameter
inline.parameter.no.usages.warning.message: