javafx: disable handler refs for inappropriate place

This commit is contained in:
Anna Kozlova
2013-01-20 20:37:55 +01:00
parent 7be22cc60e
commit 7abcc09fc3
3 changed files with 32 additions and 10 deletions
@@ -28,4 +28,5 @@ public class JavaFxCommonClassNames {
@NonNls public static final String JAVAFX_BEANS_DEFAULT_PROPERTY = "javafx.beans.DefaultProperty";
@NonNls public static final String JAVAFX_FXML_FXML = "javafx.fxml.FXML";
@NonNls public static final String JAVAFX_BEANS_PROPERTY_OBJECT_PROPERTY = "javafx.beans.property.ObjectProperty";
@NonNls public static final String JAVAFX_EVENT_EVENT_HANDLER = "javafx.event.EventHandler";
}
@@ -16,11 +16,13 @@
package org.jetbrains.plugins.javaFX.fxml;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiReference;
import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.ProcessingContext;
import com.intellij.xml.XmlElementDescriptor;
import org.jetbrains.annotations.NotNull;
/**
@@ -36,6 +38,23 @@ class JavaFxEventHandlerReferenceProvider extends JavaFxControllerBasedReference
ProcessingContext context) {
final String attValueString = xmlAttributeValue.getValue();
LOG.assertTrue(attValueString.startsWith("#"));
final XmlAttribute attribute = (XmlAttribute)xmlAttributeValue.getContext();
if (attribute == null) return PsiReference.EMPTY_ARRAY;
final String attributeName = attribute.getName();
final XmlTag xmlTag = attribute.getParent();
final XmlElementDescriptor descriptor = xmlTag.getDescriptor();
if (descriptor == null) return PsiReference.EMPTY_ARRAY;
final PsiElement currentTagClass = descriptor.getDeclaration();
if (!(currentTagClass instanceof PsiClass)) return PsiReference.EMPTY_ARRAY;
final PsiField handlerField = ((PsiClass)currentTagClass).findFieldByName(attributeName, true);
if (handlerField == null) {
return PsiReference.EMPTY_ARRAY;
}
final PsiClass objectPropertyClass = JavaFxPropertyAttributeDescriptor.getPropertyClass(handlerField);
if (objectPropertyClass == null || !InheritanceUtil.isInheritor(objectPropertyClass, JavaFxCommonClassNames.JAVAFX_EVENT_EVENT_HANDLER)) {
return PsiReference.EMPTY_ARRAY;
}
final String eventHandlerName = attValueString.substring(1);
final PsiMethod[] methods = controllerClass.findMethodsByName(eventHandlerName, true);
@@ -73,7 +73,11 @@ public class JavaFxPropertyAttributeDescriptor implements XmlAttributeDescriptor
}
protected PsiClass getEnum() {
final PsiElement field = getDeclaration();
final PsiClass aClass = getPropertyClass(getDeclaration());
return aClass != null && aClass.isEnum() ? aClass : null;
}
public static PsiClass getPropertyClass(PsiElement field) {
if (field instanceof PsiField) {
final PsiType type = ((PsiField)field).getType();
if (type instanceof PsiClassType) {
@@ -83,14 +87,12 @@ public class JavaFxPropertyAttributeDescriptor implements XmlAttributeDescriptor
final PsiClass objectProperty = JavaPsiFacade.getInstance(attributeClass.getProject())
.findClass(JavaFxCommonClassNames.JAVAFX_BEANS_PROPERTY_OBJECT_PROPERTY, attributeClass.getResolveScope());
if (objectProperty != null) {
final PsiSubstitutor superClassSubstitutor = TypeConversionUtil.getClassSubstitutor(objectProperty, attributeClass, resolveResult.getSubstitutor());
final PsiSubstitutor superClassSubstitutor = TypeConversionUtil
.getClassSubstitutor(objectProperty, attributeClass, resolveResult.getSubstitutor());
if (superClassSubstitutor != null) {
final PsiType propertyType = superClassSubstitutor.substitute(objectProperty.getTypeParameters()[0]);
if (propertyType instanceof PsiClassType) {
final PsiClass psiClass = ((PsiClassType)propertyType).resolve();
if (psiClass != null && psiClass.isEnum()) {
return psiClass;
}
return ((PsiClassType)propertyType).resolve();
}
}
}
@@ -99,7 +101,7 @@ public class JavaFxPropertyAttributeDescriptor implements XmlAttributeDescriptor
}
return null;
}
@Nullable
@Override
public String validateValue(XmlElement context, String value) {