[intellij sh] IDEA-260027 Avoid interception Run context configuration action for python files

GitOrigin-RevId: 3596d4b4c8ef79bc4d16aada023ca311a8723792
This commit is contained in:
Mikhail Mazurkevich
2022-09-12 21:04:54 +04:00
committed by intellij-monorepo-bot
parent bf6715a387
commit 2ab2db5a09
11 changed files with 76 additions and 0 deletions

1
.idea/modules.xml generated
View File

@@ -993,6 +993,7 @@
<module fileurl="file://$PROJECT_DIR$/plugins/sh/copyright/tests/intellij.sh.copyright.tests.iml" filepath="$PROJECT_DIR$/plugins/sh/copyright/tests/intellij.sh.copyright.tests.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/sh/core/intellij.sh.core.iml" filepath="$PROJECT_DIR$/plugins/sh/core/intellij.sh.core.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/sh/markdown/intellij.sh.markdown.iml" filepath="$PROJECT_DIR$/plugins/sh/markdown/intellij.sh.markdown.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/sh/python/intellij.sh.python.iml" filepath="$PROJECT_DIR$/plugins/sh/python/intellij.sh.python.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/sh/terminal/intellij.sh.terminal.iml" filepath="$PROJECT_DIR$/plugins/sh/terminal/intellij.sh.terminal.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/sh/core/tests/intellij.sh.tests.iml" filepath="$PROJECT_DIR$/plugins/sh/core/tests/intellij.sh.tests.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/space/jps-plugin/intellij.space.java.jps.iml" filepath="$PROJECT_DIR$/plugins/space/jps-plugin/intellij.space.java.jps.iml" />

View File

@@ -246,6 +246,7 @@ object CommunityRepositoryModules {
"intellij.sh.core",
"intellij.sh.terminal",
"intellij.sh.copyright",
"intellij.sh.python",
"intellij.sh.markdown")
)
},

View File

@@ -1,6 +1,12 @@
<idea-plugin>
<resource-bundle>messages.ShBundle</resource-bundle>
<extensionPoints>
<extensionPoint qualifiedName="com.intellij.runMarkerContributionAdditionalCondition"
interface="com.intellij.sh.run.ShRunnerAdditionalCondition"
dynamic="true"/>
</extensionPoints>
<extensions defaultExtensionNs="com.intellij">
<fileType language="Shell Script" extensions="bash;sh;zsh" hashBangs="bash;sh;zsh" fieldName="INSTANCE" name="Shell Script"
implementationClass="com.intellij.sh.ShFileType"/>

View File

@@ -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("#!");

View File

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

View File

@@ -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<ShRunnerAdditionalCondition> EP = ExtensionPointName.create("com.intellij.runMarkerContributionAdditionalCondition");
boolean isRunningProhibitedForElement(@NotNull PsiElement element);
boolean isRunningProhibitedForFile(@NotNull PsiFile file);
}

View File

@@ -11,5 +11,6 @@
<orderEntry type="module" module-name="intellij.sh.terminal" />
<orderEntry type="module" module-name="intellij.sh.copyright" />
<orderEntry type="module" module-name="intellij.sh.markdown" />
<orderEntry type="module" module-name="intellij.sh.python" />
</component>
</module>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="intellij.python.psi" />
<orderEntry type="module" module-name="intellij.sh.core" />
<orderEntry type="module" module-name="intellij.platform.core" />
</component>
</module>

View File

@@ -0,0 +1,8 @@
<idea-plugin package="com.intellij.sh.python">
<dependencies>
<plugin id="com.intellij.modules.python"/>
</dependencies>
<extensions defaultExtensionNs="com.intellij">
<runMarkerContributionAdditionalCondition implementation="com.intellij.sh.python.PythonFileMarkerContributionAdditionalCondition"/>
</extensions>
</idea-plugin>

View File

@@ -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;
}
}

View File

@@ -8,6 +8,7 @@
<module name="intellij.sh.terminal"/>
<module name="intellij.sh.copyright"/>
<module name="intellij.sh.markdown"/>
<module name="intellij.sh.python"/>
</content>
<dependencies>
<plugin id="com.intellij.modules.lang"/>