JsTests speed up: Analyze standard library only once.

This commit is contained in:
Pavel V. Talanov
2012-07-02 13:28:59 +04:00
parent 2975cda4d6
commit 3504106981
24 changed files with 308 additions and 315 deletions
@@ -17,64 +17,39 @@
package org.jetbrains.k2js.test.config;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.k2js.config.Config;
import org.jetbrains.k2js.config.EcmaVersion;
import org.jetbrains.k2js.utils.JetFileUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @author Pavel Talanov
*/
//TODO: review/refactor
public final class TestConfig extends Config {
@Nullable
private /*var*/ List<JetFile> jsLibFiles = null;
public TestConfig(@NotNull Project project, @NotNull EcmaVersion version) {
super(project, version);
}
public class TestConfig extends Config {
@NotNull
private static List<JetFile> initLibFiles(@NotNull Project project) {
List<JetFile> libFiles = new ArrayList<JetFile>();
for (String libFileName : LIB_FILE_NAMES) {
JetFile file = null;
try {
@SuppressWarnings("IOResourceOpenedButNotSafelyClosed")
InputStream stream = new FileInputStream(LIBRARIES_LOCATION + libFileName);
try {
String text = FileUtil.loadTextAndClose(stream);
file = JetFileUtils.createPsiFile(libFileName, text, project);
}
catch (IOException e) {
e.printStackTrace();
}
libFiles.add(file);
}
catch (Exception e) {
//TODO: throw generic exception
throw new IllegalStateException(e);
}
}
return libFiles;
private final List<JetFile> jsLibFiles;
@NotNull
private final BindingContext libraryContext;
public TestConfig(@NotNull Project project, @NotNull EcmaVersion version,
@NotNull List<JetFile> files, @NotNull BindingContext context) {
super(project, version);
jsLibFiles = files;
libraryContext = context;
}
@Override
public BindingContext getLibraryBindingContext() {
return libraryContext;
}
@Override
@NotNull
public List<JetFile> generateLibFiles() {
if (jsLibFiles == null) {
jsLibFiles = initLibFiles(getProject());
}
return jsLibFiles;
}
}
@@ -17,19 +17,27 @@
package org.jetbrains.k2js.test.utils;
import closurecompiler.internal.com.google.common.collect.Maps;
import com.google.common.base.Predicates;
import com.google.dart.compiler.backend.js.ast.JsProgram;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.k2js.analyze.AnalyzerFacadeForJS;
import org.jetbrains.k2js.config.Config;
import org.jetbrains.k2js.config.EcmaVersion;
import org.jetbrains.k2js.facade.K2JSTranslator;
import org.jetbrains.k2js.facade.MainCallParameters;
import org.jetbrains.k2js.generate.CodeGenerator;
import org.jetbrains.k2js.test.config.TestConfig;
import org.jetbrains.k2js.utils.JetFileUtils;
import java.io.File;
import java.io.FileWriter;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -44,7 +52,33 @@ public final class TranslationUtils {
}
@NotNull
private static final Map<EcmaVersion, K2JSTranslator> translators = Maps.newHashMap();
private static final Map<EcmaVersion, Config> testConfigs = Maps.newHashMap();
@Nullable
private static BindingContext libraryContext = null;
@NotNull
public static BindingContext getLibraryContext(@NotNull Project project, @NotNull List<JetFile> files) {
if (libraryContext == null) {
AnalyzeExhaust exhaust = AnalyzerFacadeForJS
.analyzeFiles(files, Predicates.<PsiFile>alwaysFalse(),
Config.getEmptyConfig(project));
libraryContext = exhaust.getBindingContext();
AnalyzerFacadeForJS.checkForErrors(files, libraryContext);
}
return libraryContext;
}
@NotNull
public static Config getConfig(@NotNull Project project, @NotNull EcmaVersion version) {
List<JetFile> files = initLibFiles(project);
Config config = testConfigs.get(version);
if (config == null) {
config = new TestConfig(project, version, files, getLibraryContext(project, files));
testConfigs.put(version, config);
}
return config;
}
public static void translateFiles(@NotNull Project project, @NotNull List<String> inputFiles,
@NotNull String outputFile,
@@ -64,11 +98,31 @@ public final class TranslationUtils {
@NotNull
private static K2JSTranslator getTranslator(@NotNull Project project, @NotNull EcmaVersion version) {
K2JSTranslator translator = translators.get(version);
if (translator == null) {
translators.put(version, translator);
translator = new K2JSTranslator(new TestConfig(project, version));
return new K2JSTranslator(getConfig(project, version));
}
@NotNull
public static List<JetFile> initLibFiles(@NotNull Project project) {
List<JetFile> libFiles = new ArrayList<JetFile>();
for (String libFileName : Config.LIB_FILE_NAMES) {
JetFile file = null;
try {
@SuppressWarnings("IOResourceOpenedButNotSafelyClosed")
InputStream stream = new FileInputStream(Config.LIBRARIES_LOCATION + libFileName);
try {
String text = FileUtil.loadTextAndClose(stream);
file = JetFileUtils.createPsiFile(libFileName, text, project);
}
catch (IOException e) {
e.printStackTrace();
}
libFiles.add(file);
}
catch (Exception e) {
//TODO: throw generic exception
throw new IllegalStateException(e);
}
}
return translator;
return libFiles;
}
}