mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-10 13:17:09 +07:00
tests hang fixed
check for leaked injectors added
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user