don't try to insert parentheses if live template has been cancelled (EA-61976 - assert: DocumentImpl.insertString); don't store Editor instances in a static map to avoid memory leaks

This commit is contained in:
Dmitry Jemerov
2015-09-17 14:06:10 +02:00
parent 33d70b1a57
commit a7df8863f7
@@ -22,6 +22,7 @@ import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
import com.intellij.codeInsight.template.impl.TemplateState; import com.intellij.codeInsight.template.impl.TemplateState;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
@@ -36,18 +37,14 @@ import org.jetbrains.kotlin.psi.JetReferenceExpression;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode; import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode;
import java.util.HashMap;
import java.util.Map;
class AnonymousTemplateEditingListener extends TemplateEditingAdapter { class AnonymousTemplateEditingListener extends TemplateEditingAdapter {
private JetReferenceExpression classRef; private JetReferenceExpression classRef;
private ClassDescriptor classDescriptor; private ClassDescriptor classDescriptor;
private final Editor editor; private final Editor editor;
private final PsiFile psiFile; private final PsiFile psiFile;
private static final Map<Editor, AnonymousTemplateEditingListener> ourAddedListeners =
new HashMap<Editor, AnonymousTemplateEditingListener>();
private static final Key<AnonymousTemplateEditingListener> LISTENER_KEY = Key.create("kotlin.AnonymousTemplateEditingListener");
public AnonymousTemplateEditingListener(PsiFile psiFile, Editor editor) { public AnonymousTemplateEditingListener(PsiFile psiFile, Editor editor) {
this.psiFile = psiFile; this.psiFile = psiFile;
this.editor = editor; this.editor = editor;
@@ -71,7 +68,10 @@ class AnonymousTemplateEditingListener extends TemplateEditingAdapter {
@Override @Override
public void templateFinished(Template template, boolean brokenOff) { public void templateFinished(Template template, boolean brokenOff) {
ourAddedListeners.remove(editor); editor.putUserData(LISTENER_KEY, null);
if (brokenOff) {
return;
}
if (classDescriptor != null) { if (classDescriptor != null) {
if (classDescriptor.getKind() == ClassKind.CLASS) { if (classDescriptor.getKind() == ClassKind.CLASS) {
@@ -94,7 +94,7 @@ class AnonymousTemplateEditingListener extends TemplateEditingAdapter {
} }
static void registerListener(Editor editor, Project project) { static void registerListener(Editor editor, Project project) {
if (ourAddedListeners.containsKey(editor)) { if (editor.getUserData(LISTENER_KEY) != null) {
return; return;
} }
PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
@@ -102,7 +102,7 @@ class AnonymousTemplateEditingListener extends TemplateEditingAdapter {
TemplateState templateState = TemplateManagerImpl.getTemplateState(editor); TemplateState templateState = TemplateManagerImpl.getTemplateState(editor);
if (templateState != null) { if (templateState != null) {
AnonymousTemplateEditingListener listener = new AnonymousTemplateEditingListener(psiFile, editor); AnonymousTemplateEditingListener listener = new AnonymousTemplateEditingListener(psiFile, editor);
ourAddedListeners.put(editor, listener); editor.putUserData(LISTENER_KEY, listener);
templateState.addTemplateStateListener(listener); templateState.addTemplateStateListener(listener);
} }
} }