KT-1502 right click -> Run as JUnit test doesn't work in IDEA - show configuration over classes and files in project and structure views

This commit is contained in:
Nikolay Krasko
2012-03-06 17:40:18 +04:00
parent 21e6aa7242
commit 0c19d3add9
@@ -33,6 +33,7 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiMethod;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.asJava.JetLightClass; import org.jetbrains.jet.asJava.JetLightClass;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
@@ -51,10 +52,20 @@ public class JetJUnitConfigurationProducer extends RuntimeConfigurationProducer
@Override @Override
protected RunnerAndConfigurationSettings createConfigurationByElement(Location location, ConfigurationContext context) { protected RunnerAndConfigurationSettings createConfigurationByElement(Location location, ConfigurationContext context) {
PsiElement leaf = location.getPsiElement(); PsiElement leaf = location.getPsiElement();
JetNamedFunction function = PsiTreeUtil.getParentOfType(leaf, JetNamedFunction.class);
if (!(leaf.getContainingFile() instanceof JetFile)) {
return null;
}
JetFile jetFile = (JetFile) leaf.getContainingFile();
JetNamedFunction function = PsiTreeUtil.getParentOfType(leaf, JetNamedFunction.class, false);
if (function != null) { if (function != null) {
myElement = function; myElement = function;
@SuppressWarnings("unchecked")
JetElement owner = PsiTreeUtil.getParentOfType(function, JetFunction.class, JetClass.class); JetElement owner = PsiTreeUtil.getParentOfType(function, JetFunction.class, JetClass.class);
if (owner instanceof JetClass) { if (owner instanceof JetClass) {
JetLightClass delegate = wrapDelegate((JetClass) owner); JetLightClass delegate = wrapDelegate((JetClass) owner);
for (PsiMethod method : delegate.getMethods()) { for (PsiMethod method : delegate.getMethods()) {
@@ -62,12 +73,13 @@ public class JetJUnitConfigurationProducer extends RuntimeConfigurationProducer
Location<PsiMethod> methodLocation = PsiLocation.fromPsiElement(method); Location<PsiMethod> methodLocation = PsiLocation.fromPsiElement(method);
if (JUnitUtil.isTestMethod(methodLocation, false)) { if (JUnitUtil.isTestMethod(methodLocation, false)) {
RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(context.getProject(), context); RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(context.getProject(), context);
final JUnitConfiguration configuration = (JUnitConfiguration)settings.getConfiguration(); final JUnitConfiguration configuration = (JUnitConfiguration) settings.getConfiguration();
final Module originalModule = configuration.getConfigurationModule().getModule(); final Module originalModule = configuration.getConfigurationModule().getModule();
configuration.beMethodConfiguration(methodLocation); configuration.beMethodConfiguration(methodLocation);
configuration.restoreOriginalModule(originalModule); configuration.restoreOriginalModule(originalModule);
JavaRunConfigurationExtensionManager.getInstance().extendCreatedConfiguration(configuration, location); JavaRunConfigurationExtensionManager.getInstance().extendCreatedConfiguration(configuration, location);
return settings; return settings;
} }
break; break;
@@ -77,27 +89,53 @@ public class JetJUnitConfigurationProducer extends RuntimeConfigurationProducer
} }
} }
JetClass jetClass = PsiTreeUtil.getParentOfType(leaf, JetClass.class); JetClass jetClass = PsiTreeUtil.getParentOfType(leaf, JetClass.class, false);
if (jetClass == null) {
jetClass = getClassDeclarationInFile(jetFile);
}
if (jetClass != null) { if (jetClass != null) {
myElement = jetClass; myElement = jetClass;
PsiClass delegate = wrapDelegate(jetClass); PsiClass delegate = wrapDelegate(jetClass);
if (JUnitUtil.isTestClass(delegate)) { if (JUnitUtil.isTestClass(delegate)) {
RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(context.getProject(), context); RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(context.getProject(), context);
final JUnitConfiguration configuration = (JUnitConfiguration)settings.getConfiguration(); final JUnitConfiguration configuration = (JUnitConfiguration) settings.getConfiguration();
final Module originalModule = configuration.getConfigurationModule().getModule(); final Module originalModule = configuration.getConfigurationModule().getModule();
configuration.beClassConfiguration(delegate); configuration.beClassConfiguration(delegate);
configuration.restoreOriginalModule(originalModule); configuration.restoreOriginalModule(originalModule);
JavaRunConfigurationExtensionManager.getInstance().extendCreatedConfiguration(configuration, location); JavaRunConfigurationExtensionManager.getInstance().extendCreatedConfiguration(configuration, location);
return settings; return settings;
} }
} }
return null; return null;
} }
@Nullable
private static JetClass getClassDeclarationInFile(JetFile jetFile) {
JetClass tempSingleDeclaration = null;
for (JetDeclaration jetDeclaration : jetFile.getDeclarations()) {
if (jetDeclaration instanceof JetClass) {
JetClass declaration = (JetClass) jetDeclaration;
if (tempSingleDeclaration == null) {
tempSingleDeclaration = declaration;
}
else {
// There are several class declarations in file
return null;
}
}
}
return tempSingleDeclaration;
}
private static JetLightClass wrapDelegate(JetClass jetClass) { private static JetLightClass wrapDelegate(JetClass jetClass) {
return new JetLightClass(jetClass.getManager(), (JetFile) jetClass.getContainingFile(), JetPsiUtil.getFQName(jetClass)); return new JetLightClass(jetClass.getManager(), (JetFile) jetClass.getContainingFile(), JetPsiUtil.getFQName(jetClass));
} }