diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java index 813ff25caee2..c9230625eecd 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java @@ -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 result = ContainerUtil.newArrayList(); PsiAnnotation[] fromBytecode = ProjectBytecodeAnalysis.getInstance(listOwner.getProject()).findInferredAnnotations(listOwner); for (PsiAnnotation annotation : fromBytecode) { diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java index e373207222ea..8605a8f91a83 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java @@ -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 annotationsCollector = new Function() { @Override public String fun(PsiModifierListOwner owner) { - return XmlStringUtil.wrapInHtml(JavaDocInfoGenerator.generateSignature(preferCompiledElement(owner))); + return XmlStringUtil.wrapInHtml(JavaDocInfoGenerator.generateSignature(owner)); } }; return new LineMarkerInfo((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 diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java index e77e7ad01f5e..799f9b459e69 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java @@ -324,4 +324,24 @@ public class PsiParameterImpl extends JavaStubPsiElement 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; + } + }