narrow down type annotations applicability

This commit is contained in:
Anna.Kozlova
2016-05-24 15:01:03 +02:00
parent fe8c09d5c0
commit 5d3c46d44f
2 changed files with 24 additions and 16 deletions
@@ -21,6 +21,8 @@ import com.intellij.openapi.util.RecursionGuard;
import com.intellij.openapi.util.RecursionManager;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightTypeParameter;
import com.intellij.psi.impl.source.PsiClassReferenceType;
import com.intellij.psi.impl.source.PsiImmediateClassType;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.ArrayUtil;
@@ -231,13 +233,20 @@ public class PsiSubstitutorImpl implements PsiSubstitutor {
final PsiType result = substituteTypeParameter(typeParameter);
if (result != null) {
PsiUtil.ensureValidType(result);
return result.annotate(new TypeAnnotationProvider() {
@NotNull
@Override
public PsiAnnotation[] getAnnotations() {
return ArrayUtil.mergeArrays(result.getAnnotations(), classType.getAnnotations());
}
});
if (result instanceof PsiImmediateClassType ||
result instanceof PsiClassReferenceType ||
result instanceof TypeCorrector.PsiCorrectedClassType ||
result instanceof PsiArrayType ||
result instanceof PsiWildcardType ||
result instanceof PsiCapturedWildcardType) {
return result.annotate(new TypeAnnotationProvider() {
@NotNull
@Override
public PsiAnnotation[] getAnnotations() {
return ArrayUtil.mergeArrays(result.getAnnotations(), classType.getAnnotations());
}
});
}
}
return null;
}
@@ -19,7 +19,6 @@ import com.intellij.openapi.roots.FileIndexFacade;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.PsiClassReferenceType;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.Function;
@@ -161,20 +160,20 @@ class TypeCorrector extends PsiTypeMapper {
return mappedSubstitutor;
}
private class PsiCorrectedClassType extends PsiClassType.Stub {
public class PsiCorrectedClassType extends PsiClassType.Stub {
private final PsiClassType myDelegate;
private final CorrectedResolveResult myResolveResult;
public PsiCorrectedClassType(LanguageLevel languageLevel,
PsiClassType delegate,
CorrectedResolveResult resolveResult) {
private PsiCorrectedClassType(LanguageLevel languageLevel,
PsiClassType delegate,
CorrectedResolveResult resolveResult) {
this(languageLevel, delegate, resolveResult, delegate.getAnnotationProvider());
}
public PsiCorrectedClassType(LanguageLevel languageLevel,
PsiClassType delegate,
CorrectedResolveResult resolveResult,
TypeAnnotationProvider delegateAnnotationProvider) {
private PsiCorrectedClassType(LanguageLevel languageLevel,
PsiClassType delegate,
CorrectedResolveResult resolveResult,
TypeAnnotationProvider delegateAnnotationProvider) {
super(languageLevel, delegateAnnotationProvider);
myDelegate = delegate;
myResolveResult = resolveResult;