let InferredAnnotationsManagerImpl itself prefer compiled psi instead of its clients; make this work for library source parameters as well

This commit is contained in:
peter
2014-09-02 13:44:52 +02:00
parent a0e738dbc2
commit 7ee5a8a188
3 changed files with 33 additions and 8 deletions
@@ -20,6 +20,7 @@ import com.intellij.codeInspection.dataFlow.ContractInference;
import com.intellij.codeInspection.dataFlow.MethodContract;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.psi.util.PsiUtil;
@@ -32,9 +33,17 @@ import java.util.List;
import static com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT;
public class InferredAnnotationsManagerImpl extends InferredAnnotationsManager {
@NotNull
private static PsiModifierListOwner preferCompiledElement(@NotNull PsiModifierListOwner element) {
PsiElement original = element.getOriginalElement();
return original instanceof PsiModifierListOwner ? (PsiModifierListOwner)original : element;
}
@Nullable
@Override
public PsiAnnotation findInferredAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) {
listOwner = preferCompiledElement(listOwner);
PsiAnnotation fromBytecode = ProjectBytecodeAnalysis.getInstance(listOwner.getProject()).findInferredAnnotation(listOwner, annotationFQN);
if (fromBytecode != null) {
return fromBytecode;
@@ -57,6 +66,7 @@ public class InferredAnnotationsManagerImpl extends InferredAnnotationsManager {
@NotNull
@Override
public PsiAnnotation[] findInferredAnnotations(@NotNull PsiModifierListOwner listOwner) {
listOwner = preferCompiledElement(listOwner);
List<PsiAnnotation> result = ContainerUtil.newArrayList();
PsiAnnotation[] fromBytecode = ProjectBytecodeAnalysis.getInstance(listOwner.getProject()).findInferredAnnotations(listOwner);
for (PsiAnnotation annotation : fromBytecode) {
@@ -51,14 +51,14 @@ public class ExternalAnnotationsLineMarkerProvider implements LineMarkerProvider
if (!(element instanceof PsiModifierListOwner)) return null;
if (element instanceof PsiParameter || element instanceof PsiLocalVariable) return null;
if (!shouldShowSignature(preferCompiledElement((PsiModifierListOwner)element))) {
if (!shouldShowSignature((PsiModifierListOwner)element)) {
return null;
}
final Function<PsiModifierListOwner, String> annotationsCollector = new Function<PsiModifierListOwner, String>() {
@Override
public String fun(PsiModifierListOwner owner) {
return XmlStringUtil.wrapInHtml(JavaDocInfoGenerator.generateSignature(preferCompiledElement(owner)));
return XmlStringUtil.wrapInHtml(JavaDocInfoGenerator.generateSignature(owner));
}
};
return new LineMarkerInfo<PsiModifierListOwner>((PsiModifierListOwner)element, element.getTextOffset(), AllIcons.Gutter.ExtAnnotation,
@@ -67,11 +67,6 @@ public class ExternalAnnotationsLineMarkerProvider implements LineMarkerProvider
GutterIconRenderer.Alignment.LEFT);
}
private static PsiModifierListOwner preferCompiledElement(PsiModifierListOwner element) {
PsiElement original = element.getOriginalElement();
return original instanceof PsiModifierListOwner ? (PsiModifierListOwner)original : element;
}
private static boolean shouldShowSignature(PsiModifierListOwner owner) {
if (hasNonCodeAnnotations(owner)) {
return true;
@@ -111,7 +106,7 @@ public class ExternalAnnotationsLineMarkerProvider implements LineMarkerProvider
if (ref == null) return true;
PsiElement target = ref.resolve();
return !(target instanceof PsiClass) || JavaDocInfoGenerator.isDocumentedAnnotationType((PsiClass)target);
return !(target instanceof PsiClass) || JavaDocInfoGenerator.isDocumentedAnnotationType(target);
}
@Override
@@ -324,4 +324,24 @@ public class PsiParameterImpl extends JavaStubPsiElement<PsiParameterStub> imple
final PsiElement declarationScope = getDeclarationScope();
return new LocalSearchScope(declarationScope);
}
@Override
public PsiElement getOriginalElement() {
PsiElement parent = getParent();
if (parent instanceof PsiParameterList) {
PsiElement gParent = parent.getParent();
if (gParent instanceof PsiMethod) {
PsiElement originalMethod = gParent.getOriginalElement();
if (originalMethod instanceof PsiMethod) {
int index = ((PsiParameterList)parent).getParameterIndex(this);
PsiParameter[] originalParameters = ((PsiMethod)originalMethod).getParameterList().getParameters();
if (index < originalParameters.length) {
return originalParameters[index];
}
}
}
}
return this;
}
}