javafx: disable line markers for final fields, classes without default constructors, inner classes (IDEA-100927)

This commit is contained in:
anna
2013-02-12 19:20:57 +01:00
parent cd7dff25f5
commit aa6299d02e
@@ -23,14 +23,14 @@ import com.intellij.codeInsight.navigation.NavigationUtil;
import com.intellij.icons.AllIcons;
import com.intellij.navigation.GotoRelatedItem;
import com.intellij.openapi.editor.markup.GutterIconRenderer;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.util.CommonProcessors;
import com.intellij.util.ConstantFunction;
import com.intellij.util.Function;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
@@ -49,11 +49,21 @@ public class JavaFxRelatedItemLineMarkerProvider extends RelatedItemLineMarkerPr
protected void collectNavigationMarkers(@NotNull PsiElement element, final Collection<? super RelatedItemLineMarkerInfo> result) {
if (element instanceof PsiField) {
final PsiField field = (PsiField)element;
if (JavaFxPsiUtil.isVisibleInFxml(field) && !field.hasModifierProperty(PsiModifier.STATIC)) {
if (JavaFxPsiUtil.isVisibleInFxml(field) && !field.hasModifierProperty(PsiModifier.STATIC) && !field.hasModifierProperty(PsiModifier.FINAL)) {
final PsiClass containingClass = field.getContainingClass();
if (containingClass != null && containingClass.hasModifierProperty(PsiModifier.PUBLIC)) {
final PsiMethod[] constructors = containingClass.getConstructors();
boolean defaultConstructor = constructors.length == 0;
for (PsiMethod constructor : constructors) {
if (constructor.getParameterList().getParametersCount() == 0) {
defaultConstructor = true;
break;
}
}
if (!defaultConstructor) return;
if (containingClass.getContainingClass() != null) return;
final ArrayList<GotoRelatedItem> targets = new ArrayList<GotoRelatedItem>();
collectTargets(element, targets, new Function<PsiElement, GotoRelatedItem>() {
collectTargets(field, targets, new Function<PsiElement, GotoRelatedItem>() {
@Override
public GotoRelatedItem fun(PsiElement element) {
return new GotoRelatedItem(element);
@@ -70,24 +80,24 @@ public class JavaFxRelatedItemLineMarkerProvider extends RelatedItemLineMarkerPr
}
}
private static <T> void collectTargets(PsiElement element, final ArrayList<T> targets, final Function<PsiElement, T> fun, final boolean stopAtFirst) {
ReferencesSearch.search(element).forEach(new Processor<PsiReference>() {
@Override
public boolean process(PsiReference reference) {
final PsiElement referenceElement = reference.getElement();
if (referenceElement == null) return true;
if (!(referenceElement instanceof XmlAttributeValue)) return true;
final XmlAttributeValue attributeValue = (XmlAttributeValue)referenceElement;
final PsiElement parent = attributeValue.getParent();
if (!(parent instanceof XmlAttribute)) return true;
final PsiFile containingFile = referenceElement.getContainingFile();
if (containingFile == null) return true;
if (JavaFxFileTypeFactory.isFxml(containingFile)) {
private static <T> void collectTargets(PsiField field, final ArrayList<T> targets, final Function<PsiElement, T> fun, final boolean stopAtFirst) {
final GlobalSearchScope searchScope = GlobalSearchScope.getScopeRestrictedByFileTypes(field.getResolveScope(), StdFileTypes.XML);
ReferencesSearch.search(field, searchScope).forEach(
new Processor<PsiReference>() {
@Override
public boolean process(PsiReference reference) {
final PsiElement referenceElement = reference.getElement();
if (referenceElement == null) return true;
final PsiFile containingFile = referenceElement.getContainingFile();
if (containingFile == null) return true;
if (!JavaFxFileTypeFactory.isFxml(containingFile)) return true;
if (!(referenceElement instanceof XmlAttributeValue)) return true;
final XmlAttributeValue attributeValue = (XmlAttributeValue)referenceElement;
final PsiElement parent = attributeValue.getParent();
if (!(parent instanceof XmlAttribute)) return true;
targets.add(fun.fun(parent));
if (stopAtFirst) return false;
return !stopAtFirst;
}
return true;
}
});
}