tests hang fixed

check for leaked injectors added
This commit is contained in:
Alexey Kudravtsev
2009-11-03 13:16:45 +03:00
parent a656f12d61
commit 0705d2736a
7 changed files with 85 additions and 44 deletions
@@ -29,7 +29,9 @@ import com.intellij.lang.injection.ConcatenationAwareInjector;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.lang.injection.MultiHostInjector;
import com.intellij.lang.injection.MultiHostRegistrar;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.ProperTextRange;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
@@ -44,35 +46,34 @@ import java.util.Arrays;
import java.util.*;
public class MyTestInjector {
private final List<ConcatenationAwareInjector> myInjectors = new ArrayList();
private final PsiManager myPsiManager;
private MultiHostInjector myMultiHostInjector;
@TestOnly
public MyTestInjector(PsiManager psiManager) {
myPsiManager = psiManager;
}
public void injectAll() {
injectVariousStuffEverywhere(myPsiManager);
public void injectAll(Disposable parent) {
injectVariousStuffEverywhere(parent, myPsiManager);
Project project = myPsiManager.getProject();
Language ql = findLanguageByID("JPAQL");
Language js = findLanguageByID("JavaScript");
registerForStringVarInitializer(project, ql, "ql", null, null);
registerForStringVarInitializer(project, ql, "qlPrefixed", "xxx", null);
registerForStringVarInitializer(project, js, "js", null, null);
registerForStringVarInitializer(project, js, "jsSeparated", " + ", " + 'separator'");
registerForStringVarInitializer(project, js, "jsBrokenPrefix", "xx ", "");
registerForStringVarInitializer(parent, project, ql, "ql", null, null);
registerForStringVarInitializer(parent, project, ql, "qlPrefixed", "xxx", null);
registerForStringVarInitializer(parent, project, js, "js", null, null);
registerForStringVarInitializer(parent, project, js, "jsSeparated", " + ", " + 'separator'");
registerForStringVarInitializer(parent, project, js, "jsBrokenPrefix", "xx ", "");
}
private ConcatenationAwareInjector registerForStringVarInitializer(@NotNull Project project,
final Language language,
@NotNull @NonNls final String varName,
@NonNls final String prefix,
@NonNls final String suffix) {
if (language == null) return null;
ConcatenationAwareInjector injector = new ConcatenationAwareInjector() {
private static void registerForStringVarInitializer(@NotNull Disposable parent,
@NotNull final Project project,
final Language language,
@NotNull @NonNls final String varName,
@NonNls final String prefix,
@NonNls final String suffix) {
if (language == null) return;
final ConcatenationAwareInjector injector = new ConcatenationAwareInjector() {
public void getLanguagesToInject(@NotNull MultiHostRegistrar injectionPlacesRegistrar, @NotNull PsiElement... operands) {
PsiVariable variable = PsiTreeUtil.getParentOfType(operands[0], PsiVariable.class);
if (variable == null) return;
@@ -104,19 +105,12 @@ public class MyTestInjector {
}
};
JavaConcatenationInjectorManager.getInstance(project).registerConcatenationInjector(injector);
myInjectors.add(injector);
return injector;
}
public void uninjectAll() {
Project project = myPsiManager.getProject();
for (ConcatenationAwareInjector i : myInjectors) {
boolean b = JavaConcatenationInjectorManager.getInstance(project).unregisterConcatenationInjector(i);
assert b;
}
boolean b = InjectedLanguageManager.getInstance(project).unregisterMultiHostInjector(myMultiHostInjector);
assert b;
Disposer.register(parent, new Disposable() {
public void dispose() {
boolean b = JavaConcatenationInjectorManager.getInstance(project).unregisterConcatenationInjector(injector);
assert b;
}
});
}
private static Language findLanguageByID(@NonNls String id) {
@@ -127,11 +121,12 @@ public class MyTestInjector {
return null;
}
private void injectVariousStuffEverywhere(PsiManager psiManager) {
private static void injectVariousStuffEverywhere(Disposable parent, final PsiManager psiManager) {
final Language ql = findLanguageByID("JPAQL");
final Language js = findLanguageByID("JavaScript");
if (ql == null || js == null) return;
myMultiHostInjector = new MultiHostInjector() {
final MultiHostInjector myMultiHostInjector = new MultiHostInjector() {
public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {
XmlAttributeValue value = (XmlAttributeValue)context;
PsiElement parent = value.getParent();
@@ -158,6 +153,11 @@ public class MyTestInjector {
}
};
InjectedLanguageManager.getInstance(psiManager.getProject()).registerMultiHostInjector(myMultiHostInjector);
Disposer.register(parent, new Disposable() {
public void dispose() {
InjectedLanguageManager.getInstance(psiManager.getProject()).unregisterMultiHostInjector(myMultiHostInjector);
}
});
LanguageInjector myInjector = new LanguageInjector() {
public void getLanguagesToInject(@NotNull PsiLanguageInjectionHost host, @NotNull InjectedLanguagePlaces placesToInject) {
@@ -264,7 +264,7 @@ public class MyTestInjector {
}
};
psiManager.registerLanguageInjector(myInjector, psiManager.getProject());
psiManager.registerLanguageInjector(myInjector, parent);
}
private static void inject(final PsiLanguageInjectionHost host, final InjectedLanguagePlaces placesToInject, final Language language) {