diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/SwitchStatementPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/SwitchStatementPostfixTemplate.java index 3a9b39cca2a0..c66ab12d2f0b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/SwitchStatementPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/SwitchStatementPostfixTemplate.java @@ -20,6 +20,7 @@ import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.indexing.DumbModeAccessType; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,12 +35,16 @@ public class SwitchStatementPostfixTemplate extends SurroundPostfixTemplateBase private static final Condition SWITCH_TYPE = expression -> { if (!(expression instanceof PsiExpression)) return false; - PsiType type = ((PsiExpression)expression).getType(); + final PsiType type = getType((PsiExpression)expression); if (type == null) return false; if (PsiType.INT.isAssignableFrom(type)) return true; + if (type instanceof PsiClassType) { + if (HighlightingFeature.PATTERNS_IN_SWITCH.isAvailable(expression)) return true; - if (isEnumOrObjectOrSealedClass(expression, type)) return true; + PsiClass psiClass = ((PsiClassType)type).resolve(); + if (psiClass != null && psiClass.isEnum()) return true; + } if (type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { PsiFile containingFile = expression.getContainingFile(); @@ -52,6 +57,14 @@ public class SwitchStatementPostfixTemplate extends SurroundPostfixTemplateBase return false; }; + @Contract(pure = true) + private static @Nullable PsiType getType(@NotNull PsiExpression expression) { + if (!DumbService.isDumb(expression.getProject())) { + return expression.getType(); + } + return DumbModeAccessType.RELIABLE_DATA_ONLY.ignoreDumbMode(expression::getType); + } + @Contract(pure = true) private static boolean isEnumOrObjectOrSealedClass(@NotNull PsiElement expression, @Nullable PsiType type) { if (!(type instanceof PsiClassType)) return false; diff --git a/java/java-tests/testData/codeInsight/completion/normal/CompleteSwitchObjectSelectorPostfix.java b/java/java-tests/testData/codeInsight/completion/normal/CompleteSwitchObjectSelectorPostfix.java index 207b24e0fc95..1c20fea7ee9c 100644 --- a/java/java-tests/testData/codeInsight/completion/normal/CompleteSwitchObjectSelectorPostfix.java +++ b/java/java-tests/testData/codeInsight/completion/normal/CompleteSwitchObjectSelectorPostfix.java @@ -1,6 +1,6 @@ class Main { - int g(Object o) { + int g(CharSequence o) { o.swit } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/CompleteSwitchObjectSelectorPostfix_after.java b/java/java-tests/testData/codeInsight/completion/normal/CompleteSwitchObjectSelectorPostfix_after.java index df825fe22fe1..ac8ce1a14985 100644 --- a/java/java-tests/testData/codeInsight/completion/normal/CompleteSwitchObjectSelectorPostfix_after.java +++ b/java/java-tests/testData/codeInsight/completion/normal/CompleteSwitchObjectSelectorPostfix_after.java @@ -1,6 +1,6 @@ class Main { - int g(Object o) { + int g(CharSequence o) { switch (o) { }