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 @@
+