From 977d0474d8e1a62dc0048f3d4d6ccee8d431b90e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 29 Jan 2018 17:05:16 +0300 Subject: [PATCH] fix leaks in run configuration producers --- .../applet/AppletConfigurationProducer.java | 6 ++---- .../junit/RuntimeConfigurationProducer.java | 20 ++++++++++++++----- .../GroovyScriptRunConfigurationProducer.java | 8 +++----- .../execution/MavenConfigurationProducer.java | 7 ++----- .../xslt/run/XsltConfigurationProducer.java | 12 +++++------ .../DocutilsConfigurationProducer.java | 10 ++++------ .../sphinx/SphinxConfigurationProducer.java | 13 ++++++------ 7 files changed, 37 insertions(+), 39 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurationProducer.java b/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurationProducer.java index e805c99d3e20..1e5eec65e7b3 100644 --- a/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurationProducer.java +++ b/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurationProducer.java @@ -20,15 +20,13 @@ import org.jetbrains.annotations.Nullable; import java.util.List; public class AppletConfigurationProducer extends JavaRuntimeConfigurationProducerBase { - private SmartPsiElementPointer 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)); diff --git a/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java b/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java index bb38f0b0b3ea..6547ff733ea5 100644 --- a/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java +++ b/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java @@ -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 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; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java index 8aff4563da94..af448622576d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java @@ -44,15 +44,13 @@ import java.util.List; * @author ilyas */ public class GroovyScriptRunConfigurationProducer extends RuntimeConfigurationProducer implements Cloneable { - private SmartPsiElementPointer 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); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java index ffb863dde02d..c29c7803beb3 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java @@ -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; diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java index fe9426fcfe03..d50dae9b6a6c 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java @@ -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; diff --git a/python/python-rest/src/com/jetbrains/rest/run/docutils/DocutilsConfigurationProducer.java b/python/python-rest/src/com/jetbrains/rest/run/docutils/DocutilsConfigurationProducer.java index 8e2353d7ae60..df928088ab6b 100644 --- a/python/python-rest/src/com/jetbrains/rest/run/docutils/DocutilsConfigurationProducer.java +++ b/python/python-rest/src/com/jetbrains/rest/run/docutils/DocutilsConfigurationProducer.java @@ -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()); diff --git a/python/python-rest/src/com/jetbrains/rest/run/sphinx/SphinxConfigurationProducer.java b/python/python-rest/src/com/jetbrains/rest/run/sphinx/SphinxConfigurationProducer.java index 18e9c53f42bb..3cd12f0ed57b 100644 --- a/python/python-rest/src/com/jetbrains/rest/run/sphinx/SphinxConfigurationProducer.java +++ b/python/python-rest/src/com/jetbrains/rest/run/sphinx/SphinxConfigurationProducer.java @@ -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());