From f700266b11b69320144ffbfa54874da0f81a3b3d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 6 Sep 2013 18:42:41 +0400 Subject: [PATCH] Don't produce run configurations for files out of source roots #KT-3973 Fixed --- .../jetbrains/jet/plugin/JetPluginUtil.java | 12 ++++++++++ .../run/JetJUnitConfigurationProducer.java | 5 +++++ .../run/JetRunConfigurationProducer.java | 22 +++++++++++-------- .../run/JetTestNgConfigurationProducer.java | 5 +++++ 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java b/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java index 2595c83b7e9..5ec69cce831 100644 --- a/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java +++ b/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java @@ -101,6 +101,18 @@ public class JetPluginUtil { return ProjectFileIndex.SERVICE.getInstance(element.getProject()).isInSourceContent(virtualFile); } + public static boolean isInSource(@NotNull PsiElement element) { + PsiFile containingFile = element.getContainingFile(); + if (containingFile == null) { + return false; + } + VirtualFile virtualFile = containingFile.getVirtualFile(); + if (virtualFile == null) { + return false; + } + return ProjectFileIndex.SERVICE.getInstance(element.getProject()).isInSource(virtualFile); + } + @NotNull public static String getPluginVersion() { IdeaPluginDescriptor plugin = PluginManager.getPlugin(PluginId.getId("org.jetbrains.kotlin")); diff --git a/idea/src/org/jetbrains/jet/plugin/run/JetJUnitConfigurationProducer.java b/idea/src/org/jetbrains/jet/plugin/run/JetJUnitConfigurationProducer.java index f0c5381c9c0..74c77692bf5 100644 --- a/idea/src/org/jetbrains/jet/plugin/run/JetJUnitConfigurationProducer.java +++ b/idea/src/org/jetbrains/jet/plugin/run/JetJUnitConfigurationProducer.java @@ -33,6 +33,7 @@ import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.asJava.LightClassUtil; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.plugin.JetPluginUtil; public class JetJUnitConfigurationProducer extends RuntimeConfigurationProducer { private JetElement myElement; @@ -50,6 +51,10 @@ public class JetJUnitConfigurationProducer extends RuntimeConfigurationProducer protected RunnerAndConfigurationSettings createConfigurationByElement(Location location, ConfigurationContext context) { PsiElement leaf = location.getPsiElement(); + if (!JetPluginUtil.isInSource(leaf)) { + return null; + } + if (!(leaf.getContainingFile() instanceof JetFile)) { return null; } diff --git a/idea/src/org/jetbrains/jet/plugin/run/JetRunConfigurationProducer.java b/idea/src/org/jetbrains/jet/plugin/run/JetRunConfigurationProducer.java index a358f257e22..f97fbf87612 100644 --- a/idea/src/org/jetbrains/jet/plugin/run/JetRunConfigurationProducer.java +++ b/idea/src/org/jetbrains/jet/plugin/run/JetRunConfigurationProducer.java @@ -32,6 +32,7 @@ import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.plugin.JetMainDetector; +import org.jetbrains.jet.plugin.JetPluginUtil; import org.jetbrains.jet.plugin.framework.KotlinFrameworkDetector; import java.util.List; @@ -61,30 +62,31 @@ public class JetRunConfigurationProducer extends RuntimeConfigurationProducer im return null; } - FqName startClassFQName = getStartClassFQName(location); - if (startClassFQName == null) { + JetFile file = getStartClassFile(location); + if (file == null || !JetPluginUtil.isInSource(file)) { return null; } + mySourceElement = file; + + FqName startClassFQName = PackageClassUtils.getPackageClassFqName(JetPsiUtil.getFQName(file)); + return createConfigurationByQName(module, configurationContext, startClassFQName); } @Nullable - private FqName getStartClassFQName(Location location) { + private static JetFile getStartClassFile(@NotNull Location location) { PsiFile psiFile = location.getPsiElement().getContainingFile(); if (psiFile instanceof JetFile) { JetFile jetFile = (JetFile) psiFile; if (JetMainDetector.hasMain(jetFile.getDeclarations())) { - mySourceElement = jetFile; - FqName fqName = JetPsiUtil.getFQName(jetFile); - return PackageClassUtils.getPackageClassFqName(fqName); + return jetFile; } } return null; } - @NotNull private RunnerAndConfigurationSettings createConfigurationByQName( @NotNull Module module, @@ -105,11 +107,13 @@ public class JetRunConfigurationProducer extends RuntimeConfigurationProducer im @NotNull List existingConfigurations, ConfigurationContext context ) { - FqName startClassFQName = getStartClassFQName(location); - if (startClassFQName == null) { + JetFile file = getStartClassFile(location); + if (file == null) { return null; } + FqName startClassFQName = PackageClassUtils.getPackageClassFqName(JetPsiUtil.getFQName(file)); + for (RunnerAndConfigurationSettings existingConfiguration : existingConfigurations) { if (existingConfiguration.getType() instanceof JetRunConfigurationType) { JetRunConfiguration jetConfiguration = (JetRunConfiguration)existingConfiguration.getConfiguration(); diff --git a/idea/src/org/jetbrains/jet/plugin/run/JetTestNgConfigurationProducer.java b/idea/src/org/jetbrains/jet/plugin/run/JetTestNgConfigurationProducer.java index 5aa848d0868..edbf0257a8d 100644 --- a/idea/src/org/jetbrains/jet/plugin/run/JetTestNgConfigurationProducer.java +++ b/idea/src/org/jetbrains/jet/plugin/run/JetTestNgConfigurationProducer.java @@ -34,6 +34,7 @@ import com.theoryinpractice.testng.util.TestNGUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.asJava.LightClassUtil; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.plugin.JetPluginUtil; public class JetTestNgConfigurationProducer extends TestNGConfigurationProducer { @Override @@ -51,6 +52,10 @@ public class JetTestNgConfigurationProducer extends TestNGConfigurationProducer Project project = context.getProject(); PsiElement leaf = location.getPsiElement(); + if (!JetPluginUtil.isInSource(leaf)) { + return false; + } + if (!(leaf.getContainingFile() instanceof JetFile)) { return false; }