From 3aa29923c64791a19af0c2ebc0c505f47114eae9 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 3 Dec 2015 15:24:41 +0100 Subject: [PATCH] provide access object for captured wildcards (IDEA-128542) --- .../src/com/intellij/psi/util/PsiUtil.java | 14 ++++++++++++++ .../AccessClassForWildcardCaptureType.java | 19 +++++++++++++++++++ .../lambda/GenericsHighlighting8Test.java | 4 ++++ 3 files changed, 37 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/AccessClassForWildcardCaptureType.java 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 4e027734ae41..a9e2b49726ae 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 @@ -15,6 +15,7 @@ */ package com.intellij.psi.util; +import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdkVersion; @@ -27,6 +28,7 @@ import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; +import com.intellij.psi.infos.ClassCandidateInfo; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.infos.MethodCandidateInfo.ApplicabilityLevel; import com.intellij.psi.javadoc.PsiDocComment; @@ -117,6 +119,18 @@ public final class PsiUtil extends PsiUtilCore { return ((PsiClassType)lub).resolveGenerics(); } } + + if (type instanceof PsiCapturedWildcardType) { + final PsiType upperBound = ((PsiCapturedWildcardType)type).getUpperBound(); + if (upperBound instanceof PsiClassType) { + String classText = "class I {}"; + final PsiJavaFile file = + (PsiJavaFile)PsiFileFactory.getInstance(expression.getProject()).createFileFromText("inference_dummy.java", JavaLanguage.INSTANCE, classText); + final PsiTypeParameter freshParameter = file.getClasses()[0].getTypeParameters()[0]; + return new ClassCandidateInfo(freshParameter, PsiSubstitutor.EMPTY); + } + } + if (type == null && expression instanceof PsiReferenceExpression) { JavaResolveResult resolveResult = ((PsiReferenceExpression)expression).advancedResolve(false); if (resolveResult.getElement() instanceof PsiClass) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/AccessClassForWildcardCaptureType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/AccessClassForWildcardCaptureType.java new file mode 100644 index 000000000000..a7b18a5dc26b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/AccessClassForWildcardCaptureType.java @@ -0,0 +1,19 @@ + +abstract class A { + protected void bar(){} +} + +abstract class Strange extends A { + private void foo(){} + + static void fooBar(Class clazz){ + getInstance(clazz).foo(); + getInstance(clazz).bar(); + } + + public static T getInstance(Class clazz) { + return (T) new StrangeImpl(); + } +} + +class StrangeImpl extends Strange{} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index e0a2ad541050..52d40822a231 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -914,4 +914,8 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { public void testIDEA56754() throws Exception { doTest(); } + + public void testAccessClassForWildcardCaptureType() throws Exception { + doTest(); + } }