From 7072cfb297eda132ea0fb395c3694a6c65bfb2d8 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 31 Mar 2017 14:22:08 +0200 Subject: [PATCH] convert RunManagerImpl to kotlin (cherry picked from commit 6bc353e6011c99249df161bd677024dd610f8ddd) --- .../execution/impl/RunManagerImpl.java | 1586 ++++++++--------- 1 file changed, 736 insertions(+), 850 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java index 479afb5e074e..593af9419572 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java @@ -14,1257 +14,1143 @@ * limitations under the License. */ -package com.intellij.execution.impl; +package com.intellij.execution.impl -import com.intellij.ProjectTopics; -import com.intellij.execution.*; -import com.intellij.execution.configurations.*; -import com.intellij.execution.runners.ExecutionEnvironment; -import com.intellij.execution.runners.ExecutionUtil; -import com.intellij.execution.ui.RunContentDescriptor; -import com.intellij.ide.util.PropertiesComponent; -import com.intellij.openapi.Disposable; -import com.intellij.openapi.components.*; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.project.IndexNotReadyException; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ModuleRootEvent; -import com.intellij.openapi.roots.ModuleRootListener; -import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.UnknownFeaturesCollector; -import com.intellij.openapi.util.InvalidDataException; -import com.intellij.openapi.util.JDOMExternalizableStringList; -import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.registry.Registry; -import com.intellij.util.EventDispatcher; -import com.intellij.util.IconUtil; -import com.intellij.util.SmartList; -import com.intellij.util.containers.ContainerUtil; -import gnu.trove.THashMap; -import gnu.trove.THashSet; -import org.jdom.Element; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.intellij.ProjectTopics +import com.intellij.configurationStore.* +import com.intellij.execution.* +import com.intellij.execution.configurations.* +import com.intellij.execution.runners.ExecutionEnvironment +import com.intellij.execution.runners.ExecutionUtil +import com.intellij.ide.util.PropertiesComponent +import com.intellij.openapi.Disposable +import com.intellij.openapi.components.* +import com.intellij.openapi.diagnostic.catchAndLog +import com.intellij.openapi.diagnostic.logger +import com.intellij.openapi.extensions.Extensions +import com.intellij.openapi.options.Scheme +import com.intellij.openapi.options.SchemeManagerFactory +import com.intellij.openapi.options.SchemeState +import com.intellij.openapi.project.IndexNotReadyException +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.ModuleRootEvent +import com.intellij.openapi.roots.ModuleRootListener +import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.UnknownFeaturesCollector +import com.intellij.openapi.util.InvalidDataException +import com.intellij.openapi.util.JDOMExternalizableStringList +import com.intellij.openapi.util.Key +import com.intellij.openapi.util.Pair +import com.intellij.openapi.util.registry.Registry +import com.intellij.util.EventDispatcher +import com.intellij.util.IconUtil +import com.intellij.util.SmartList +import com.intellij.util.containers.ContainerUtil +import gnu.trove.THashMap +import gnu.trove.THashSet +import org.jdom.Element +import java.util.* +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.ConcurrentSkipListMap +import java.util.function.Function +import javax.swing.Icon +import kotlin.properties.Delegates -import javax.swing.*; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentSkipListMap; +private val LOG = logger() -@State( - name = "RunManager", - defaultStateAsResource = true, - storages = @Storage(StoragePathMacros.WORKSPACE_FILE) -) -public abstract class RunManagerImpl extends RunManagerEx implements PersistentStateComponent, NamedComponent, Disposable { - protected static final Logger LOG = Logger.getInstance(RunManagerImpl.class); +@State(name = "RunManager", defaultStateAsResource = true, storages = arrayOf(Storage(StoragePathMacros.WORKSPACE_FILE))) +abstract class RunManagerImpl(internal val project: Project, propertiesComponent: PropertiesComponent) : RunManagerEx(), PersistentStateComponent, NamedComponent, Disposable { + companion object { + @JvmField + val CONFIGURATION = "configuration" + protected val RECENT = "recent_temporary" + @JvmField + val NAME_ATTR = "name" + protected val SELECTED_ATTR = "selected" + private val METHOD = "method" + private val OPTION = "option" - final Project myProject; + @JvmStatic + fun getInstanceImpl(project: Project) = RunManager.getInstance(project) as RunManagerImpl - private final Map myTypesByName = new LinkedHashMap<>(); + @JvmStatic + fun canRunConfiguration(environment: ExecutionEnvironment): Boolean { + return environment.runnerAndConfigurationSettings?.let { canRunConfiguration(it, environment.executor) } ?: false + } - protected final Map myTemplateConfigurationsMap = new ConcurrentSkipListMap<>(); - private final Map myConfigurations = - new LinkedHashMap<>(); // template configurations are not included here - protected final Map mySharedConfigurations = new ConcurrentHashMap<>(); + @JvmStatic + fun canRunConfiguration(configuration: RunnerAndConfigurationSettings, executor: Executor): Boolean { + try { + configuration.checkSettings(executor) + } + catch (ignored: IndexNotReadyException) { + return Registry.`is`("dumb.aware.run.configurations") + } + catch (ignored: RuntimeConfigurationError) { + return false + } + catch (ignored: RuntimeConfigurationException) { + } + return true + } + } + + private val myTypesByName = LinkedHashMap() + + protected val myTemplateConfigurationsMap = ConcurrentSkipListMap() + private val myConfigurations = LinkedHashMap() // template configurations are not included here + protected val mySharedConfigurations: MutableMap = ConcurrentHashMap() // When readExternal not all configuration may be loaded, so we need to remember the selected configuration // so that when it is eventually loaded, we can mark is as a selected. - @Nullable private String myLoadedSelectedConfigurationUniqueName = null; - @Nullable protected String mySelectedConfigurationId = null; + private var myLoadedSelectedConfigurationUniqueName: String? = null + protected var mySelectedConfigurationId: String? = null - private final TimedIconCache myIconCache = new TimedIconCache(); + private val myIconCache = TimedIconCache() + private var myTypes: Array by Delegates.notNull() + private val myConfig = RunManagerConfig(propertiesComponent) - @NonNls - protected static final String CONFIGURATION = "configuration"; - protected static final String RECENT = "recent_temporary"; - private ConfigurationType[] myTypes; - private final RunManagerConfig myConfig; - @NonNls - protected static final String NAME_ATTR = "name"; - @NonNls - protected static final String SELECTED_ATTR = "selected"; - @NonNls private static final String METHOD = "method"; - @NonNls private static final String OPTION = "option"; + private var myUnknownElements: List? = null + private val myOrder = JDOMExternalizableStringList() + protected val myRecentlyUsedTemporaries = ArrayList() + private var myOrdered = true - private List myUnknownElements = null; - private final JDOMExternalizableStringList myOrder = new JDOMExternalizableStringList(); - protected final ArrayList myRecentlyUsedTemporaries = new ArrayList<>(); - private boolean myOrdered = true; + protected val myDispatcher = EventDispatcher.create(RunManagerListener::class.java)!! - protected final EventDispatcher myDispatcher = EventDispatcher.create(RunManagerListener.class); + protected val schemeManagerProvider = SchemeManagerIprProvider("configuration") - public RunManagerImpl(@NotNull Project project, @NotNull PropertiesComponent propertiesComponent) { - myConfig = new RunManagerConfig(propertiesComponent); - myProject = project; + protected val schemeManager = SchemeManagerFactory.getInstance(project).create("workspace", + object : LazySchemeProcessor() { + override fun createScheme(dataHolder: SchemeDataHolder, name: String, attributeProvider: Function, isBundled: Boolean): RunConfigurationScheme { + val settings = RunnerAndConfigurationSettingsImpl(this@RunManagerImpl) + val element = dataHolder.read() + try { + settings.readExternal(element) + } + catch (e: InvalidDataException) { + LOG.error(e) + } - initializeConfigurationTypes(ConfigurationType.CONFIGURATION_TYPE_EP.getExtensions()); - myProject.getMessageBus().connect().subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootListener() { - @Override - public void rootsChanged(ModuleRootEvent event) { - RunnerAndConfigurationSettings configuration = getSelectedConfiguration(); + val factory = settings.factory ?: return UnknownRunConfigurationScheme(name) + doLoadConfiguration(element, false, settings, factory) + return settings + } + + override fun getName(attributeProvider: Function, fileNameWithoutExtension: String): String { + var name = attributeProvider.apply("name") + if (name == "