JsTests speed up: Analyze standard library only once.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user