Javafx: Take into account member visibility settings when creating event handler method for FXML. Tests added. (IDEA-151695)

This commit is contained in:
Pavel Dolgov
2016-05-13 12:03:42 +03:00
parent 31adcbd7d3
commit 0777e2e8ab
9 changed files with 84 additions and 3 deletions

View File

@@ -88,6 +88,26 @@ public class JavaFXQuickfixTest extends LightCodeInsightFixtureTestCase {
doTestWithDefaultVisibility("Create field 'btn'", "CreateField", VisibilityUtil.ESCALATE_VISIBILITY, ".java");
}
public void testCreateMethodPublicVisibility() throws Exception {
doTestWithDefaultVisibility("Create method 'void onAction(ActionEvent)'", "CreateMethod", PsiModifier.PUBLIC, ".java");
}
public void testCreateMethodProtectedVisibility() throws Exception {
doTestWithDefaultVisibility("Create method 'void onAction(ActionEvent)'", "CreateMethod", PsiModifier.PROTECTED, ".java");
}
public void testCreateMethodPrivateVisibility() throws Exception {
doTestWithDefaultVisibility("Create method 'void onAction(ActionEvent)'", "CreateMethod", PsiModifier.PRIVATE, ".java");
}
public void testCreateMethodPackageLocalVisibility() throws Exception {
doTestWithDefaultVisibility("Create method 'void onAction(ActionEvent)'", "CreateMethod", PsiModifier.PACKAGE_LOCAL, ".java");
}
public void testCreateMethodEscalateVisibility() throws Exception {
doTestWithDefaultVisibility("Create method 'void onAction(ActionEvent)'", "CreateMethod", VisibilityUtil.ESCALATE_VISIBILITY, ".java");
}
public void testCreateFieldEmptyName() throws Exception {
String path = getTestName(true) + ".fxml";
final IntentionAction intention =
@@ -117,8 +137,7 @@ public class JavaFXQuickfixTest extends LightCodeInsightFixtureTestCase {
private void doTestWithDefaultVisibility(final String actionName,
final String inputName,
final String defaultVisibility,
final String extension)
throws Exception {
final String extension) throws Exception {
CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject());
String savedVisibility = settings.VISIBILITY;
try {

View File

@@ -18,13 +18,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.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.util.InheritanceUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.util.ArrayUtil;
import com.intellij.util.VisibilityUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonNames;
@@ -115,7 +118,17 @@ public class JavaFxEventHandlerReference extends PsiReferenceBase<XmlAttributeVa
canonicalText = eventType.getCanonicalText();
}
}
return "public void " + element.getValue().substring(1) + "(" + canonicalText + " e)";
final String modifiers = getModifiers(element.getProject());
return modifiers + " void " + element.getValue().substring(1) + "(" + canonicalText + " e)";
}
@NotNull
private static String getModifiers(@NotNull Project project) {
String visibility = CodeStyleSettingsManager.getSettings(project).VISIBILITY;
if (VisibilityUtil.ESCALATE_VISIBILITY.equals(visibility)) visibility = PsiModifier.PRIVATE;
final boolean needAnnotation = !PsiModifier.PUBLIC.equals(visibility);
final String modifier = !PsiModifier.PACKAGE_LOCAL.equals(visibility) ? visibility : "";
return needAnnotation ? "@" + JavaFxCommonNames.JAVAFX_FXML_ANNOTATION + " " + modifier : modifier;
}
@NotNull

View File

@@ -0,0 +1 @@
public class CreateMethod {}

View File

@@ -0,0 +1,9 @@
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
public class CreateMethod {
@FXML
private void onAction(ActionEvent actionEvent) {
}
}

View File

@@ -0,0 +1,9 @@
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
public class CreateMethod {
@FXML
void onAction(ActionEvent actionEvent) {
}
}

View File

@@ -0,0 +1,9 @@
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
public class CreateMethod {
@FXML
private void onAction(ActionEvent actionEvent) {
}
}

View File

@@ -0,0 +1,9 @@
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
public class CreateMethod {
@FXML
protected void onAction(ActionEvent actionEvent) {
}
}

View File

@@ -0,0 +1,7 @@
import javafx.event.ActionEvent;
public class CreateMethod {
public void onAction(ActionEvent actionEvent) {
}
}

View File

@@ -0,0 +1,5 @@
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<GridPane xmlns:fx="http://javafx.com/fxml" fx:controller="CreateMethod">
<Button onAction="#onActi<caret>on"/>
</GridPane>