[java-highlighting] Stabilize the order of missing branches

GitOrigin-RevId: cca86a5d95906306a0a4c68b976e8d6950e3cb72
This commit is contained in:
Andrey.Cherkasov
2022-05-31 13:16:30 +03:00
committed by intellij-monorepo-bot
parent 69efc5b45b
commit c977930e50
13 changed files with 116 additions and 52 deletions

View File

@@ -317,7 +317,8 @@ public class SwitchBlockHighlightingModel {
}
void checkEnumCompleteness(@NotNull PsiClass selectorClass, @NotNull List<String> enumElements, @NotNull List<HighlightInfo> results) {
Set<String> missingConstants = StreamEx.of(selectorClass.getFields()).select(PsiEnumConstant.class).map(PsiField::getName).toSet();
LinkedHashSet<String> missingConstants =
StreamEx.of(selectorClass.getFields()).select(PsiEnumConstant.class).map(PsiField::getName).toCollection(LinkedHashSet::new);
if (!enumElements.isEmpty()) {
enumElements.forEach(missingConstants::remove);
if (missingConstants.isEmpty()) return;
@@ -843,7 +844,7 @@ public class SwitchBlockHighlightingModel {
}
HighlightInfo info = createCompletenessInfoForSwitch(!elements.isEmpty());
List<String> allNames = collectLabelElementNames(elements, missingClasses, patternClasses);
Set<String> missingCases = ContainerUtil.map2Set(missingClasses, PsiClass::getQualifiedName);
Set<String> missingCases = ContainerUtil.map2LinkedSet(missingClasses, PsiClass::getQualifiedName);
IntentionAction fix = getFixFactory().createAddMissingSealedClassBranchesFix(myBlock, missingCases, allNames);
QuickFixAction.registerQuickFixAction(info, fix);
return info;
@@ -877,10 +878,13 @@ public class SwitchBlockHighlightingModel {
private static Collection<PsiClass> getPermittedClasses(@NotNull PsiClass psiClass) {
PsiReferenceList permitsList = psiClass.getPermitsList();
if (permitsList == null) {
TreeSet<PsiClass> result = new TreeSet<>(Comparator.comparing(aClass -> aClass.getName()));
GlobalSearchScope fileScope = GlobalSearchScope.fileScope(psiClass.getContainingFile());
return new ArrayList<>(DirectClassInheritorsSearch.search(psiClass, fileScope).findAll());
result.addAll(DirectClassInheritorsSearch.search(psiClass, fileScope).findAll());
return result;
}
return Stream.of(permitsList.getReferencedTypes()).map(type -> type.resolve()).filter(Objects::nonNull).collect(Collectors.toSet());
return Stream.of(permitsList.getReferencedTypes()).map(type -> type.resolve()).filter(Objects::nonNull)
.collect(Collectors.toCollection(LinkedHashSet::new));
}
@Nullable

View File

@@ -1,14 +1,19 @@
// "Create missing branches: 'B', and 'C'" "true"
// "Create missing branches: 'AA', 'AB', and 'AC'" "true"
abstract sealed class A {}
final class B extends A {}
final class C extends A {}
final class AA extends A {}
sealed class AB extends A {}
non-sealed class AC extends A {}
final class ABA extends AB {}
non-sealed class ABC extends AB {}
class Test {
void test(A a) {
switch (a) {
case B b -> {
case AA aa -> {
}
case C c -> {
case AB ab -> {
}
case AC ac -> {
}
}
}

View File

@@ -5,7 +5,7 @@ final class Aaa implements Aa {}
final class Aab implements Aa {}
final class Ab implements A {}
public class Test {
class Test {
void test(A a) {
switch (a) {
case Aaa x -> {

View File

@@ -1,18 +0,0 @@
// "Create missing branches: 'A', 'B', and 'C'" "true"
sealed class A {}
final class B extends A {}
final class C extends A {}
class Test {
void test(A a) {
switch (a) {
case B b && b.hashCode() > 21 -> {}
case B b -> {
}
case C c -> {
}
case A a1 -> {
}
}
}
}

View File

@@ -1,14 +1,19 @@
// "Create missing branches: 'A', 'B', and 'C'" "true"
// "Create missing branches: 'AA', 'AB', 'AC', and 'A'" "true"
sealed class A {}
final class B extends A {}
final class C extends A {}
final class AA extends A {}
sealed class AB extends A {}
non-sealed class AC extends A {}
final class ABA extends AB {}
non-sealed class ABC extends AB {}
class Test {
void test(A a) {
switch (a) {
case B b -> {
case AA aa -> {
}
case C c -> {
case AB ab -> {
}
case AC ac -> {
}
case A a1 -> {
}

View File

@@ -0,0 +1,21 @@
// "Create missing branches: 'Ab', and 'A'" "true"
sealed class A {}
abstract sealed class Aa extends A {}
final class Aaa extends Aa {}
final class Aab extends Aa {}
final class Ab extends A {}
class Test {
void test(A a) {
switch (a) {
case Aaa x -> {
}
case Aab x -> {
}
case Ab ab -> {
}
case A a1 -> {
}
}
}
}

View File

@@ -0,0 +1,22 @@
// "Create missing branches: 'AC', 'AA', 'AB', and 'A'" "true"
sealed class A permits AC, AA, AB {}
final class AA extends A {}
sealed class AB extends A permits ABC, ABA {}
non-sealed class AC extends A {}
final class ABA extends AB {}
non-sealed class ABC extends AB {}
class Test {
void test(A a) {
switch (a) {
case AC ac -> {
}
case AA aa -> {
}
case AB ab -> {
}
case A a1 -> {
}
}
}
}

View File

@@ -1,7 +1,10 @@
// "Create missing branches: 'B', and 'C'" "true"
// "Create missing branches: 'AA', 'AB', and 'AC'" "true"
abstract sealed class A {}
final class B extends A {}
final class C extends A {}
final class AA extends A {}
sealed class AB extends A {}
non-sealed class AC extends A {}
final class ABA extends AB {}
non-sealed class ABC extends AB {}
class Test {
void test(A a) {

View File

@@ -5,7 +5,7 @@ final class Aaa implements Aa {}
final class Aab implements Aa {}
final class Ab implements A {}
public class Test {
class Test {
void test(A a) {
switch (a<caret>) {
case Aaa x -> {

View File

@@ -1,12 +0,0 @@
// "Create missing branches: 'A', 'B', and 'C'" "true"
sealed class A {}
final class B extends A {}
final class C extends A {}
class Test {
void test(A a) {
switch (a<caret>) {
case B b && b.hashCode() > 21 -> {}
}
}
}

View File

@@ -1,7 +1,10 @@
// "Create missing branches: 'A', 'B', and 'C'" "true"
// "Create missing branches: 'AA', 'AB', 'AC', and 'A'" "true"
sealed class A {}
final class B extends A {}
final class C extends A {}
final class AA extends A {}
sealed class AB extends A {}
non-sealed class AC extends A {}
final class ABA extends AB {}
non-sealed class ABC extends AB {}
class Test {
void test(A a) {

View File

@@ -0,0 +1,17 @@
// "Create missing branches: 'Ab', and 'A'" "true"
sealed class A {}
abstract sealed class Aa extends A {}
final class Aaa extends Aa {}
final class Aab extends Aa {}
final class Ab extends A {}
class Test {
void test(A a) {
switch (a<caret>) {
case Aaa x -> {
}
case Aab x -> {
}
}
}
}

View File

@@ -0,0 +1,14 @@
// "Create missing branches: 'AC', 'AA', 'AB', and 'A'" "true"
sealed class A permits AC, AA, AB {}
final class AA extends A {}
sealed class AB extends A permits ABC, ABA {}
non-sealed class AC extends A {}
final class ABA extends AB {}
non-sealed class ABC extends AB {}
class Test {
void test(A a) {
switch (a<caret>) {
}
}
}