mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-06 03:21:12 +07:00
Javafx: Don't allow renaming built-in $controller property, take two. Fixed boolean getter generation and renaming. Utility methods simplified. Tests added (IDEA-153758, IDEA-153751)
This commit is contained in:
@@ -17,14 +17,25 @@ package org.jetbrains.plugins.javaFX.fxml;
|
||||
|
||||
import com.intellij.codeInsight.TargetElementUtil;
|
||||
import com.intellij.codeInsight.daemon.DaemonAnalyzerTestCase;
|
||||
import com.intellij.openapi.actionSystem.CommonDataKeys;
|
||||
import com.intellij.openapi.application.PluginPathManager;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.refactoring.rename.PsiElementRenameHandler;
|
||||
import com.intellij.refactoring.rename.RenameHandler;
|
||||
import com.intellij.refactoring.rename.RenameHandlerRegistry;
|
||||
import com.intellij.refactoring.rename.RenameProcessor;
|
||||
import com.intellij.refactoring.rename.inplace.MemberInplaceRenameHandler;
|
||||
import com.intellij.testFramework.PsiTestUtil;
|
||||
import com.intellij.refactoring.util.CommonRefactoringUtil;
|
||||
import com.intellij.testFramework.MapDataContext;
|
||||
import com.intellij.testFramework.fixtures.CodeInsightTestUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.plugins.javaFX.refactoring.JavaFxPropertyRenameHandler;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Locale;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class JavaFXRenameTest extends DaemonAnalyzerTestCase {
|
||||
@Override
|
||||
@@ -66,7 +77,7 @@ public class JavaFXRenameTest extends DaemonAnalyzerTestCase {
|
||||
doTest(newName);
|
||||
final PsiClass controllerClass = findClass(getTestName(false));
|
||||
assertNotNull(controllerClass);
|
||||
assertNotNull(controllerClass.findFieldByName(newName, false));
|
||||
assertFieldExists(controllerClass, newName);
|
||||
}
|
||||
|
||||
public void testIdWithRefs() throws Exception {
|
||||
@@ -78,6 +89,98 @@ public class JavaFXRenameTest extends DaemonAnalyzerTestCase {
|
||||
checkResultByFile(getTestName(true) + "_after.fxml");
|
||||
}
|
||||
|
||||
public void testControllerBare() throws Exception {
|
||||
doTestErrorHint("Foo", "Cannot rename built-in property");
|
||||
}
|
||||
|
||||
public void testControllerInExpr() throws Exception {
|
||||
doTestErrorHint("Foo", "Cannot rename built-in property");
|
||||
}
|
||||
|
||||
private void doTestErrorHint(String newName, String message) throws Exception {
|
||||
try {
|
||||
doTest(newName, true);
|
||||
fail(message);
|
||||
}
|
||||
catch (CommonRefactoringUtil.RefactoringErrorHintException expectedException) {
|
||||
assertEquals(message, expectedException.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testPropertyRenameHandlerPresent() throws Exception {
|
||||
configureByFiles(null, getTestName(true) + ".fxml", getTestName(false) + ".java");
|
||||
final MapDataContext dataContext = new MapDataContext();
|
||||
dataContext.put(CommonDataKeys.EDITOR, myEditor);
|
||||
final RenameHandler renameHandler = RenameHandlerRegistry.getInstance().getRenameHandler(dataContext);
|
||||
assertTrue(renameHandler instanceof JavaFxPropertyRenameHandler);
|
||||
}
|
||||
|
||||
public void testControllerMethod() throws Exception {
|
||||
final PsiClass psiClass = doTestHandler("newName", null);
|
||||
assertMethodExists(psiClass, "getNewName");
|
||||
}
|
||||
|
||||
public void testControllerStringProperty() throws Exception {
|
||||
doTestProperty("newName", false);
|
||||
}
|
||||
|
||||
public void testControllerBooleanProperty() throws Exception {
|
||||
doTestProperty("newName", true);
|
||||
}
|
||||
|
||||
public void testModelIdProperty() throws Exception {
|
||||
doTestProperty("newName", "model.Data", false);
|
||||
}
|
||||
|
||||
public void testModelFieldProperty() throws Exception {
|
||||
doTestProperty("newName", "model.Data", false);
|
||||
}
|
||||
|
||||
public void doTestProperty(String name, boolean isBoolean) throws Exception {
|
||||
doTestProperty(name, null, isBoolean);
|
||||
}
|
||||
|
||||
public void doTestProperty(String name, String className, boolean isBoolean) throws Exception {
|
||||
final PsiClass psiClass = doTestHandler(name, className);
|
||||
final String propName = name.substring(0, 1).toUpperCase(Locale.ENGLISH) + name.substring(1);
|
||||
assertMethodExists(psiClass, (isBoolean ? "is" : "get") + propName);
|
||||
assertMethodExists(psiClass, "set" + propName);
|
||||
assertMethodExists(psiClass, name + "Property");
|
||||
assertFieldExists(psiClass, name);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public PsiClass doTestHandler(String newName, String className) throws Exception {
|
||||
if (className == null) {
|
||||
className = getTestName(false);
|
||||
configureByFiles(null, getTestName(true) + ".fxml", getTestName(false) + ".java");
|
||||
}
|
||||
else {
|
||||
configureByFiles(null, getTestName(true) + ".fxml", getTestName(false) + ".java", className.replace('.', '/') + ".java");
|
||||
}
|
||||
final MapDataContext dataContext = new MapDataContext();
|
||||
dataContext.put(CommonDataKeys.EDITOR, myEditor);
|
||||
dataContext.put(PsiElementRenameHandler.DEFAULT_NAME, newName);
|
||||
|
||||
final JavaFxPropertyRenameHandler renameHandler = new JavaFxPropertyRenameHandler();
|
||||
assertTrue(renameHandler.isAvailableOnDataContext(dataContext));
|
||||
renameHandler.invoke(myProject, myEditor, null, dataContext);
|
||||
checkResultByFile(getTestName(true) + "_after.fxml");
|
||||
|
||||
final PsiClass psiClass = findClass(className);
|
||||
assertNotNull(psiClass);
|
||||
return psiClass;
|
||||
}
|
||||
|
||||
private static void assertFieldExists(PsiClass controllerClass, String name) {
|
||||
assertNotNull(name, controllerClass.findFieldByName(name, false));
|
||||
}
|
||||
|
||||
private static void assertMethodExists(PsiClass controllerClass, String name) {
|
||||
final PsiMethod[] methods = controllerClass.findMethodsByName(name, false);
|
||||
assertOrderedEquals(Arrays.stream(methods).map(PsiMethod::getName).toArray(), name);
|
||||
}
|
||||
|
||||
private void doTest(final String newName) throws Exception {
|
||||
doTest(newName, false);
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ public class JavaFxGetterSetterPrototypeProvider extends GetterSetterPrototypePr
|
||||
final PsiMethod getter = GenerateMembersUtil.generateSimpleGetterPrototype(field);
|
||||
|
||||
final PsiType wrappedType = JavaFxPsiUtil.getWrappedPropertyType(field, project, JavaFxCommonNames.ourReadOnlyMap);
|
||||
getter.setName(PropertyUtil.suggestGetterName(PropertyUtil.suggestPropertyName(field), wrappedType));
|
||||
|
||||
final PsiTypeElement returnTypeElement = getter.getReturnTypeElement();
|
||||
LOG.assertTrue(returnTypeElement != null);
|
||||
|
||||
@@ -42,6 +42,7 @@ public class FxmlConstants {
|
||||
@NonNls public static final String RESOURCES = "resources";
|
||||
@NonNls public static final String CHARSET = "charset";
|
||||
@NonNls public static final String CONTROLLER = "controller";
|
||||
@NonNls public static final String CONTROLLER_SUFFIX = "Controller";
|
||||
|
||||
@NonNls public static final String STYLE_CLASS = "styleClass";
|
||||
@NonNls public static final String STYLESHEETS = "stylesheets";
|
||||
|
||||
@@ -244,27 +244,26 @@ public class JavaFxPsiUtil {
|
||||
final String getterName = PropertyUtil.suggestGetterName(propertyName, propertyType);
|
||||
final PsiMethod[] getters = psiClass.findMethodsByName(getterName, true);
|
||||
for (PsiMethod getter : getters) {
|
||||
if (isInstancePropertyGetterSignature(getter)) return getter;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static PsiMethod findObservablePropertyGetter(@NotNull PsiClass psiClass, @NotNull String propertyName) {
|
||||
final PsiMethod[] accessors = psiClass.findMethodsByName(propertyName + JavaFxCommonNames.PROPERTY_METHOD_SUFFIX, true);
|
||||
for (PsiMethod accessor : accessors) {
|
||||
if (isInstancePropertyGetterSignature(accessor) &&
|
||||
InheritanceUtil.isInheritor(accessor.getReturnType(), JavaFxCommonNames.JAVAFX_BEANS_VALUE_OBSERVABLE_VALUE)) {
|
||||
return accessor;
|
||||
if (getter.hasModifierProperty(PsiModifier.PUBLIC) &&
|
||||
!getter.hasModifierProperty(PsiModifier.STATIC) &&
|
||||
PropertyUtil.isSimplePropertyGetter(getter)) {
|
||||
return getter;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean isInstancePropertyGetterSignature(@NotNull PsiMethod method) {
|
||||
return method.hasModifierProperty(PsiModifier.PUBLIC) &&
|
||||
!method.hasModifierProperty(PsiModifier.STATIC) &&
|
||||
method.getParameterList().getParametersCount() == 0 &&
|
||||
!PsiType.VOID.equals(method.getReturnType());
|
||||
public static PsiMethod findObservablePropertyGetter(@NotNull PsiClass psiClass, @NotNull String propertyName) {
|
||||
final PsiMethod[] getters = psiClass.findMethodsByName(propertyName + JavaFxCommonNames.PROPERTY_METHOD_SUFFIX, true);
|
||||
for (PsiMethod getter : getters) {
|
||||
if (getter.hasModifierProperty(PsiModifier.PUBLIC) &&
|
||||
!getter.hasModifierProperty(PsiModifier.STATIC) &&
|
||||
getter.getParameterList().getParametersCount() == 0 &&
|
||||
InheritanceUtil.isInheritor(getter.getReturnType(), JavaFxCommonNames.JAVAFX_BEANS_VALUE_OBSERVABLE_VALUE)) {
|
||||
return getter;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static final Key<CachedValue<PsiClass>> INJECTED_CONTROLLER = Key.create("javafx.injected.controller");
|
||||
@@ -962,17 +961,15 @@ public class JavaFxPsiUtil {
|
||||
final String suggestedSetterName = PropertyUtil.suggestSetterName(propertyName);
|
||||
final PsiMethod[] setters = psiClass.findMethodsByName(suggestedSetterName, true);
|
||||
for (PsiMethod setter : setters) {
|
||||
if (isInstancePropertySetterSignature(setter)) return setter;
|
||||
if (setter.hasModifierProperty(PsiModifier.PUBLIC) &&
|
||||
!setter.hasModifierProperty(PsiModifier.STATIC) &&
|
||||
PropertyUtil.isSimplePropertySetter(setter)) {
|
||||
return setter;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean isInstancePropertySetterSignature(@NotNull PsiMethod method) {
|
||||
return !method.hasModifierProperty(PsiModifier.STATIC) &&
|
||||
method.hasModifierProperty(PsiModifier.PUBLIC) &&
|
||||
method.getParameterList().getParametersCount() == 1;
|
||||
}
|
||||
|
||||
private static boolean isWritablePropertyType(@NotNull PsiClass psiClass, @NotNull PsiType fieldType) {
|
||||
return isObservableCollection(PsiUtil.resolveClassInType(fieldType)) &&
|
||||
JavaGenericsUtil.getCollectionItemType(fieldType, psiClass.getResolveScope()) != null ||
|
||||
@@ -1107,15 +1104,10 @@ public class JavaFxPsiUtil {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static String getPropertyNameFromMemberName(@NotNull String name, boolean isMethod) {
|
||||
if(!isMethod) return name;
|
||||
if (name.startsWith("get") || name.startsWith("set")) {
|
||||
return StringUtil.decapitalize(name.substring(3));
|
||||
}
|
||||
else if (name.startsWith("is")) {
|
||||
return StringUtil.decapitalize(name.substring(2));
|
||||
}
|
||||
return name;
|
||||
public static String getPropertyName(@NotNull String memberName, boolean isMethod) {
|
||||
if (!isMethod) return memberName;
|
||||
final String propertyName = PropertyUtil.getPropertyName(memberName);
|
||||
return propertyName != null ? propertyName : memberName;
|
||||
}
|
||||
|
||||
private static class JavaFxControllerCachedValueProvider implements CachedValueProvider<PsiClass> {
|
||||
|
||||
@@ -190,7 +190,7 @@ class JavaFxComponentIdReferenceProvider extends PsiReferenceProvider {
|
||||
}
|
||||
}
|
||||
|
||||
private static class JavaFxIdReferenceBase extends PsiReferenceBase<XmlAttributeValue> {
|
||||
private static class JavaFxIdReferenceBase extends PsiReferenceBase<XmlAttributeValue> implements JavaFxIdAttributeReference {
|
||||
private final Map<String, XmlAttributeValue> myFileIds;
|
||||
private final Set<String> myAcceptableIds;
|
||||
private final Map<String, TypeMatch> myTypeMatches;
|
||||
@@ -231,6 +231,11 @@ class JavaFxComponentIdReferenceProvider extends PsiReferenceProvider {
|
||||
.map(id -> PrioritizedLookupElement.withPriority(LookupElementBuilder.create(id), TypeMatch.getPriority(myTypeMatches.get(id))))
|
||||
.toArray(LookupElement[]::new);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBuiltIn() {
|
||||
return FxmlConstants.CONTROLLER.equals(myReferencesId) || myReferencesId.endsWith(FxmlConstants.CONTROLLER_SUFFIX);
|
||||
}
|
||||
}
|
||||
|
||||
private static class JavaFxExpressionReferenceBase extends PsiReferenceBase<XmlAttributeValue> implements JavaFxPropertyReference {
|
||||
@@ -311,7 +316,8 @@ class JavaFxComponentIdReferenceProvider extends PsiReferenceProvider {
|
||||
|
||||
@Override
|
||||
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
|
||||
return super.handleElementRename(JavaFxPsiUtil.getPropertyNameFromMemberName(newElementName, resolve() instanceof PsiMethod));
|
||||
final String newPropertyName = JavaFxPsiUtil.getPropertyName(newElementName, resolve() instanceof PsiMethod);
|
||||
return super.handleElementRename(newPropertyName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +162,8 @@ public class JavaFxFieldIdReferenceProvider extends JavaFxControllerBasedReferen
|
||||
|
||||
@Override
|
||||
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
|
||||
return super.handleElementRename(JavaFxPsiUtil.getPropertyNameFromMemberName(newElementName, myFieldOrMethod instanceof PsiMethod));
|
||||
final String newPropertyName = JavaFxPsiUtil.getPropertyName(newElementName, myFieldOrMethod instanceof PsiMethod);
|
||||
return super.handleElementRename(newPropertyName);
|
||||
}
|
||||
|
||||
private PsiClass getGuessedTagClass() {
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.jetbrains.plugins.javaFX.fxml.refs;
|
||||
|
||||
import com.intellij.psi.PsiReference;
|
||||
|
||||
/**
|
||||
* @author Pavel.Dolgov
|
||||
*/
|
||||
public interface JavaFxIdAttributeReference extends PsiReference {
|
||||
boolean isBuiltIn();
|
||||
}
|
||||
@@ -14,33 +14,6 @@ import java.util.Map;
|
||||
* @author Pavel.Dolgov
|
||||
*/
|
||||
public interface JavaFxPropertyReference extends PsiReference {
|
||||
default boolean isRenameable() {
|
||||
return resolve() != null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
default Map<PsiElement, String> getElementsToRename(@NotNull String newPropertyName) {
|
||||
final Map<PsiElement, String> rename = new THashMap<>();
|
||||
final PsiField field = getField();
|
||||
if (field != null) {
|
||||
rename.put(field, newPropertyName);
|
||||
}
|
||||
final PsiMethod getter = getGetter();
|
||||
if (getter != null) {
|
||||
rename.put(getter, PropertyUtil.suggestGetterName(newPropertyName, getter.getReturnType()));
|
||||
}
|
||||
final PsiMethod setter = getSetter();
|
||||
if (setter != null) {
|
||||
rename.put(setter, PropertyUtil.suggestSetterName(newPropertyName));
|
||||
}
|
||||
final PsiMethod observableGetter = getObservableGetter();
|
||||
if (observableGetter != null) {
|
||||
rename.put(observableGetter, newPropertyName + JavaFxCommonNames.PROPERTY_METHOD_SUFFIX);
|
||||
}
|
||||
//TODO add "name" parameter of the observable property constructor (like new SimpleObjectProperty(this, "name", null);
|
||||
return rename;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
PsiMethod getGetter();
|
||||
|
||||
|
||||
@@ -6,9 +6,11 @@ import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.DialogWrapper;
|
||||
import com.intellij.psi.PsiDocumentManager;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiReference;
|
||||
import com.intellij.psi.util.PropertyUtil;
|
||||
import com.intellij.psi.xml.XmlFile;
|
||||
import com.intellij.refactoring.RenameRefactoring;
|
||||
import com.intellij.refactoring.openapi.impl.JavaRenameRefactoringImpl;
|
||||
@@ -16,9 +18,13 @@ import com.intellij.refactoring.rename.PsiElementRenameHandler;
|
||||
import com.intellij.refactoring.rename.RenameDialog;
|
||||
import com.intellij.refactoring.rename.RenameHandler;
|
||||
import com.intellij.refactoring.util.CommonRefactoringUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import gnu.trove.THashMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonNames;
|
||||
import org.jetbrains.plugins.javaFX.fxml.JavaFxFileTypeFactory;
|
||||
import org.jetbrains.plugins.javaFX.fxml.refs.JavaFxIdAttributeReference;
|
||||
import org.jetbrains.plugins.javaFX.fxml.refs.JavaFxPropertyReference;
|
||||
|
||||
import java.util.Map;
|
||||
@@ -30,7 +36,9 @@ public class JavaFxPropertyRenameHandler implements RenameHandler {
|
||||
@Override
|
||||
public boolean isAvailableOnDataContext(DataContext dataContext) {
|
||||
final PsiReference reference = getReference(dataContext);
|
||||
return reference != null;
|
||||
if (reference instanceof JavaFxPropertyReference) return true;
|
||||
if (reference instanceof JavaFxIdAttributeReference) return ((JavaFxIdAttributeReference)reference).isBuiltIn();
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -40,31 +48,38 @@ public class JavaFxPropertyRenameHandler implements RenameHandler {
|
||||
|
||||
@Override
|
||||
public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) {
|
||||
//if (editor == null) {
|
||||
// editor = CommonDataKeys.EDITOR.getData(dataContext);
|
||||
//}
|
||||
//final PsiFile file = CommonDataKeys.PSI_FILE.getData(dataContext);
|
||||
final JavaFxPropertyReference reference = getReference(dataContext);
|
||||
performInvoke(project, editor, dataContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) {
|
||||
performInvoke(project, null, dataContext);
|
||||
}
|
||||
|
||||
private static void performInvoke(@NotNull Project project, @Nullable Editor editor, DataContext dataContext) {
|
||||
final PsiReference reference = getReference(dataContext);
|
||||
if (reference == null) return;
|
||||
if (reference.isRenameable()) {
|
||||
if (reference instanceof JavaFxIdAttributeReference && ((JavaFxIdAttributeReference)reference).isBuiltIn()) {
|
||||
CommonRefactoringUtil.showErrorHint(project, editor, "Cannot rename built-in property", null, null);
|
||||
return;
|
||||
}
|
||||
if ((reference instanceof JavaFxPropertyReference) && reference.resolve() != null) {
|
||||
final JavaFxPropertyReference propertyReference = (JavaFxPropertyReference)reference;
|
||||
if (ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
final String newName = PsiElementRenameHandler.DEFAULT_NAME.getData(dataContext);
|
||||
assert newName != null : "Rename property";
|
||||
doRename(reference, newName, false, false);
|
||||
doRename(propertyReference, newName, false, false);
|
||||
return;
|
||||
}
|
||||
final Map<PsiElement, String> elementsToRename = reference.getElementsToRename("a");
|
||||
for (PsiElement element : elementsToRename.keySet()) {
|
||||
final Map<String, PsiElement> elementsToRename = getElementsToRename(propertyReference, "a");
|
||||
for (PsiElement element : elementsToRename.values()) {
|
||||
if (!PsiElementRenameHandler.canRename(project, editor, element)) return;
|
||||
}
|
||||
final PsiElement psiElement = JavaFxPropertyElement.fromReference(reference);
|
||||
final PsiElement psiElement = JavaFxPropertyElement.fromReference(propertyReference);
|
||||
if (psiElement != null) {
|
||||
new PropertyRenameDialog(reference, psiElement, project, editor).show();
|
||||
new PropertyRenameDialog(propertyReference, psiElement, project, editor).show();
|
||||
}
|
||||
}
|
||||
else {
|
||||
CommonRefactoringUtil.showErrorHint(project, editor, "Cannot rename built-in property", null, null);
|
||||
}
|
||||
}
|
||||
|
||||
private static void doRename(JavaFxPropertyReference reference, String newName, final boolean searchInComments, boolean isPreview) {
|
||||
@@ -73,43 +88,44 @@ public class JavaFxPropertyRenameHandler implements RenameHandler {
|
||||
final RenameRefactoring rename = new JavaRenameRefactoringImpl(psiElement.getProject(), psiElement, newName, searchInComments, false);
|
||||
rename.setPreviewUsages(isPreview);
|
||||
|
||||
final Map<PsiElement, String> elementsToRename = reference.getElementsToRename(newName);
|
||||
for (Map.Entry<PsiElement, String> entry : elementsToRename.entrySet()) {
|
||||
rename.addElement(entry.getKey(), entry.getValue());
|
||||
final Map<String, PsiElement> elementsToRename = getElementsToRename(reference, newName);
|
||||
for (Map.Entry<String, PsiElement> entry : elementsToRename.entrySet()) {
|
||||
rename.addElement(entry.getValue(), entry.getKey());
|
||||
}
|
||||
rename.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) {
|
||||
final PsiReference reference = getReference(dataContext);
|
||||
//final PsiElement element = getElement(dataContext);
|
||||
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static JavaFxPropertyReference getReference(DataContext dataContext) {
|
||||
private static PsiReference getReference(DataContext dataContext) {
|
||||
final Editor editor = CommonDataKeys.EDITOR.getData(dataContext);
|
||||
final PsiFile file = CommonDataKeys.PSI_FILE.getData(dataContext);
|
||||
PsiFile file = CommonDataKeys.PSI_FILE.getData(dataContext);
|
||||
|
||||
//if (file == null && editor != null && ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
// final Project project = editor.getProject();
|
||||
// if (project != null) {
|
||||
// file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
|
||||
// }
|
||||
//}
|
||||
|
||||
if (editor != null && file instanceof XmlFile && JavaFxFileTypeFactory.isFxml(file)) {
|
||||
final int offset = editor.getCaretModel().getOffset();
|
||||
final PsiReference reference = file.findReferenceAt(offset);
|
||||
if (reference instanceof JavaFxPropertyReference) {
|
||||
return (JavaFxPropertyReference)reference;
|
||||
if (file == null && editor != null && ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
final Project project = editor.getProject();
|
||||
if (project != null) {
|
||||
file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
|
||||
}
|
||||
}
|
||||
|
||||
if (editor != null && file instanceof XmlFile && JavaFxFileTypeFactory.isFxml(file)) {
|
||||
final int offset = editor.getCaretModel().getOffset();
|
||||
return file.findReferenceAt(offset);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static Map<String, PsiElement> getElementsToRename(@NotNull JavaFxPropertyReference reference, @NotNull String newPropertyName) {
|
||||
final Map<String, PsiElement> rename = new THashMap<>();
|
||||
ContainerUtil.putIfNotNull(newPropertyName, reference.getField(), rename);
|
||||
ContainerUtil.putIfNotNull(PropertyUtil.suggestGetterName(newPropertyName, reference.getType()), reference.getGetter(), rename);
|
||||
ContainerUtil.putIfNotNull(PropertyUtil.suggestSetterName(newPropertyName), reference.getSetter(), rename);
|
||||
ContainerUtil.putIfNotNull(newPropertyName + JavaFxCommonNames.PROPERTY_METHOD_SUFFIX, reference.getObservableGetter(), rename);
|
||||
//TODO add "name" parameter of the observable property constructor (like new SimpleObjectProperty(this, "name", null);
|
||||
return rename;
|
||||
}
|
||||
|
||||
private static class PropertyRenameDialog extends RenameDialog {
|
||||
|
||||
private final JavaFxPropertyReference myPropertyReference;
|
||||
|
||||
2
plugins/javaFX/testData/rename/ControllerBare.java
Normal file
2
plugins/javaFX/testData/rename/ControllerBare.java
Normal file
@@ -0,0 +1,2 @@
|
||||
public class ControllerBare {
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
|
||||
public class ControllerBooleanProperty {
|
||||
private BooleanProperty flag = new SimpleBooleanProperty(false);
|
||||
|
||||
public BooleanProperty flagProperty() {
|
||||
return flag;
|
||||
}
|
||||
|
||||
public boolean getFlag() {
|
||||
return flag.get();
|
||||
}
|
||||
|
||||
public void setFlag(boolean flag) {
|
||||
this.flag.set(flag);
|
||||
}
|
||||
}
|
||||
5
plugins/javaFX/testData/rename/ControllerInExpr.java
Normal file
5
plugins/javaFX/testData/rename/ControllerInExpr.java
Normal file
@@ -0,0 +1,5 @@
|
||||
public class ControllerInExpr {
|
||||
public String getText() {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
5
plugins/javaFX/testData/rename/ControllerMethod.java
Normal file
5
plugins/javaFX/testData/rename/ControllerMethod.java
Normal file
@@ -0,0 +1,5 @@
|
||||
public class ControllerMethod {
|
||||
public String getText() {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
18
plugins/javaFX/testData/rename/ControllerStringProperty.java
Normal file
18
plugins/javaFX/testData/rename/ControllerStringProperty.java
Normal file
@@ -0,0 +1,18 @@
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
|
||||
public class ControllerStringProperty {
|
||||
private StringProperty text = new SimpleStringProperty("");
|
||||
|
||||
public StringProperty textProperty() {
|
||||
return text;
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return text.getValue();
|
||||
}
|
||||
|
||||
public void setText(String text) {
|
||||
this.text.setValue(text);
|
||||
}
|
||||
}
|
||||
7
plugins/javaFX/testData/rename/ModelFieldProperty.java
Normal file
7
plugins/javaFX/testData/rename/ModelFieldProperty.java
Normal file
@@ -0,0 +1,7 @@
|
||||
import model.Data;
|
||||
import javafx.fxml.FXML;
|
||||
|
||||
public class ModelFieldProperty {
|
||||
@FXML
|
||||
private Data data;
|
||||
}
|
||||
2
plugins/javaFX/testData/rename/ModelIdProperty.java
Normal file
2
plugins/javaFX/testData/rename/ModelIdProperty.java
Normal file
@@ -0,0 +1,2 @@
|
||||
public class ModelIdProperty {
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
class PropertyRenameHandlerPresent {
|
||||
public String getMyProp() {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
6
plugins/javaFX/testData/rename/controllerBare.fxml
Normal file
6
plugins/javaFX/testData/rename/controllerBare.fxml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<VBox fx:controller="ControllerBare"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<Label text="$contr<caret>oller"/>
|
||||
</VBox>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<VBox fx:controller="ControllerBooleanProperty"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<Label text="${controller.flag<caret>}"/>
|
||||
</VBox>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<VBox fx:controller="ControllerBooleanProperty"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<Label text="${controller.newName}"/>
|
||||
</VBox>
|
||||
6
plugins/javaFX/testData/rename/controllerInExpr.fxml
Normal file
6
plugins/javaFX/testData/rename/controllerInExpr.fxml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<VBox fx:controller="ControllerInExpr"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<Label text="${contr<caret>oller.text}"/>
|
||||
</VBox>
|
||||
6
plugins/javaFX/testData/rename/controllerMethod.fxml
Normal file
6
plugins/javaFX/testData/rename/controllerMethod.fxml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<VBox fx:controller="ControllerMethod"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<Label text="${controller.text<caret>}"/>
|
||||
</VBox>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<VBox fx:controller="ControllerMethod"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<Label text="${controller.newName}"/>
|
||||
</VBox>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<VBox fx:controller="ControllerStringProperty"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<Label text="${controller.text<caret>}"/>
|
||||
</VBox>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<VBox fx:controller="ControllerStringProperty"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<Label text="${controller.newName}"/>
|
||||
</VBox>
|
||||
20
plugins/javaFX/testData/rename/model/Data.java
Normal file
20
plugins/javaFX/testData/rename/model/Data.java
Normal file
@@ -0,0 +1,20 @@
|
||||
package model;
|
||||
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
|
||||
public class Data {
|
||||
private StringProperty fooProp = new SimpleStringProperty("");
|
||||
|
||||
public StringProperty fooPropProperty() {
|
||||
return fooProp;
|
||||
}
|
||||
|
||||
public String getFooProp() {
|
||||
return fooProp.getValue();
|
||||
}
|
||||
|
||||
public void setFooProp(String value) {
|
||||
fooProp.setValue(value);
|
||||
}
|
||||
}
|
||||
10
plugins/javaFX/testData/rename/modelFieldProperty.fxml
Normal file
10
plugins/javaFX/testData/rename/modelFieldProperty.fxml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import model.Data?>
|
||||
<VBox fx:controller="ModelFieldProperty"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<fx:define>
|
||||
<Data fx:id="data" />
|
||||
</fx:define>
|
||||
<Label text="${data.fooProp<caret>}"/>
|
||||
</VBox>
|
||||
10
plugins/javaFX/testData/rename/modelFieldProperty_after.fxml
Normal file
10
plugins/javaFX/testData/rename/modelFieldProperty_after.fxml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import model.Data?>
|
||||
<VBox fx:controller="ModelFieldProperty"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<fx:define>
|
||||
<Data fx:id="data" />
|
||||
</fx:define>
|
||||
<Label text="${data.newName<caret>}"/>
|
||||
</VBox>
|
||||
10
plugins/javaFX/testData/rename/modelIdProperty.fxml
Normal file
10
plugins/javaFX/testData/rename/modelIdProperty.fxml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import model.Data?>
|
||||
<VBox fx:controller="ModelIdProperty"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<fx:define>
|
||||
<Data fx:id="data" />
|
||||
</fx:define>
|
||||
<Label text="${data.fooProp<caret>}"/>
|
||||
</VBox>
|
||||
10
plugins/javaFX/testData/rename/modelIdProperty_after.fxml
Normal file
10
plugins/javaFX/testData/rename/modelIdProperty_after.fxml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import model.Data?>
|
||||
<VBox fx:controller="ModelIdProperty"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<fx:define>
|
||||
<Data fx:id="data" />
|
||||
</fx:define>
|
||||
<Label text="${data.newName<caret>}"/>
|
||||
</VBox>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<VBox fx:controller="PropertyRenameHandlerPresent"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<Label text="${controller.tex<caret>t}"/>
|
||||
</VBox>
|
||||
Reference in New Issue
Block a user