diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXQuickfixTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXQuickfixTest.java index 3b7239fd5702..196753d84891 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXQuickfixTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXQuickfixTest.java @@ -40,12 +40,12 @@ import java.util.Set; public class JavaFXQuickfixTest extends LightCodeInsightFixtureTestCase { public static final DefaultLightProjectDescriptor JAVA_FX_WITH_GROOVY_DESCRIPTOR = new DefaultLightProjectDescriptor() { @Override - public void configureModule(@NotNull Module module, @NotNull ModifiableRootModel model, @NotNull ContentEntry contentEntry) { + public void configureModule(@NotNull Module module, @NotNull ModifiableRootModel model, @NotNull ContentEntry contentEntry) { AbstractJavaFXTestCase.addJavaFxJarAsLibrary(module, model); - PsiTestUtil.addLibrary(module, model, "javafx", PluginPathManager.getPluginHomePath("javaFX") + "/testData", "groovy-1.8.0.jar"); - super.configureModule(module, model, contentEntry); - } - }; + PsiTestUtil.addLibrary(module, model, "javafx", PluginPathManager.getPluginHomePath("javaFX") + "/testData", "groovy-1.8.0.jar"); + super.configureModule(module, model, contentEntry); + } + }; @NotNull @Override @@ -106,7 +106,8 @@ public class JavaFXQuickfixTest extends LightCodeInsightFixtureTestCase { } public void testCreateMethodEscalateVisibility() throws Exception { - doTestWithDefaultVisibility("Create method 'void onAction(ActionEvent)'", "CreateMethod", VisibilityUtil.ESCALATE_VISIBILITY, ".java"); + doTestWithDefaultVisibility("Create method 'void onAction(ActionEvent)'", "CreateMethod", VisibilityUtil.ESCALATE_VISIBILITY, + ".java"); } public void testCreateFieldEmptyName() throws Exception { @@ -122,7 +123,8 @@ public class JavaFXQuickfixTest extends LightCodeInsightFixtureTestCase { assertNotNull(intention); Set languages = JavaFxInjectPageLanguageIntention.getAvailableLanguages(getProject()); assertContainsElements(languages, "groovy"); - JavaFxInjectPageLanguageIntention languageIntention = (JavaFxInjectPageLanguageIntention)((IntentionActionDelegate)intention).getDelegate(); + JavaFxInjectPageLanguageIntention languageIntention = + (JavaFxInjectPageLanguageIntention)((IntentionActionDelegate)intention).getDelegate(); languageIntention.registerPageLanguage(getProject(), (XmlFile)myFixture.getFile(), "groovy"); myFixture.checkResultByFile(getTestName(true) + ".fxml", getTestName(true) + "_after.fxml", true); } @@ -168,7 +170,7 @@ public class JavaFXQuickfixTest extends LightCodeInsightFixtureTestCase { super.setUp(); myFixture.enableInspections(new JavaFxUnresolvedFxIdReferenceInspection()); } - + @NotNull @Override protected String getTestDataPath() { diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxEventHandlerReference.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxEventHandlerReference.java index e359dd4bfc7b..b4fce902a350 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxEventHandlerReference.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxEventHandlerReference.java @@ -16,12 +16,16 @@ package org.jetbrains.plugins.javaFX.fxml.refs; import com.intellij.codeInsight.daemon.QuickFixActionRegistrar; -import com.intellij.codeInsight.daemon.impl.quickfix.CreateMethodQuickFix; +import com.intellij.codeInsight.intention.JvmCommonIntentionActionsFactory; +import com.intellij.codeInsight.intention.MethodInsertionInfo; import com.intellij.codeInsight.quickfix.UnresolvedReferenceQuickFixProvider; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.codeStyle.SuggestedNameInfo; +import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.psi.xml.XmlAttribute; @@ -34,6 +38,7 @@ import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonNames; import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class JavaFxEventHandlerReference extends PsiReferenceBase { @@ -59,8 +64,8 @@ public class JavaFxEventHandlerReference extends PsiReferenceBase availableHandlers = new ArrayList<>(); for (PsiMethod psiMethod : myController.getAllMethods()) { if (isHandlerMethodSignature(psiMethod, myController) && JavaFxPsiUtil.isVisibleInFxml(psiMethod)) { - availableHandlers.add(psiMethod); - } + availableHandlers.add(psiMethod); + } } return availableHandlers.isEmpty() ? EMPTY_ARRAY : ArrayUtil.toObjectArray(availableHandlers); } @@ -92,30 +97,58 @@ public class JavaFxEventHandlerReference extends PsiReferenceBase { + public static class JavaFxUnresolvedReferenceHandlerQuickfixProvider + extends UnresolvedReferenceQuickFixProvider { @Override public void registerFixes(@NotNull final JavaFxEventHandlerReference ref, @NotNull final QuickFixActionRegistrar registrar) { if (ref.myController != null && ref.myEventHandler == null) { - final CreateMethodQuickFix quickFix = CreateMethodQuickFix.createFix(ref.myController, getHandlerSignature(ref), ""); - if (quickFix != null) { - registrar.register(quickFix); - } + JvmCommonIntentionActionsFactory intentionActionsFactory = + JvmCommonIntentionActionsFactory.forLanguage(ref.myController.getLanguage()); + if (intentionActionsFactory == null) return; + + String javaSignature = getHandlerSignature(ref); + PsiMethod javaMethod = JavaPsiFacade.getElementFactory(ref.myController.getProject()) + .createMethodFromText(javaSignature, ref.myController); + + MethodInsertionInfo.Method method = + MethodInsertionInfo.simpleMethodInfo(ref.myController, + javaMethod.getName(), + javaMethod.getModifierList().getText(), + javaMethod.getReturnType(), + Arrays.asList(javaMethod.getParameterList().getParameters())); + intentionActionsFactory.createAddCallableMemberActions(method).forEach(registrar::register); } } private static String getHandlerSignature(JavaFxEventHandlerReference ref) { final XmlAttributeValue element = ref.getElement(); - String canonicalText = JavaFxCommonNames.JAVAFX_EVENT; + PsiType eventType = getEventType(element); + final String modifiers = getModifiers(element.getProject()); + return modifiers + " void " + element.getValue().substring(1) + "(" + + eventType.getCanonicalText() + " " + suggestParamName(element.getProject(), eventType) + + ")"; + } + + private static String suggestParamName(Project project, PsiType eventType) { + SuggestedNameInfo suggestedInfo = JavaCodeStyleManager.getInstance(project) + .suggestVariableName(VariableKind.PARAMETER, null, null, eventType); + if (suggestedInfo.names.length < 1) { + return "e"; + } + return suggestedInfo.names[0]; + } + + @NotNull + private static PsiType getEventType(XmlAttributeValue element) { final PsiElement parent = element.getParent(); if (parent instanceof XmlAttribute) { final PsiClassType eventType = JavaFxPsiUtil.getDeclaredEventType((XmlAttribute)parent); if (eventType != null) { - canonicalText = eventType.getCanonicalText(); + return eventType; } } - final String modifiers = getModifiers(element.getProject()); - return modifiers + " void " + element.getValue().substring(1) + "(" + canonicalText + " e)"; + return PsiType.getTypeByName(JavaFxCommonNames.JAVAFX_EVENT, element.getProject(), element.getResolveScope()); } @NotNull diff --git a/plugins/javaFX/testData/inspections/eventHandler/QuickfixHalfRaw_after.java b/plugins/javaFX/testData/inspections/eventHandler/QuickfixHalfRaw_after.java index 95e7e418114f..3ee137da3bd9 100644 --- a/plugins/javaFX/testData/inspections/eventHandler/QuickfixHalfRaw_after.java +++ b/plugins/javaFX/testData/inspections/eventHandler/QuickfixHalfRaw_after.java @@ -7,6 +7,5 @@ public class QuickfixHalfRaw { @FXML TableView table; public void onSort(SortEvent> tableViewSortEvent) { - } } diff --git a/plugins/javaFX/testData/inspections/eventHandler/QuickfixNoFieldNested_after.java b/plugins/javaFX/testData/inspections/eventHandler/QuickfixNoFieldNested_after.java index dbd3ba34beae..3c31e95de47f 100644 --- a/plugins/javaFX/testData/inspections/eventHandler/QuickfixNoFieldNested_after.java +++ b/plugins/javaFX/testData/inspections/eventHandler/QuickfixNoFieldNested_after.java @@ -2,6 +2,5 @@ import javafx.scene.control.TableColumn.CellEditEvent; public class QuickfixNoFieldNested { public void onColumnEditStart(CellEditEvent cellEditEvent) { - } } diff --git a/plugins/javaFX/testData/inspections/eventHandler/QuickfixNoField_after.java b/plugins/javaFX/testData/inspections/eventHandler/QuickfixNoField_after.java index 55046662bd9f..909821015de3 100644 --- a/plugins/javaFX/testData/inspections/eventHandler/QuickfixNoField_after.java +++ b/plugins/javaFX/testData/inspections/eventHandler/QuickfixNoField_after.java @@ -3,6 +3,5 @@ import javafx.scene.control.TableView; public class QuickfixNoField { public void onSort(SortEvent tableViewSortEvent) { - } } diff --git a/plugins/javaFX/testData/inspections/eventHandler/QuickfixRaw_after.java b/plugins/javaFX/testData/inspections/eventHandler/QuickfixRaw_after.java index 73bd806e4d9c..d837356bd973 100644 --- a/plugins/javaFX/testData/inspections/eventHandler/QuickfixRaw_after.java +++ b/plugins/javaFX/testData/inspections/eventHandler/QuickfixRaw_after.java @@ -6,6 +6,5 @@ public class QuickfixRaw { @FXML TableView table; public void onSort(SortEvent tableViewSortEvent) { - } } diff --git a/plugins/javaFX/testData/inspections/eventHandler/QuickfixSpecific_after.java b/plugins/javaFX/testData/inspections/eventHandler/QuickfixSpecific_after.java index 9ad1f4c4332f..e94b44ce825d 100644 --- a/plugins/javaFX/testData/inspections/eventHandler/QuickfixSpecific_after.java +++ b/plugins/javaFX/testData/inspections/eventHandler/QuickfixSpecific_after.java @@ -8,6 +8,5 @@ public class QuickfixSpecific { TableView> table; public void onSort(SortEvent>> tableViewSortEvent) { - } } \ No newline at end of file diff --git a/plugins/javaFX/testData/inspections/eventHandler/QuickfixSuper_after.java b/plugins/javaFX/testData/inspections/eventHandler/QuickfixSuper_after.java index 02ba66adbea2..37f1e025890b 100644 --- a/plugins/javaFX/testData/inspections/eventHandler/QuickfixSuper_after.java +++ b/plugins/javaFX/testData/inspections/eventHandler/QuickfixSuper_after.java @@ -2,6 +2,5 @@ import javafx.scene.input.MouseEvent; public class QuickfixSuper{ public void click(MouseEvent mouseEvent) { - } } \ No newline at end of file diff --git a/plugins/javaFX/testData/quickfix/CreateControllerMethodGeneric_after.java b/plugins/javaFX/testData/quickfix/CreateControllerMethodGeneric_after.java index 25662ad5bfe1..49a0540150cd 100644 --- a/plugins/javaFX/testData/quickfix/CreateControllerMethodGeneric_after.java +++ b/plugins/javaFX/testData/quickfix/CreateControllerMethodGeneric_after.java @@ -9,6 +9,5 @@ public class CreateControllerMethodGeneric { TableView> table; public void onSort(SortEvent>> tableViewSortEvent) { - } } diff --git a/plugins/javaFX/testData/quickfix/CreateControllerMethodHalfRaw_after.java b/plugins/javaFX/testData/quickfix/CreateControllerMethodHalfRaw_after.java index d064fe1f4bb2..6942764dd744 100644 --- a/plugins/javaFX/testData/quickfix/CreateControllerMethodHalfRaw_after.java +++ b/plugins/javaFX/testData/quickfix/CreateControllerMethodHalfRaw_after.java @@ -9,6 +9,5 @@ public class CreateControllerMethodHalfRaw { TableView table; public void onSort(SortEvent> tableViewSortEvent) { - } } diff --git a/plugins/javaFX/testData/quickfix/CreateControllerMethodInGroovy_after.groovy b/plugins/javaFX/testData/quickfix/CreateControllerMethodInGroovy_after.groovy index 9537d414dc21..bddfc00fe53b 100644 --- a/plugins/javaFX/testData/quickfix/CreateControllerMethodInGroovy_after.groovy +++ b/plugins/javaFX/testData/quickfix/CreateControllerMethodInGroovy_after.groovy @@ -1,7 +1,5 @@ import javafx.event.ActionEvent public class CreateControllerMethodInGroovy { - public void bar(ActionEvent actionEvent) { - - } + public void bar(ActionEvent actionEvent) {} } \ No newline at end of file diff --git a/plugins/javaFX/testData/quickfix/CreateControllerMethod_after.java b/plugins/javaFX/testData/quickfix/CreateControllerMethod_after.java index d410e79b41fe..193f7642c3ae 100644 --- a/plugins/javaFX/testData/quickfix/CreateControllerMethod_after.java +++ b/plugins/javaFX/testData/quickfix/CreateControllerMethod_after.java @@ -2,6 +2,5 @@ import javafx.event.ActionEvent; public class CreateControllerMethod { public void bar(ActionEvent actionEvent) { - } } \ No newline at end of file diff --git a/plugins/javaFX/testData/quickfix/CreateMethodEscalateVisibility_after.java b/plugins/javaFX/testData/quickfix/CreateMethodEscalateVisibility_after.java index 20913689cd15..9b9a6dfdf051 100644 --- a/plugins/javaFX/testData/quickfix/CreateMethodEscalateVisibility_after.java +++ b/plugins/javaFX/testData/quickfix/CreateMethodEscalateVisibility_after.java @@ -4,6 +4,5 @@ import javafx.fxml.FXML; public class CreateMethod { @FXML private void onAction(ActionEvent actionEvent) { - } } \ No newline at end of file diff --git a/plugins/javaFX/testData/quickfix/CreateMethodPackageLocalVisibility_after.java b/plugins/javaFX/testData/quickfix/CreateMethodPackageLocalVisibility_after.java index db22d3ef4123..94777309d719 100644 --- a/plugins/javaFX/testData/quickfix/CreateMethodPackageLocalVisibility_after.java +++ b/plugins/javaFX/testData/quickfix/CreateMethodPackageLocalVisibility_after.java @@ -4,6 +4,5 @@ import javafx.fxml.FXML; public class CreateMethod { @FXML void onAction(ActionEvent actionEvent) { - } } \ No newline at end of file diff --git a/plugins/javaFX/testData/quickfix/CreateMethodPrivateVisibility_after.java b/plugins/javaFX/testData/quickfix/CreateMethodPrivateVisibility_after.java index 20913689cd15..9b9a6dfdf051 100644 --- a/plugins/javaFX/testData/quickfix/CreateMethodPrivateVisibility_after.java +++ b/plugins/javaFX/testData/quickfix/CreateMethodPrivateVisibility_after.java @@ -4,6 +4,5 @@ import javafx.fxml.FXML; public class CreateMethod { @FXML private void onAction(ActionEvent actionEvent) { - } } \ No newline at end of file diff --git a/plugins/javaFX/testData/quickfix/CreateMethodProtectedVisibility_after.java b/plugins/javaFX/testData/quickfix/CreateMethodProtectedVisibility_after.java index 8ab76bb9ccb8..a09c8da422cf 100644 --- a/plugins/javaFX/testData/quickfix/CreateMethodProtectedVisibility_after.java +++ b/plugins/javaFX/testData/quickfix/CreateMethodProtectedVisibility_after.java @@ -4,6 +4,5 @@ import javafx.fxml.FXML; public class CreateMethod { @FXML protected void onAction(ActionEvent actionEvent) { - } } \ No newline at end of file diff --git a/plugins/javaFX/testData/quickfix/CreateMethodPublicVisibility_after.java b/plugins/javaFX/testData/quickfix/CreateMethodPublicVisibility_after.java index 36687f750c0d..8233bee8152a 100644 --- a/plugins/javaFX/testData/quickfix/CreateMethodPublicVisibility_after.java +++ b/plugins/javaFX/testData/quickfix/CreateMethodPublicVisibility_after.java @@ -2,6 +2,5 @@ import javafx.event.ActionEvent; public class CreateMethod { public void onAction(ActionEvent actionEvent) { - } } \ No newline at end of file