Use soft reference for expensive cash in TranslationUtils

Also move member in RhinoUtils
This commit is contained in:
Pavel V. Talanov
2012-07-09 15:37:18 +04:00
parent 3d8c6065c5
commit 20dc05e679
2 changed files with 13 additions and 11 deletions
@@ -18,7 +18,6 @@ package org.jetbrains.k2js.test.rhino;
import closurecompiler.internal.com.google.common.collect.Maps; import closurecompiler.internal.com.google.common.collect.Maps;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -70,6 +69,9 @@ public final class RhinoUtils {
private static final String KOTLIN_JS_LIB_ECMA_3 = pathToTestFilesRoot() + "kotlin_lib_ecma3.js"; private static final String KOTLIN_JS_LIB_ECMA_3 = pathToTestFilesRoot() + "kotlin_lib_ecma3.js";
private static final String KOTLIN_JS_LIB_ECMA_5 = pathToTestFilesRoot() + "kotlin_lib_ecma5.js"; private static final String KOTLIN_JS_LIB_ECMA_5 = pathToTestFilesRoot() + "kotlin_lib_ecma5.js";
@NotNull
private static final Map<EcmaVersion, Scriptable> versionToScope = Maps.newHashMap();
private RhinoUtils() { private RhinoUtils() {
} }
@@ -104,7 +106,7 @@ public final class RhinoUtils {
@NotNull RhinoResultChecker checker, @NotNull RhinoResultChecker checker,
@Nullable Map<String, Object> variables, @Nullable Map<String, Object> variables,
@NotNull EcmaVersion ecmaVersion) throws Exception { @NotNull EcmaVersion ecmaVersion) throws Exception {
runRhinoTest(fileNames, checker, variables, ecmaVersion, Collections.EMPTY_LIST); runRhinoTest(fileNames, checker, variables, ecmaVersion, Collections.<String>emptyList());
} }
public static void runRhinoTest(@NotNull List<String> fileNames, public static void runRhinoTest(@NotNull List<String> fileNames,
@@ -189,9 +191,6 @@ public final class RhinoUtils {
} }
} }
@NotNull
private static final Map<EcmaVersion, Scriptable> versionToScope = Maps.newHashMap();
@NotNull @NotNull
public static String getKotlinLibFile(@NotNull EcmaVersion ecmaVersion) { public static String getKotlinLibFile(@NotNull EcmaVersion ecmaVersion) {
return ecmaVersion == EcmaVersion.v5 ? KOTLIN_JS_LIB_ECMA_5 : KOTLIN_JS_LIB_ECMA_3; return ecmaVersion == EcmaVersion.v5 ? KOTLIN_JS_LIB_ECMA_5 : KOTLIN_JS_LIB_ECMA_3;
@@ -37,6 +37,7 @@ import org.jetbrains.k2js.test.config.TestConfigFactory;
import org.jetbrains.k2js.utils.JetFileUtils; import org.jetbrains.k2js.utils.JetFileUtils;
import java.io.*; import java.io.*;
import java.lang.ref.SoftReference;
import java.util.List; import java.util.List;
import static org.jetbrains.k2js.utils.JetFileUtils.createPsiFileList; import static org.jetbrains.k2js.utils.JetFileUtils.createPsiFileList;
@@ -50,8 +51,8 @@ public final class TranslationUtils {
private TranslationUtils() { private TranslationUtils() {
} }
@Nullable @NotNull
private static BindingContext libraryContext = null; private static SoftReference<BindingContext> cachedLibraryContext = new SoftReference<BindingContext>(null);
@Nullable @Nullable
private static List<JetFile> libFiles = null; private static List<JetFile> libFiles = null;
@@ -66,7 +67,8 @@ public final class TranslationUtils {
@NotNull @NotNull
public static BindingContext getLibraryContext(@NotNull Project project) { public static BindingContext getLibraryContext(@NotNull Project project) {
if (libraryContext == null) { BindingContext context = cachedLibraryContext.get();
if (context == null) {
List<JetFile> allLibFiles = getAllLibFiles(project); List<JetFile> allLibFiles = getAllLibFiles(project);
Predicate<PsiFile> filesWithCode = new Predicate<PsiFile>() { Predicate<PsiFile> filesWithCode = new Predicate<PsiFile>() {
@Override @Override
@@ -76,10 +78,11 @@ public final class TranslationUtils {
}; };
AnalyzeExhaust exhaust = AnalyzerFacadeForJS AnalyzeExhaust exhaust = AnalyzerFacadeForJS
.analyzeFiles(allLibFiles, filesWithCode, Config.getEmptyConfig(project)); .analyzeFiles(allLibFiles, filesWithCode, Config.getEmptyConfig(project));
libraryContext = exhaust.getBindingContext(); context = exhaust.getBindingContext();
AnalyzerFacadeForJS.checkForErrors(allLibFiles, libraryContext); AnalyzerFacadeForJS.checkForErrors(allLibFiles, context);
cachedLibraryContext = new SoftReference<BindingContext>(context);
} }
return libraryContext; return context;
} }
private static boolean isFileWithCode(@NotNull JetFile file) { private static boolean isFileWithCode(@NotNull JetFile file) {