diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index c9fde36aad73..8359d4a155ea 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -2033,7 +2033,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (!TypeConversionUtil.areTypesConvertible(itemType, patternType)) { add(HighlightUtil.createIncompatibleTypeHighlightInfo(itemType, patternType, pattern.getTextRange(), 0)); } - else if (JavaGenericsUtil.isUncheckedCast(PsiUtil.uncaptureToplevelWildcards(patternType), itemType)) { + else if (JavaGenericsUtil.isUncheckedCast(patternType, itemType)) { String message = JavaErrorBundle.message("unsafe.cast.in.instanceof", JavaHighlightUtil.formatType(itemType), JavaHighlightUtil.formatType(patternType)); add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(pattern).descriptionAndTooltip(message)); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PatternHighlightingModel.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PatternHighlightingModel.java index c8d84c7ccf7a..017ceab04848 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PatternHighlightingModel.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PatternHighlightingModel.java @@ -70,7 +70,7 @@ final class PatternHighlightingModel { holder.add(builder.create()); } } - else if (JavaGenericsUtil.isUncheckedCast(PsiUtil.uncaptureToplevelWildcards(Objects.requireNonNull(deconstructionComponentType)), + else if (JavaGenericsUtil.isUncheckedCast(Objects.requireNonNull(deconstructionComponentType), GenericsUtil.getVariableTypeByExpressionType(substitutedRecordComponentType))) { hasMismatchedPattern = true; if (recordComponents.length == deconstructionComponents.length) { diff --git a/java/java-psi-api/src/com/intellij/codeInsight/daemon/impl/analysis/JavaGenericsUtil.java b/java/java-psi-api/src/com/intellij/codeInsight/daemon/impl/analysis/JavaGenericsUtil.java index 4e56bec0b86f..3ccb2a23e81d 100644 --- a/java/java-psi-api/src/com/intellij/codeInsight/daemon/impl/analysis/JavaGenericsUtil.java +++ b/java/java-psi-api/src/com/intellij/codeInsight/daemon/impl/analysis/JavaGenericsUtil.java @@ -316,6 +316,9 @@ public final class JavaGenericsUtil { PsiSubstitutor superClassSubstitutor = TypeConversionUtil.getClassSubstitutor(owner, aClass, substitutor); if (superClassSubstitutor == null) return null; PsiType itemType = superClassSubstitutor.substitute(typeParameter); + if (itemType != null) { + itemType = PsiUtil.captureToplevelWildcards(itemType, aClass); + } return itemType == null ? PsiType.getJavaLangObject(manager, aClass.getResolveScope()) : itemType; } if (type instanceof PsiIntersectionType) { diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java index b5cdb7ba04c8..0faa776f93fd 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java @@ -826,32 +826,6 @@ public final class PsiUtil extends PsiUtilCore { return null; } - @NotNull - public static PsiType uncaptureToplevelWildcards(@NotNull PsiType type) { - if (type instanceof PsiClassType) { - PsiClassType.ClassResolveResult result = ((PsiClassType)type).resolveGenerics(); - PsiClass aClass = result.getElement(); - if (aClass != null) { - PsiSubstitutor substitutor = result.getSubstitutor(); - PsiSubstitutor uncaptureSubstitutor = substitutor; - boolean hasCaptured = false; - for (PsiTypeParameter typeParameter : typeParametersIterable(aClass)) { - PsiType substituted = substitutor.substitute(typeParameter); - if (substituted instanceof PsiCapturedWildcardType) { - hasCaptured = true; - uncaptureSubstitutor = uncaptureSubstitutor.put(typeParameter, ((PsiCapturedWildcardType)substituted).getWildcard()); - } - } - - if (hasCaptured) { - PsiElementFactory factory = JavaPsiFacade.getElementFactory(aClass.getProject()); - return factory.createType(aClass, uncaptureSubstitutor); - } - } - } - return type; - } - /** * Applies capture conversion to the type in context */ diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveUtil.java index 0b4caa19a712..608cbe323e54 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveUtil.java @@ -345,11 +345,7 @@ public final class JavaResolveUtil { if (iteratedValue == null) { return null; } - PsiType itemType = JavaGenericsUtil.getCollectionItemType(iteratedValue); - if (itemType != null) { - itemType = PsiUtil.captureToplevelWildcards(itemType, parent); - } - return itemType; + return JavaGenericsUtil.getCollectionItemType(iteratedValue); } if (parent instanceof PsiCaseLabelElementList) { PsiSwitchLabelStatementBase label = ObjectUtils.tryCast(parent.getParent(), PsiSwitchLabelStatementBase.class); diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/DeconstructionInferenceTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/DeconstructionInferenceTest.java index 083e9d4b7de7..8e433ea0ea56 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/DeconstructionInferenceTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/DeconstructionInferenceTest.java @@ -219,13 +219,7 @@ public class DeconstructionInferenceTest extends LightJavaCodeInsightFixtureTest System.out.println(x.isEmpty()); } } - - public static void test3(List>>> records) { - for (Box(Box(Box(var x))) : records) { - System.out.println(x.isEmpty()); - } - } - } + } """); myFixture.enableInspections(new RawUseOfParameterizedTypeInspection()); myFixture.checkHighlighting();