fix leaks in run configuration producers

This commit is contained in:
Sergey Ignatov
2018-01-29 17:05:16 +03:00
parent 0e8136d756
commit 977d0474d8
7 changed files with 37 additions and 39 deletions
@@ -20,15 +20,13 @@ import org.jetbrains.annotations.Nullable;
import java.util.List;
public class AppletConfigurationProducer extends JavaRuntimeConfigurationProducerBase {
private SmartPsiElementPointer<PsiClass> myPointer;
protected AppletConfigurationProducer() {
super(AppletConfigurationType.getInstance());
}
@Override
public PsiElement getSourceElement() {
return myPointer == null ? null : myPointer.getElement();
return restoreSourceElement();
}
@Override
@@ -39,7 +37,7 @@ public class AppletConfigurationProducer extends JavaRuntimeConfigurationProduce
final PsiElement element = location.getPsiElement();
PsiClass psiClass = getAppletClass(element, PsiManager.getInstance(project));
if (psiClass == null) return null;
myPointer = SmartPointerManager.createPointer(psiClass);
storeSourceElement(psiClass);
RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(project, context);
final AppletConfiguration configuration = (AppletConfiguration)settings.getConfiguration();
configuration.setMainClassName(JavaExecutionUtil.getRuntimeQualifiedName(psiClass));
@@ -15,6 +15,8 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.PsiElement;
import com.intellij.psi.SmartPointerManager;
import com.intellij.psi.SmartPsiElementPointer;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -33,6 +35,7 @@ public abstract class RuntimeConfigurationProducer implements Comparable, Clonea
private final ConfigurationFactory myConfigurationFactory;
private RunnerAndConfigurationSettings myConfiguration;
protected boolean isClone;
private SmartPsiElementPointer<PsiElement> myPointer;
public RuntimeConfigurationProducer(final ConfigurationType configurationType) {
this(configurationType.getConfigurationFactories()[0]);
@@ -53,13 +56,11 @@ public abstract class RuntimeConfigurationProducer implements Comparable, Clonea
// replace with existing configuration if any
final RunManager runManager = RunManager.getInstance(context.getProject());
final ConfigurationType type = result.myConfiguration.getType();
RunnerAndConfigurationSettings configuration = null;
if (type != null) {
configuration = result.findExistingByElement(_location, runManager.getConfigurationSettingsList(type), context);
}
RunnerAndConfigurationSettings configuration = result.findExistingByElement(_location, runManager.getConfigurationSettingsList(type), context);
if (configuration != null) {
result.myConfiguration = configuration;
} else {
}
else {
runManager.setUniqueNameIfNeed(result.myConfiguration);
}
}
@@ -78,6 +79,15 @@ public abstract class RuntimeConfigurationProducer implements Comparable, Clonea
public abstract PsiElement getSourceElement();
protected void storeSourceElement(@NotNull PsiElement e) {
myPointer = SmartPointerManager.createPointer(e);
}
@Nullable
protected PsiElement restoreSourceElement() {
return myPointer == null ? null : myPointer.getElement();
}
public RunnerAndConfigurationSettings getConfiguration() {
assert isClone;
return myConfiguration;
@@ -44,15 +44,13 @@ import java.util.List;
* @author ilyas
*/
public class GroovyScriptRunConfigurationProducer extends RuntimeConfigurationProducer implements Cloneable {
private SmartPsiElementPointer<PsiElement> myPointer;
public GroovyScriptRunConfigurationProducer() {
super(GroovyScriptRunConfigurationType.getInstance());
}
@Override
public PsiElement getSourceElement() {
return myPointer == null ? null : myPointer.getElement();
return restoreSourceElement();
}
@Override
@@ -72,7 +70,7 @@ public class GroovyScriptRunConfigurationProducer extends RuntimeConfigurationPr
if (aClass instanceof GroovyScriptClass || GroovyRunnerPsiUtil.isRunnable(aClass)) {
final RunnerAndConfigurationSettings settings = createConfiguration(aClass);
if (settings != null) {
myPointer = SmartPointerManager.createPointer(element);
storeSourceElement(element);
final GroovyScriptRunConfiguration configuration = (GroovyScriptRunConfiguration)settings.getConfiguration();
GroovyScriptUtil.getScriptType(groovyFile).tuneConfiguration(groovyFile, configuration, location);
return settings;
@@ -84,7 +82,7 @@ public class GroovyScriptRunConfigurationProducer extends RuntimeConfigurationPr
ConfigurationFromContext settings = producer.createConfigurationFromContext(context);
if (settings != null) {
PsiElement src = settings.getSourceElement();
myPointer = SmartPointerManager.createPointer(src);
storeSourceElement(element);
return createConfiguration(src instanceof PsiMethod ? ((PsiMethod)src).getContainingClass() : (PsiClass)src);
}
@@ -28,24 +28,21 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.maven.model.MavenExplicitProfiles;
import org.jetbrains.idea.maven.project.MavenProjectsManager;
import java.util.Collection;
import java.util.List;
public class MavenConfigurationProducer extends RuntimeConfigurationProducer {
private PsiElement myPsiElement;
public MavenConfigurationProducer() {
super(MavenRunConfigurationType.getInstance());
}
@Override
public PsiElement getSourceElement() {
return myPsiElement;
return restoreSourceElement();
}
@Override
protected RunnerAndConfigurationSettings createConfigurationByElement(Location location, ConfigurationContext context) {
myPsiElement = location.getPsiElement();
storeSourceElement(location.getPsiElement());
final MavenRunnerParameters params = createBuildParameters(location);
if (params == null) return null;
@@ -33,26 +33,24 @@ import java.io.File;
import java.util.List;
public class XsltConfigurationProducer extends RuntimeConfigurationProducer{
private XmlFile myFile;
public XsltConfigurationProducer() {
super(XsltRunConfigType.getInstance());
}
@Override
public PsiElement getSourceElement() {
return myFile;
return restoreSourceElement();
}
@Override
protected RunnerAndConfigurationSettings createConfigurationByElement(Location location, ConfigurationContext context) {
final XmlFile file = PsiTreeUtil.getParentOfType(location.getPsiElement(), XmlFile.class, false);
if (file != null && file.isPhysical() && XsltSupport.isXsltFile(file)) {
myFile = file;
final Project project = myFile.getProject();
storeSourceElement(file);
final Project project = file.getProject();
final RunnerAndConfigurationSettings settings =
RunManager.getInstance(project).createRunConfiguration(myFile.getName(), getConfigurationFactory());
((XsltRunConfiguration)settings.getConfiguration()).initFromFile(myFile);
RunManager.getInstance(project).createRunConfiguration(file.getName(), getConfigurationFactory());
((XsltRunConfiguration)settings.getConfiguration()).initFromFile(file);
return settings;
}
return null;
@@ -39,14 +39,12 @@ import java.util.List;
* User : catherine
*/
public class DocutilsConfigurationProducer extends RuntimeConfigurationProducer implements Cloneable {
private PsiFile mySourceFile = null;
public DocutilsConfigurationProducer() {
super(RestRunConfigurationType.getInstance().DOCUTILS_FACTORY);
}
public PsiElement getSourceElement() {
return mySourceFile;
return restoreSourceElement();
}
protected RunnerAndConfigurationSettings createConfigurationByElement(final Location location, final ConfigurationContext context) {
@@ -55,12 +53,12 @@ public class DocutilsConfigurationProducer extends RuntimeConfigurationProducer
return null;
}
Module module = ModuleUtil.findModuleForPsiElement(script);
mySourceFile = script;
storeSourceElement(script);
final Project project = mySourceFile.getProject();
final Project project = script.getProject();
RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(project, context);
DocutilsRunConfiguration configuration = (DocutilsRunConfiguration) settings.getConfiguration();
final VirtualFile vFile = mySourceFile.getVirtualFile();
final VirtualFile vFile = script.getVirtualFile();
if (vFile == null) return null;
configuration.setInputFile(vFile.getPath());
configuration.setName(script.getName());
@@ -39,24 +39,23 @@ import java.util.List;
* User : catherine
*/
public class SphinxConfigurationProducer extends RuntimeConfigurationProducer implements Cloneable {
private PsiDirectory mySourceFile = null;
public SphinxConfigurationProducer() {
super(RestRunConfigurationType.getInstance().SPHINX_FACTORY);
}
public PsiElement getSourceElement() {
return mySourceFile;
return restoreSourceElement();
}
protected RunnerAndConfigurationSettings createConfigurationByElement(final Location location, final ConfigurationContext context) {
PsiElement element = location.getPsiElement();
if (!(element instanceof PsiDirectory)) return null;
mySourceFile = (PsiDirectory)element;
storeSourceElement(element);
PsiDirectory directory = (PsiDirectory)element;
boolean hasRstFile = false;
boolean hasConf = false;
for (PsiFile file : mySourceFile.getFiles()) {
for (PsiFile file : directory.getFiles()) {
if ("conf.py".equals(file.getName()))
hasConf = true;
if (file instanceof RestFile) {
@@ -64,10 +63,10 @@ public class SphinxConfigurationProducer extends RuntimeConfigurationProducer im
}
}
if (!hasRstFile || !hasConf) return null;
final Project project = mySourceFile.getProject();
final Project project = directory.getProject();
RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(project, context);
SphinxRunConfiguration configuration = (SphinxRunConfiguration) settings.getConfiguration();
final VirtualFile vFile = mySourceFile.getVirtualFile();
final VirtualFile vFile = directory.getVirtualFile();
configuration.setInputFile(vFile.getPath());
configuration.setName(((PsiDirectory)element).getName());