package org.fandev.runner; import com.intellij.execution.*; import com.intellij.execution.configurations.RunConfigurationModule; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.configurations.ConfigurationFactory; import com.intellij.execution.configurations.ModuleBasedConfiguration; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import org.fandev.lang.fan.psi.FanFile; /** * Date: Sep 4, 2009 * Time: 11:58:04 PM * * @author Dror Bereznitsky */ public abstract class FanRunConfigurationType implements LocatableConfigurationType { protected ConfigurationFactory configurationFactory; public RunnerAndConfigurationSettings createConfigurationByLocation(final Location location) { final PsiElement element = location.getPsiElement(); final PsiClass clazz = getScriptClass(element); if (clazz == null) { return null; } return createConfiguration(clazz); } protected RunnerAndConfigurationSettings createConfiguration(final PsiClass aClass) { final Project project = aClass.getProject(); final RunnerAndConfigurationSettings settings = RunManagerEx.getInstanceEx(project).createConfiguration("", configurationFactory); final ModuleBasedConfiguration configuration = (ModuleBasedConfiguration) settings.getConfiguration(); final PsiFile file = aClass.getContainingFile(); final PsiDirectory dir = file.getContainingDirectory(); assert dir != null; //configuration.setWorkDir(dir.getVirtualFile().getPath()); final VirtualFile vFile = file.getVirtualFile(); assert vFile != null; //configuration.scriptPath = vFile.getPath(); final RunConfigurationModule module = configuration.getConfigurationModule(); final String name = FanRunConfigurationType.getConfigurationName(aClass, module); configuration.setName(name); configuration.setModule(JavaExecutionUtil.findModule(aClass)); return settings; } protected static String getConfigurationName(final PsiClass aClass, final RunConfigurationModule module) { final String qualifiedName = aClass.getQualifiedName(); final Project project = module.getProject(); if (qualifiedName != null) { final PsiClass psiClass = JavaPsiFacade.getInstance(project).findClass(qualifiedName.replace('$', '.'), GlobalSearchScope.projectScope(project)); if (psiClass != null) { return psiClass.getName(); } else { final int lastDot = qualifiedName.lastIndexOf('.'); if (lastDot == -1 || lastDot == qualifiedName.length() - 1) { return qualifiedName; } return qualifiedName.substring(lastDot + 1, qualifiedName.length()); } } return module.getModuleName(); } protected PsiClass getScriptClass(final PsiElement element) { final PsiFile file = element.getContainingFile(); if (!(file instanceof FanFile)) { return null; } return null; //((FanFile) file).getScriptClass(); } public boolean isConfigurationByLocation(final RunConfiguration configuration, final Location location) { return false; } public ConfigurationFactory[] getConfigurationFactories() { return new ConfigurationFactory[]{configurationFactory}; } }