mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
let InferredAnnotationsManagerImpl itself prefer compiled psi instead of its clients; make this work for library source parameters as well
This commit is contained in:
+10
@@ -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) {
|
||||
|
||||
+3
-8
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user