From 2ab2db5a09c775ab2bba194a7397b4af33148883 Mon Sep 17 00:00:00 2001 From: Mikhail Mazurkevich Date: Mon, 12 Sep 2022 21:04:54 +0400 Subject: [PATCH] [intellij sh] IDEA-260027 Avoid interception `Run context configuration` action for python files GitOrigin-RevId: 3596d4b4c8ef79bc4d16aada023ca311a8723792 --- .idea/modules.xml | 1 + .../build/CommunityRepositoryModules.kt | 1 + plugins/sh/core/resources/META-INF/sh.xml | 6 ++++++ .../com/intellij/sh/run/ShRunFileAction.java | 6 ++++++ .../sh/run/ShRunLineMarkerContributor.java | 4 ++++ .../sh/run/ShRunnerAdditionalCondition.java | 13 ++++++++++++ plugins/sh/intellij.sh.iml | 1 + plugins/sh/python/intellij.sh.python.iml | 15 ++++++++++++++ .../python/resources/intellij.sh.python.xml | 8 ++++++++ ...MarkerContributionAdditionalCondition.java | 20 +++++++++++++++++++ plugins/sh/resources/META-INF/plugin.xml | 1 + 11 files changed, 76 insertions(+) create mode 100644 plugins/sh/core/src/com/intellij/sh/run/ShRunnerAdditionalCondition.java create mode 100644 plugins/sh/python/intellij.sh.python.iml create mode 100644 plugins/sh/python/resources/intellij.sh.python.xml create mode 100644 plugins/sh/python/src/com/intellij/sh/python/PythonFileMarkerContributionAdditionalCondition.java diff --git a/.idea/modules.xml b/.idea/modules.xml index 113895eac672..dfccbdaae67f 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -993,6 +993,7 @@ + diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/CommunityRepositoryModules.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/CommunityRepositoryModules.kt index 636f43dcfef0..e8d76c5e1df1 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/CommunityRepositoryModules.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/CommunityRepositoryModules.kt @@ -246,6 +246,7 @@ object CommunityRepositoryModules { "intellij.sh.core", "intellij.sh.terminal", "intellij.sh.copyright", + "intellij.sh.python", "intellij.sh.markdown") ) }, diff --git a/plugins/sh/core/resources/META-INF/sh.xml b/plugins/sh/core/resources/META-INF/sh.xml index befb89792b60..7602f4d5dffc 100644 --- a/plugins/sh/core/resources/META-INF/sh.xml +++ b/plugins/sh/core/resources/META-INF/sh.xml @@ -1,6 +1,12 @@ messages.ShBundle + + + + diff --git a/plugins/sh/core/src/com/intellij/sh/run/ShRunFileAction.java b/plugins/sh/core/src/com/intellij/sh/run/ShRunFileAction.java index e460c29fffc9..27d9584b8940 100644 --- a/plugins/sh/core/src/com/intellij/sh/run/ShRunFileAction.java +++ b/plugins/sh/core/src/com/intellij/sh/run/ShRunFileAction.java @@ -22,6 +22,7 @@ import com.intellij.psi.PsiFile; import com.intellij.sh.parser.ShShebangParserUtil; import com.intellij.sh.psi.ShFile; import com.intellij.util.ObjectUtils; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; final class ShRunFileAction extends DumbAwareAction { @@ -95,6 +96,11 @@ final class ShRunFileAction extends DumbAwareAction { if (e.getProject() != null) { PsiFile file = e.getData(CommonDataKeys.PSI_FILE); if (file != null) { + var runningProhibited = ContainerUtil.exists(ShRunnerAdditionalCondition.EP.getExtensionsIfPointIsRegistered(), + runningCondition -> { + return runningCondition.isRunningProhibitedForFile(file); + }); + if (runningProhibited) return false; if (file instanceof ShFile) return true; PsiElement firstChild = file.findElementAt(0); return firstChild instanceof PsiComment && firstChild.getText().startsWith("#!"); diff --git a/plugins/sh/core/src/com/intellij/sh/run/ShRunLineMarkerContributor.java b/plugins/sh/core/src/com/intellij/sh/run/ShRunLineMarkerContributor.java index 6b121b7e6cc0..a297c3229a0e 100644 --- a/plugins/sh/core/src/com/intellij/sh/run/ShRunLineMarkerContributor.java +++ b/plugins/sh/core/src/com/intellij/sh/run/ShRunLineMarkerContributor.java @@ -23,6 +23,10 @@ final class ShRunLineMarkerContributor extends RunLineMarkerContributor implemen public Info getInfo(@NotNull PsiElement element) { if (element instanceof OuterLanguageElementImpl || !(element instanceof LeafElement ) || element.getTextRange().getStartOffset() != 0) return null; + var contributionProhibited = ContainerUtil.exists(ShRunnerAdditionalCondition.EP.getExtensionsIfPointIsRegistered(), additionalCondition -> { + return additionalCondition.isRunningProhibitedForElement(element); + }); + if (contributionProhibited) return null; PsiFile psiFile = element.getContainingFile(); if (!(psiFile instanceof ShFile) && !element.getText().startsWith("#!")) return null; diff --git a/plugins/sh/core/src/com/intellij/sh/run/ShRunnerAdditionalCondition.java b/plugins/sh/core/src/com/intellij/sh/run/ShRunnerAdditionalCondition.java new file mode 100644 index 000000000000..16246e785408 --- /dev/null +++ b/plugins/sh/core/src/com/intellij/sh/run/ShRunnerAdditionalCondition.java @@ -0,0 +1,13 @@ +package com.intellij.sh.run; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; + +public interface ShRunnerAdditionalCondition { + ExtensionPointName EP = ExtensionPointName.create("com.intellij.runMarkerContributionAdditionalCondition"); + + boolean isRunningProhibitedForElement(@NotNull PsiElement element); + boolean isRunningProhibitedForFile(@NotNull PsiFile file); +} diff --git a/plugins/sh/intellij.sh.iml b/plugins/sh/intellij.sh.iml index 8f52bcb153c4..eff434629988 100644 --- a/plugins/sh/intellij.sh.iml +++ b/plugins/sh/intellij.sh.iml @@ -11,5 +11,6 @@ + \ No newline at end of file diff --git a/plugins/sh/python/intellij.sh.python.iml b/plugins/sh/python/intellij.sh.python.iml new file mode 100644 index 000000000000..679338ce265c --- /dev/null +++ b/plugins/sh/python/intellij.sh.python.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sh/python/resources/intellij.sh.python.xml b/plugins/sh/python/resources/intellij.sh.python.xml new file mode 100644 index 000000000000..10b5b2e950c6 --- /dev/null +++ b/plugins/sh/python/resources/intellij.sh.python.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/sh/python/src/com/intellij/sh/python/PythonFileMarkerContributionAdditionalCondition.java b/plugins/sh/python/src/com/intellij/sh/python/PythonFileMarkerContributionAdditionalCondition.java new file mode 100644 index 000000000000..959cd6a5d84d --- /dev/null +++ b/plugins/sh/python/src/com/intellij/sh/python/PythonFileMarkerContributionAdditionalCondition.java @@ -0,0 +1,20 @@ +package com.intellij.sh.python; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.sh.run.ShRunnerAdditionalCondition; +import com.jetbrains.python.psi.PyFile; +import org.jetbrains.annotations.NotNull; + +public class PythonFileMarkerContributionAdditionalCondition implements ShRunnerAdditionalCondition { + @Override + public boolean isRunningProhibitedForElement(@NotNull PsiElement element) { + PsiFile psiFile = element.getContainingFile(); + return psiFile instanceof PyFile; + } + + @Override + public boolean isRunningProhibitedForFile(@NotNull PsiFile file) { + return file instanceof PyFile; + } +} diff --git a/plugins/sh/resources/META-INF/plugin.xml b/plugins/sh/resources/META-INF/plugin.xml index 40ea010016c5..a810283a0657 100644 --- a/plugins/sh/resources/META-INF/plugin.xml +++ b/plugins/sh/resources/META-INF/plugin.xml @@ -8,6 +8,7 @@ +