From 7abcc09fc3ca7ceb02a36679b41b547d58f5a619 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 18 Jan 2013 14:30:28 +0100 Subject: [PATCH] javafx: disable handler refs for inappropriate place --- .../javaFX/fxml/JavaFxCommonClassNames.java | 1 + .../JavaFxEventHandlerReferenceProvider.java | 25 ++++++++++++++++--- .../JavaFxPropertyAttributeDescriptor.java | 16 ++++++------ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java index 217b989d9ab0..23eebee69664 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java @@ -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"; } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxEventHandlerReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxEventHandlerReferenceProvider.java index ddfcb9c8c411..bf6fa19be092 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxEventHandlerReferenceProvider.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxEventHandlerReferenceProvider.java @@ -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); diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPropertyAttributeDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPropertyAttributeDescriptor.java index 6bc4651eb4c0..641188b6eddb 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPropertyAttributeDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPropertyAttributeDescriptor.java @@ -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) {