mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-89305 Run/debug actions are enabled for invalid run configurations
This commit is contained in:
@@ -14,6 +14,7 @@ import com.intellij.openapi.components.StoragePathMacros;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.registry.Registry;
|
||||
import com.intellij.util.Processor;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import gnu.trove.THashSet;
|
||||
@@ -183,11 +184,16 @@ public class ExecutionTargetManagerImpl extends ExecutionTargetManager implement
|
||||
boolean isCompound = settings.getConfiguration() instanceof CompoundRunConfiguration;
|
||||
if (isCompound && target == MULTIPLE_TARGETS) return true;
|
||||
|
||||
boolean useCache = ApplicationManager.getApplication().isInternal() || Registry.is("update.run.configuration.actions.from.cache");
|
||||
|
||||
ExecutionTarget defaultTarget = DefaultExecutionTarget.INSTANCE;
|
||||
boolean checkFallbackToDefault = isCompound
|
||||
&& !target.equals(defaultTarget);
|
||||
|
||||
return doWithEachNonCompoundWithSpecifiedTarget(settings, each -> {
|
||||
if (useCache && RunManagerImpl.getInstanceImpl(myProject).isInvalidInCache(each.first)) {
|
||||
return false;
|
||||
}
|
||||
RunConfiguration configuration = each.first.getConfiguration();
|
||||
if (!(configuration instanceof TargetAwareRunProfile)) return true;
|
||||
TargetAwareRunProfile targetAwareProfile = (TargetAwareRunProfile)configuration;
|
||||
|
||||
@@ -852,6 +852,10 @@ open class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persi
|
||||
return icon
|
||||
}
|
||||
|
||||
fun isInvalidInCache(settings: RunnerAndConfigurationSettings): Boolean {
|
||||
return iconCache.isInvalid(settings.uniqueID)
|
||||
}
|
||||
|
||||
fun getConfigurationById(id: String): RunnerAndConfigurationSettings? = lock.read { idToSettings.get(id) }
|
||||
|
||||
override fun findConfigurationByName(name: String?): RunnerAndConfigurationSettings? {
|
||||
|
||||
@@ -17,6 +17,7 @@ import kotlin.concurrent.write
|
||||
|
||||
class TimedIconCache {
|
||||
private val idToIcon = THashMap<String, Icon>()
|
||||
private val idToInvalid = THashMap<String, Boolean>()
|
||||
private val iconCheckTimes = ObjectLongHashMap<String>()
|
||||
private val iconCalcTime = ObjectLongHashMap<String>()
|
||||
|
||||
@@ -35,7 +36,6 @@ class TimedIconCache {
|
||||
idToIcon.get(id)?.let {
|
||||
return it
|
||||
}
|
||||
|
||||
val icon = IconDeferrer.getInstance().deferAutoUpdatable(settings.configuration.icon, project.hashCode() xor settings.hashCode()) {
|
||||
if (project.isDisposed) {
|
||||
return@deferAutoUpdatable null
|
||||
@@ -47,13 +47,13 @@ class TimedIconCache {
|
||||
|
||||
val startTime = System.currentTimeMillis()
|
||||
|
||||
val icon = calcIcon(settings, project)
|
||||
val icon2Valid = calcIcon(settings, project)
|
||||
|
||||
lock.write {
|
||||
iconCalcTime.put(id, System.currentTimeMillis() - startTime)
|
||||
idToInvalid.set(id, icon2Valid.second)
|
||||
}
|
||||
|
||||
icon
|
||||
icon2Valid.first
|
||||
}
|
||||
|
||||
set(id, icon)
|
||||
@@ -61,16 +61,22 @@ class TimedIconCache {
|
||||
}
|
||||
}
|
||||
|
||||
private fun calcIcon(settings: RunnerAndConfigurationSettings, project: Project): Icon {
|
||||
fun isInvalid(id: String) : Boolean {
|
||||
idToInvalid.get(id)?.let {return it}
|
||||
return false
|
||||
}
|
||||
|
||||
private fun calcIcon(settings: RunnerAndConfigurationSettings, project: Project): Pair<Icon, Boolean> {
|
||||
try {
|
||||
settings.checkSettings()
|
||||
return ProgramRunnerUtil.getConfigurationIcon(settings, false)
|
||||
return ProgramRunnerUtil.getConfigurationIcon(settings, false).to(false)
|
||||
}
|
||||
catch (e: IndexNotReadyException) {
|
||||
return ProgramRunnerUtil.getConfigurationIcon(settings, false)
|
||||
return ProgramRunnerUtil.getConfigurationIcon(settings, false).to(false)
|
||||
}
|
||||
catch (ignored: RuntimeConfigurationException) {
|
||||
return ProgramRunnerUtil.getConfigurationIcon(settings, !DumbService.isDumb(project))
|
||||
val invalid = !DumbService.isDumb(project)
|
||||
return ProgramRunnerUtil.getConfigurationIcon(settings, invalid).to(invalid)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1357,6 +1357,8 @@ ide.require.transaction.for.model.changes.description=Whether write action can o
|
||||
|
||||
select.run.configuration.from.context=true
|
||||
select.run.configuration.from.context.description=Select run configuration when run from context (gutter icon, popup menu)
|
||||
update.run.configuration.actions.from.cache=true
|
||||
update.run.configuration.actions.from.cache.description=Disable run actions on main toolbar if we have 'invalid' icon for it calculated recently in background
|
||||
run.configuration.max.name.length=80
|
||||
run.configuration.max.name.length.description=When name of run configuration exceeds the limit it would be trimmed in UI like 'LongNamedRunCo...'
|
||||
suggest.all.run.configurations.from.context=false
|
||||
|
||||
Reference in New Issue
Block a user