diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationEditor.java b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationEditor.java index c0079a739c6..4a03846718f 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationEditor.java +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationEditor.java @@ -17,19 +17,26 @@ package org.jetbrains.kotlin.idea.run; import com.intellij.application.options.ModulesComboBox; +import com.intellij.execution.ExecutionBundle; import com.intellij.execution.JavaExecutionUtil; -import com.intellij.execution.ui.CommonJavaParametersPanel; -import com.intellij.execution.ui.ConfigurationModuleSelector; -import com.intellij.execution.ui.DefaultJreSelector; -import com.intellij.execution.ui.JrePathEditor; -import com.intellij.openapi.options.ConfigurationException; +import com.intellij.execution.configurations.ConfigurationUtil; +import com.intellij.execution.ui.*; +import com.intellij.ide.util.ClassFilter; +import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.module.Module; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.LabeledComponent; +import com.intellij.psi.JavaCodeFragment; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.util.PsiMethodUtil; +import com.intellij.ui.EditorTextFieldWithBrowseButton; import com.intellij.ui.PanelWithAnchor; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.asJava.classes.KtLightClass; import javax.swing.*; import java.awt.event.ActionEvent; @@ -37,7 +44,7 @@ import java.awt.event.ActionListener; public class KotlinRunConfigurationEditor extends SettingsEditor implements PanelWithAnchor { private JPanel mainPanel; - private LabeledComponent mainClass; + private LabeledComponent mainClass; private CommonJavaParametersPanel commonProgramParameters; private LabeledComponent moduleChooser; @@ -46,7 +53,33 @@ public class KotlinRunConfigurationEditor extends SettingsEditor PsiMethodUtil.findMainMethod(aClass)); + } + }; + return new ClassBrowser.MainClassBrowser(project, moduleSelector, ExecutionBundle.message("choose.main.class.dialog.title")) { + @Override + protected ClassFilter createFilter(Module module) { + return applicationClass; + } + }; + } + public KotlinRunConfigurationEditor(Project project) { + this.project = project; moduleSelector = new ConfigurationModuleSelector(project, moduleChooser.getComponent()); jrePathEditor.setDefaultJreSelector(DefaultJreSelector.fromModuleDependencies(moduleChooser.getComponent(), false)); commonProgramParameters.setModuleContext(moduleSelector.getModule()); @@ -56,12 +89,12 @@ public class KotlinRunConfigurationEditor extends SettingsEditor(); - JTextField myMainClassField = new JTextField(); - mainClass.setComponent(myMainClassField); + mainClass = new LabeledComponent<>(); + mainClass.setComponent(new EditorTextFieldWithBrowseButton(project, true, (declaration, place) -> { + if (declaration instanceof KtLightClass) { + KtLightClass aClass = (KtLightClass)declaration; + if (ConfigurationUtil.MAIN_CLASS.value(aClass) + && (PsiMethodUtil.findMainMethod(aClass) != null || place.getParent() != null) + && moduleSelector.findClass(((PsiClass)declaration).getQualifiedName()) != null) { + return JavaCodeFragment.VisibilityChecker.Visibility.VISIBLE; + } + } + return JavaCodeFragment.VisibilityChecker.Visibility.NOT_VISIBLE; + })); } @Override