Copy com.intellij.DynamicBundle to compiler/cli
This is needed to fix KT-44264 without updating the whole project to intellij 203, which might take significant time. In this commit, the file is copied as is from https://github.com/JetBrains/intellij-community/blob/27837dd8e68a95cc4da0954f93321c98017b3d11/platform/core-api/src/com/intellij/DynamicBundle.java.
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package com.intellij;
|
||||
|
||||
import com.intellij.openapi.application.Application;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.extensions.AbstractExtensionPointBean;
|
||||
import com.intellij.openapi.extensions.ExtensionPointName;
|
||||
import com.intellij.openapi.progress.ProcessCanceledException;
|
||||
import com.intellij.util.ReflectionUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Map;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public abstract class DynamicBundle extends AbstractBundle {
|
||||
private final static Logger LOG = Logger.getInstance(DynamicBundle.class);
|
||||
private final static Method SET_PARENT = ReflectionUtil.getDeclaredMethod(ResourceBundle.class, "setParent", ResourceBundle.class);
|
||||
|
||||
protected DynamicBundle(@NotNull String pathToBundle) {
|
||||
super(pathToBundle);
|
||||
}
|
||||
|
||||
// see BundleUtil
|
||||
@Override
|
||||
protected ResourceBundle findBundle(@NotNull String pathToBundle,
|
||||
@NotNull ClassLoader baseLoader,
|
||||
@NotNull ResourceBundle.Control control) {
|
||||
ResourceBundle base = super.findBundle(pathToBundle, baseLoader, control);
|
||||
|
||||
LanguageBundleEP langBundle = findLanguageBundle();
|
||||
if (langBundle == null) return base;
|
||||
|
||||
ResourceBundle pluginBundle = super.findBundle(pathToBundle, langBundle.getLoaderForClass(), control);
|
||||
if (pluginBundle == null) return base;
|
||||
|
||||
try {
|
||||
if (SET_PARENT != null) {
|
||||
SET_PARENT.invoke(pluginBundle, base);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
LOG.warn(e);
|
||||
return base;
|
||||
}
|
||||
return pluginBundle;
|
||||
}
|
||||
|
||||
// todo: one language per application
|
||||
@Nullable
|
||||
private static LanguageBundleEP findLanguageBundle() {
|
||||
try {
|
||||
Application application = ApplicationManager.getApplication();
|
||||
if (application == null) return null;
|
||||
if (application.isUnitTestMode() && !application.getExtensionArea().hasExtensionPoint(LanguageBundleEP.EP_NAME)) {
|
||||
return null;
|
||||
}
|
||||
return LanguageBundleEP.EP_NAME.findExtension(LanguageBundleEP.class);
|
||||
}
|
||||
catch (ProcessCanceledException e) {
|
||||
throw e;
|
||||
}
|
||||
catch (Exception e) {
|
||||
LOG.error(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static final DynamicBundle INSTANCE = new DynamicBundle("") {
|
||||
};
|
||||
|
||||
public static class LanguageBundleEP extends AbstractExtensionPointBean {
|
||||
public static final ExtensionPointName<LanguageBundleEP> EP_NAME = ExtensionPointName.create("com.intellij.languageBundle");
|
||||
}
|
||||
|
||||
private static final Map<String, DynamicBundle> ourBundlesForForms = ContainerUtil.createConcurrentSoftValueMap();
|
||||
|
||||
/**
|
||||
* @deprecated used only dy GUI form builder
|
||||
*/
|
||||
@Deprecated
|
||||
public static ResourceBundle getBundle(@NotNull String baseName) {
|
||||
Class<?> callerClass = ReflectionUtil.findCallerClass(2);
|
||||
return getBundle(baseName, callerClass == null ? DynamicBundle.class : callerClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated used only dy GUI form builder
|
||||
*/
|
||||
@Deprecated
|
||||
public static ResourceBundle getBundle(@NotNull String baseName, @NotNull Class<?> formClass) {
|
||||
DynamicBundle dynamic = ourBundlesForForms.computeIfAbsent(baseName, s -> new DynamicBundle(s) {});
|
||||
ResourceBundle rb = dynamic.getResourceBundle(formClass.getClassLoader());
|
||||
|
||||
if (BundleBase.SHOW_LOCALIZED_MESSAGES) {
|
||||
return new ResourceBundle() {
|
||||
@Override
|
||||
protected Object handleGetObject(@NotNull String key) {
|
||||
Object get = rb.getObject(key);
|
||||
assert get instanceof String : "Language bundles should contain only strings";
|
||||
return BundleBase.appendLocalizationMarker((String)get);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Enumeration<String> getKeys() {
|
||||
return rb.getKeys();
|
||||
}
|
||||
};
|
||||
}
|
||||
return rb;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user