diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java index 0ddaf1f92387..1829d6ac4078 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java @@ -1064,7 +1064,7 @@ public class JavaDocInfoGenerator { PsiParameter parm = parameters[i]; generateAnnotations(buffer, parm, place, false); generateType(buffer, parm.getType(), method, generateLink, isTooltip); - if (parm.getName() != null && !isTooltip) { + if (!isTooltip) { buffer.append(NBSP); buffer.append(parm.getName()); } @@ -1648,6 +1648,10 @@ public class JavaDocInfoGenerator { if (parentClass == null) return; if (parentClass.isInterface() && !overrides) return; PsiMethod[] supers = method.findSuperMethods(); + Arrays.sort(supers, Comparator.comparing(m-> { + PsiClass aClass = m.getContainingClass(); + return aClass == null ? null : aClass.getName(); + })); if (supers.length == 0) return; boolean headerGenerated = false; for (PsiMethod superMethod : supers) { diff --git a/java/java-impl/src/com/intellij/codeInspection/SimplifyStreamApiCallChainsInspection.java b/java/java-impl/src/com/intellij/codeInspection/SimplifyStreamApiCallChainsInspection.java index e9ca4d3e5abf..8daea7cff9c9 100644 --- a/java/java-impl/src/com/intellij/codeInspection/SimplifyStreamApiCallChainsInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/SimplifyStreamApiCallChainsInspection.java @@ -1149,7 +1149,9 @@ public class SimplifyStreamApiCallChainsInspection extends AbstractBaseJavaLocal generator.byCollectionName(((PsiReferenceExpression)containerQualifier).getReferenceName()); } String name = generator.byType(elementType).byName("item", "element").generate(true); - Collection refs = ReferencesSearch.search(indexParameter, new LocalSearchScope(body)).findAll(); + List refs = new ArrayList<>(ReferencesSearch.search(indexParameter, new LocalSearchScope(body)).findAll()); + refs.sort(Comparator.comparingInt(ref -> ref.getElement().getTextOffset())); + for (PsiReference ref : refs) { PsiExpression getExpression = container.extractGetExpressionFromIndex(tryCast(ref, PsiExpression.class)); if (getExpression != null) { diff --git a/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java b/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java index a1a1e5aef262..ca1ea23f0fbb 100644 --- a/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java +++ b/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java @@ -37,6 +37,7 @@ import org.jetbrains.annotations.TestOnly; import javax.swing.*; import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; import java.util.List; public class NullityInferrer { @@ -573,7 +574,10 @@ public class NullityInferrer { final PsiMethod method = (PsiMethod)grandParent; if (method.getBody() != null) { - for (PsiReference reference : ReferencesSearch.search(parameter, new LocalSearchScope(method))) { + List all = new ArrayList<>(ReferencesSearch.search(parameter, new LocalSearchScope(method)).findAll()); + all.sort(Comparator.comparingInt(ref->ref.getElement().getTextOffset())); + + for (PsiReference reference : all) { final PsiElement place = reference.getElement(); if (place instanceof PsiReferenceExpression) { final PsiReferenceExpression expr = (PsiReferenceExpression)place; diff --git a/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java b/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java index a66143953935..b0ffa82082a7 100644 --- a/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java @@ -209,7 +209,8 @@ public class ReturnSeparatedFromComputationInspection extends AbstractBaseJavaLo } Query query = ReferencesSearch.search(context.returnedVariable, new LocalSearchScope(context.variableScope)); - Collection usages = query.findAll(); + List usages = new ArrayList<>(query.findAll()); + usages.sort(Comparator.comparingInt(ref -> ref.getElement().getTextOffset())); for (PsiReference usage : usages) { PsiElement parent = PsiTreeUtil.skipParentsOfType(usage.getElement(), PsiParenthesizedExpression.class, PsiTypeCastExpression.class); diff --git a/java/java-impl/src/com/intellij/codeInspection/java18api/Java8MapForEachInspection.java b/java/java-impl/src/com/intellij/codeInspection/java18api/Java8MapForEachInspection.java index 8f91ad4f4971..bd628eee5a6c 100644 --- a/java/java-impl/src/com/intellij/codeInspection/java18api/Java8MapForEachInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/java18api/Java8MapForEachInspection.java @@ -25,7 +25,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.Collection; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; import java.util.Objects; public class Java8MapForEachInspection extends AbstractBaseJavaLocalInspectionTool { @@ -150,7 +152,8 @@ public class Java8MapForEachInspection extends AbstractBaseJavaLocalInspectionTo PsiType entryType = entryParameter.getType(); ParameterCandidate key = new ParameterCandidate(entryType, true); ParameterCandidate value = new ParameterCandidate(entryType, false); - Collection references = ReferencesSearch.search(entryParameter).findAll(); + List references = new ArrayList<>(ReferencesSearch.search(entryParameter).findAll()); + references.sort(Comparator.comparingInt(ref->ref.getElement().getTextOffset())); for (PsiReference ref : references) { PsiMethodCallExpression entryCall = ExpressionUtils.getCallForQualifier(ObjectUtils.tryCast(ref.getElement(), PsiExpression.class)); if (ENTRY_GETTER.test(entryCall)) { diff --git a/java/java-impl/src/com/intellij/codeInspection/streamMigration/CollectMigration.java b/java/java-impl/src/com/intellij/codeInspection/streamMigration/CollectMigration.java index f1e9bd5af462..cb31385f80ef 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamMigration/CollectMigration.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamMigration/CollectMigration.java @@ -25,10 +25,7 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.function.BiFunction; import static com.intellij.codeInspection.streamMigration.StreamApiMigrationInspection.isCallOf; @@ -807,6 +804,7 @@ class CollectMigration extends BaseStreamApiMigration { List usages = terminal.targetReferences().toList(); if (usages.isEmpty()) return null; + usages.sort(Comparator.comparingInt(ref->ref.getTextOffset())); PsiMethodCallExpression toArrayCandidate = StreamEx.of(usages) .map(usage -> ExpressionUtils.getCallForQualifier(tryCast(usage, PsiExpression.class))) .nonNull().findFirst().orElse(null); diff --git a/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/BaseConvertToLocalQuickFix.java b/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/BaseConvertToLocalQuickFix.java index 8c4e4b26bf39..6fe671e4015f 100644 --- a/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/BaseConvertToLocalQuickFix.java +++ b/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/BaseConvertToLocalQuickFix.java @@ -124,12 +124,14 @@ public abstract class BaseConvertToLocalQuickFix implemen final Collection references = ReferencesSearch.search(variable).findAll(); if (references.isEmpty()) return Collections.emptyList(); - return Collections.singletonList(moveDeclaration(project, variable, references, true)); + return Collections.singletonList(ObjectUtils.notNull(moveDeclaration(project, variable, references, true))); } protected PsiElement moveDeclaration(Project project, V variable, final Collection references, boolean delete) { final PsiCodeBlock anchorBlock = findAnchorBlock(references); - if (anchorBlock == null) return null; //was assert, but need to fix the case when obsolete inspection highlighting is left + if (anchorBlock == null) { + return null; //was assert, but need to fix the case when obsolete inspection highlighting is left + } final PsiElement firstElement = getLowestOffsetElement(references); final String localName = suggestLocalName(project, variable, anchorBlock); @@ -281,6 +283,7 @@ public abstract class BaseConvertToLocalQuickFix implemen PsiCodeBlock result = null; for (PsiReference psiReference : refs) { final PsiElement element = psiReference.getElement(); + if (PsiUtil.isInsideJavadocComment(element)) continue; PsiCodeBlock block = PsiTreeUtil.getParentOfType(element, PsiCodeBlock.class); if (result == null || block == null) { result = block; @@ -288,6 +291,7 @@ public abstract class BaseConvertToLocalQuickFix implemen else { final PsiElement commonParent = PsiTreeUtil.findCommonParent(result, block); result = PsiTreeUtil.getParentOfType(commonParent, PsiCodeBlock.class, false); + if (result == null) return null; } } return result; diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java index 5e58f9c8040c..d8c729205827 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java @@ -29,9 +29,7 @@ import com.intellij.refactoring.util.classMembers.ClassMemberReferencesVisitor; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.util.containers.MultiMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.Set; +import java.util.*; public class PushDownConflicts { private final PsiClass myClass; @@ -118,8 +116,10 @@ public class PushDownConflicts { if (superMethod.hasModifierProperty(PsiModifier.DEFAULT)) { unrelatedDefaults.add(superMethod.getContainingClass()); if (unrelatedDefaults.size() > 1) { + List supers = new ArrayList<>(unrelatedDefaults); + supers.sort(Comparator.comparing(PsiClass::getName)); myConflicts.putValue(member, CommonRefactoringUtil.capitalize(RefactoringUIUtil.getDescription(myClass, false) + " will inherit unrelated defaults from " + - StringUtil.join(unrelatedDefaults, aClass -> RefactoringUIUtil.getDescription(aClass, false)," and "))); + StringUtil.join(supers, aClass -> RefactoringUIUtil.getDescription(aClass, false)," and "))); break; } } diff --git a/java/java-impl/src/com/intellij/refactoring/migration/MigrationUtil.java b/java/java-impl/src/com/intellij/refactoring/migration/MigrationUtil.java index 57ce57dbe22d..0474ff4504b0 100644 --- a/java/java-impl/src/com/intellij/refactoring/migration/MigrationUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/migration/MigrationUtil.java @@ -19,7 +19,9 @@ import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Segment; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReference; import com.intellij.psi.search.GlobalSearchScope; @@ -28,6 +30,8 @@ import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; public class MigrationUtil { private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.migration.MigrationUtil"); @@ -61,11 +65,18 @@ public class MigrationUtil { } private static UsageInfo[] findRefs(final PsiElement aClass, GlobalSearchScope searchScope) { - final ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); for (PsiReference usage : ReferencesSearch.search(aClass, searchScope, false)) { results.add(new UsageInfo(usage)); } + results.sort(Comparator.comparing(u -> { + VirtualFile file = u.getVirtualFile(); + return file == null ? null : file.getName(); + }).thenComparingInt(u->{ + Segment range = u.getNavigationRange(); + return range == null ? 0 : range.getStartOffset(); + })); return results.toArray(UsageInfo.EMPTY_ARRAY); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/fuseStreamOperations/afterToArrayTreeSet.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/fuseStreamOperations/afterToArrayTreeSet.java index 827d0a7b4b65..2b789eb8cb68 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/fuseStreamOperations/afterToArrayTreeSet.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/fuseStreamOperations/afterToArrayTreeSet.java @@ -3,7 +3,7 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; -public class Test { +class Test { public String[] testToArray(String[] args) { return Arrays.stream(args).distinct().sorted().toArray(String[]::new); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/fuseStreamOperations/beforeToArrayTreeSet.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/fuseStreamOperations/beforeToArrayTreeSet.java index ddf1bf752247..00226b0e34e0 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/fuseStreamOperations/beforeToArrayTreeSet.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/fuseStreamOperations/beforeToArrayTreeSet.java @@ -3,7 +3,7 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; -public class Test { +class Test { public String[] testToArray(String[] args) { Set set = Arrays.stream(args).collect(Collectors.toCollection(TreeSet::new)); return set.toArray(new String[set.size()]); diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java index e8a1e35c467e..97220d9f4808 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java @@ -24,12 +24,13 @@ import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.refactoring.util.classMembers.MemberInfoStorage; import com.intellij.usageView.UsageInfo; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.function.Consumer; @@ -124,7 +125,7 @@ public class PushDownTest extends LightRefactoringTestCase { } public void testClassInheritsUnrelatedDefaultsConflict() { - doTest(conflicts -> assertSameElements(conflicts.values(), Collections.singletonList("Class B will inherit unrelated defaults from interface I and interface A"))); + doTest(conflicts -> assertSameElements(conflicts.values(), Collections.singletonList("Class B will inherit unrelated defaults from interface A and interface I"))); } public void testStaticToLocal() { @@ -132,11 +133,11 @@ public class PushDownTest extends LightRefactoringTestCase { } public void testStaticToLocalWithReferenceUpdate() { - doTest(conflicts -> assertSameElements(conflicts.values(), - Arrays.asList("Method m() uses method foo(), which is pushed down", - "Method m() uses method foo(), which is pushed down", - "Static method foo() can't be pushed to non-static class FooExt1", - "Static method foo() can't be pushed to non-static class FooExt"))); + doTest(conflicts -> assertSameElements(new HashSet<>(conflicts.values()), + ContainerUtil.newHashSet("Method m() uses method foo(), which is pushed down", + "Method m() uses method foo(), which is pushed down", + "Static method foo() can't be pushed to non-static class FooExt1", + "Static method foo() can't be pushed to non-static class FooExt"))); } private void doTest() { @@ -151,7 +152,7 @@ public class PushDownTest extends LightRefactoringTestCase { }); } - private void doTest(final Consumer> checkConflicts) { + private void doTest(final Consumer> checkConflicts) { configureByFile(BASE_PATH + getTestName(false) + ".java"); final PsiElement targetElement = TargetElementUtil.findTargetElement(getEditor(), TargetElementUtil.ELEMENT_NAME_ACCEPTED); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/StringConcatenationInLoopsInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/StringConcatenationInLoopsInspection.java index 834e3aeb4f08..bbf63689d58d 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/StringConcatenationInLoopsInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/StringConcatenationInLoopsInspection.java @@ -393,7 +393,8 @@ public class StringConcatenationInLoopsInspection extends BaseInspection { Predicate skip) { Query query = scope == null ? ReferencesSearch.search(variable) : ReferencesSearch.search(variable, new LocalSearchScope(scope)); - Collection refs = query.findAll(); + List refs = new ArrayList<>(query.findAll()); + refs.sort(Comparator.comparingInt(ref -> ref.getElement().getTextOffset())); if (myNullSafe) { fillNullables(variable, refs); }