From 830be91930f7c1e6381c0ed065dbd1eccbcdf695 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 18 Feb 2013 21:06:18 +0100 Subject: [PATCH] javafx: navigate to java from ref expression if possible (IDEA-101239) --- .../JavaFxComponentIdReferenceProvider.java | 11 ++++- .../refs/JavaFxFieldIdReferenceProvider.java | 49 ++++++++++++------- .../testData/rename/ControllerField.java | 3 ++ .../testData/rename/controllerField.fxml | 10 ++++ .../rename/controllerField_after.fxml | 10 ++++ .../plugins/javaFX/fxml/JavaFXRenameTest.java | 7 +-- 6 files changed, 68 insertions(+), 22 deletions(-) create mode 100644 plugins/javaFX/testData/rename/ControllerField.java create mode 100644 plugins/javaFX/testData/rename/controllerField.fxml create mode 100644 plugins/javaFX/testData/rename/controllerField_after.fxml diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxComponentIdReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxComponentIdReferenceProvider.java index cbd84f2adf28..3f344c1572f9 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxComponentIdReferenceProvider.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxComponentIdReferenceProvider.java @@ -68,7 +68,16 @@ class JavaFxComponentIdReferenceProvider extends PsiReferenceProvider { final String newId = StringUtil.getPackageName(expressionText); final String fieldRef = StringUtil.getShortName(expressionText); - final JavaFxIdReferenceBase idReferenceBase = new JavaFxIdReferenceBase(xmlAttributeValue, fileIds, newId); + final PsiReferenceBase idReferenceBase; + + final PsiClass controllerClass = JavaFxPsiUtil.getControllerClass(element.getContainingFile()); + final PsiField controllerField = controllerClass != null ? controllerClass.findFieldByName(newId, false) : null; + if (controllerField == null) { + idReferenceBase = new JavaFxIdReferenceBase(xmlAttributeValue, fileIds, newId); + } else { + idReferenceBase = new JavaFxFieldIdReferenceProvider.JavaFxControllerFieldRef(xmlAttributeValue, controllerField, controllerClass); + } + final TextRange range = idReferenceBase.getRangeInElement(); final int startOffset = range.getStartOffset() + 2; final int endOffset = startOffset + newId.length(); diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFieldIdReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFieldIdReferenceProvider.java index 9185b75fc511..c649a37f8639 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFieldIdReferenceProvider.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFieldIdReferenceProvider.java @@ -36,27 +36,40 @@ class JavaFxFieldIdReferenceProvider extends JavaFxControllerBasedReferenceProvi final XmlAttributeValue xmlAttributeValue, ProcessingContext context) { final PsiField field = aClass.findFieldByName(xmlAttributeValue.getValue(), false); - return new PsiReference[] {new PsiReferenceBase(xmlAttributeValue) { - @Nullable - @Override - public PsiElement resolve() { - return field != null ? field : xmlAttributeValue; - } + return new PsiReference[] {new JavaFxControllerFieldRef(xmlAttributeValue, field, aClass)}; + } - @NotNull - @Override - public Object[] getVariants() { - final List fieldsToSuggest = new ArrayList(); - final PsiField[] fields = aClass.getFields(); - for (PsiField psiField : fields) { - if (!psiField.hasModifierProperty(PsiModifier.STATIC)) { - if (JavaFxPsiUtil.isVisibleInFxml(psiField)) { - fieldsToSuggest.add(psiField); - } + public static class JavaFxControllerFieldRef extends PsiReferenceBase { + private final XmlAttributeValue myXmlAttributeValue; + private final PsiField myField; + private final PsiClass myAClass; + + public JavaFxControllerFieldRef(XmlAttributeValue xmlAttributeValue, PsiField field, PsiClass aClass) { + super(xmlAttributeValue); + myXmlAttributeValue = xmlAttributeValue; + myField = field; + myAClass = aClass; + } + + @Nullable + @Override + public PsiElement resolve() { + return myField != null ? myField : myXmlAttributeValue; + } + + @NotNull + @Override + public Object[] getVariants() { + final List fieldsToSuggest = new ArrayList(); + final PsiField[] fields = myAClass.getFields(); + for (PsiField psiField : fields) { + if (!psiField.hasModifierProperty(PsiModifier.STATIC)) { + if (JavaFxPsiUtil.isVisibleInFxml(psiField)) { + fieldsToSuggest.add(psiField); } } - return ArrayUtil.toObjectArray(fieldsToSuggest); } - }}; + return ArrayUtil.toObjectArray(fieldsToSuggest); + } } } diff --git a/plugins/javaFX/testData/rename/ControllerField.java b/plugins/javaFX/testData/rename/ControllerField.java new file mode 100644 index 000000000000..641873be25d9 --- /dev/null +++ b/plugins/javaFX/testData/rename/ControllerField.java @@ -0,0 +1,3 @@ +class ExampleController { + public PasswordField passwordField; +} diff --git a/plugins/javaFX/testData/rename/controllerField.fxml b/plugins/javaFX/testData/rename/controllerField.fxml new file mode 100644 index 000000000000..68e6b5522bcd --- /dev/null +++ b/plugins/javaFX/testData/rename/controllerField.fxml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/plugins/javaFX/testData/rename/controllerField_after.fxml b/plugins/javaFX/testData/rename/controllerField_after.fxml new file mode 100644 index 000000000000..1cf24b5717fb --- /dev/null +++ b/plugins/javaFX/testData/rename/controllerField_after.fxml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXRenameTest.java b/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXRenameTest.java index a755a0887b88..fb09f574a91f 100644 --- a/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXRenameTest.java +++ b/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXRenameTest.java @@ -17,15 +17,12 @@ package org.jetbrains.plugins.javaFX.fxml; import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.codeInsight.daemon.DaemonAnalyzerTestCase; -import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.openapi.application.PluginPathManager; import com.intellij.psi.PsiElement; import com.intellij.refactoring.rename.RenameProcessor; import com.intellij.testFramework.PsiTestUtil; import org.jetbrains.annotations.NotNull; -import java.util.List; - public class JavaFXRenameTest extends DaemonAnalyzerTestCase { @Override protected void setUpModule() { @@ -37,6 +34,10 @@ public class JavaFXRenameTest extends DaemonAnalyzerTestCase { doTest(getTestName(false) + "1"); } + public void testControllerField() throws Exception { + doTest("newFieldName"); + } + private void doTest(final String newName) throws Exception { configureByFiles(null, getTestName(true) + ".fxml", getTestName(false) + ".java"); PsiElement element = TargetElementUtilBase