K2JSBrowserProgramRunner copies output JavaScript file from output dir instead of generating JavaScript againg

This commit is contained in:
pTalanov
2012-05-16 18:17:24 +04:00
parent c8fe0080c7
commit 31a1aefeb5
2 changed files with 63 additions and 92 deletions
@@ -23,58 +23,35 @@ import com.intellij.execution.configurations.RunProfileState;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.GenericProgramRunner;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.ide.browsers.BrowsersConfiguration;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFileManager;
import org.jetbrains.annotations.NotNull;
import static org.jetbrains.jet.plugin.k2jsrun.K2JSRunnerUtils.copyJSFileFromOutputToDestination;
import static org.jetbrains.jet.plugin.k2jsrun.K2JSRunnerUtils.openBrowser;
/**
* @author Pavel Talanov
*/
public final class K2JSBrowserProgramRunner extends GenericProgramRunner {
@Override
protected RunContentDescriptor doExecute(Project project,
Executor executor,
RunProfileState state,
RunContentDescriptor contentToReuse,
ExecutionEnvironment env) throws ExecutionException {
protected RunContentDescriptor doExecute(final Project project,
Executor executor,
RunProfileState state,
RunContentDescriptor contentToReuse,
ExecutionEnvironment env) throws ExecutionException {
if (project == null) {
return null;
}
try {
K2JSConfigurationSettings configurationSettings = getSettings(state);
try {
K2JSRunnerUtils.translateAndSave(project, configurationSettings.getGeneratedFilePath());
}
catch (Throwable e) {
K2JSRunnerUtils.notifyFailure(e);
return null;
}
openBrowser(configurationSettings);
copyJSFileFromOutputToDestination(project, K2JSRunnerUtils.getSettings(state));
openBrowser(K2JSRunnerUtils.getSettings(state));
}
catch (Exception e) {
catch (Throwable e) {
throw new ExecutionException(e);
}
return null;
}
private static void openBrowser(@NotNull K2JSConfigurationSettings configurationSettings) {
if (!configurationSettings.isShouldOpenInBrowserAfterTranslation()) {
return;
}
String filePath = configurationSettings.getPageToOpenFilePath();
String url = VirtualFileManager.constructUrl(LocalFileSystem.PROTOCOL, filePath);
BrowsersConfiguration.launchBrowser(configurationSettings.getBrowserFamily(), url);
}
@NotNull
private static K2JSConfigurationSettings getSettings(@NotNull RunProfileState state) {
RunProfile profile = state.getRunnerSettings().getRunProfile();
assert profile instanceof K2JSRunConfiguration;
return ((K2JSRunConfiguration)profile).settings();
}
@NotNull
@Override
public String getRunnerId() {
@@ -16,28 +16,22 @@
package org.jetbrains.jet.plugin.k2jsrun;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.configurations.RunProfileState;
import com.intellij.ide.browsers.BrowsersConfiguration;
import com.intellij.openapi.compiler.CompilerPaths;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.openapi.vfs.VirtualFileManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.plugin.project.IDEAConfig;
import org.jetbrains.k2js.facade.K2JSTranslator;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import static org.jetbrains.jet.plugin.actions.JavaToKotlinActionUtil.allVirtualFiles;
import java.io.File;
import java.io.IOException;
/**
* @author Pavel Talanov
@@ -47,57 +41,57 @@ public final class K2JSRunnerUtils {
private K2JSRunnerUtils() {
}
public static void notifyFailure(@NotNull Throwable exception) {
Notifications.Bus.notify(new Notification("JsTranslator", "Translation failed.",
"Exception: " + exception.getMessage(),
NotificationType.ERROR));
}
private static void notifySuccess(@NotNull String outputPath) {
Notifications.Bus.notify(new Notification("JsTranslator", "Translation successful.",
"Generated file: " + outputPath,
NotificationType.INFORMATION));
}
public static void translateAndSave(@NotNull Project project, @NotNull String outputDirPath) throws Exception {
Set<VirtualFile> allVirtualFiles = getAllProjectVirtualFiles(project);
List<JetFile> kotlinFiles = getJetFiles(allVirtualFiles, project);
String outputFilePath = constructPathToGeneratedFile(project, outputDirPath);
K2JSTranslator.translateWithCallToMainAndSaveToFile(kotlinFiles,
outputFilePath,
new IDEAConfig(project)
);
notifySuccess(outputDirPath);
}
@NotNull
public static String constructPathToGeneratedFile(@NotNull Project project, @NotNull String outputDirPath) {
return outputDirPath + "/" + project.getName() + ".js";
}
@NotNull
private static Set<VirtualFile> getAllProjectVirtualFiles(@NotNull Project project) {
Module[] modules = ModuleManager.getInstance(project).getModules();
Set<VirtualFile> allVirtualFiles = Sets.newHashSet();
for (Module module : modules) {
VirtualFile[] roots = ModuleRootManager.getInstance(module).getSourceRoots();
allVirtualFiles.addAll(allVirtualFiles(roots));
public static void copyJSFileFromOutputToDestination(@NotNull Project project,
@NotNull K2JSConfigurationSettings configurationSettings) {
VirtualFile outputDir = getOutputDir(project);
if (outputDir == null) {
throw new RuntimeException("Cannot find output dir for project " + project.getName());
}
return allVirtualFiles;
String pathToGeneratedJsFile = constructPathToGeneratedFile(project, outputDir.getPath());
try {
File fileToCopy = new File(pathToGeneratedJsFile);
File dirToCopyTo = new File(configurationSettings.getGeneratedFilePath());
File fileToCopyTo = new File(dirToCopyTo, fileToCopy.getName());
FileUtil.copy(fileToCopy, fileToCopyTo);
}
catch (IOException e) {
throw new RuntimeException("Output JavaScript file was not generated or missing.", e);
}
}
@Nullable
private static VirtualFile getOutputDir(@NotNull Project project) {
Module module = getJsModule(project);
return CompilerPaths.getModuleOutputDirectory(module, /*forTests = */ false);
}
@NotNull
private static List<JetFile> getJetFiles(@NotNull Collection<VirtualFile> virtualFiles,
@NotNull Project project) {
List<JetFile> kotlinFiles = Lists.newArrayList();
PsiManager psiManager = PsiManager.getInstance(project);
for (VirtualFile virtualFile : virtualFiles) {
PsiFile psiFile = psiManager.findFile(virtualFile);
if (psiFile instanceof JetFile) {
kotlinFiles.add((JetFile) psiFile);
}
private static Module getJsModule(@NotNull Project project) {
Module[] modules = ModuleManager.getInstance(project).getModules();
if (modules.length != 1) {
throw new UnsupportedOperationException("Kotlin to JavaScript translator temporarily does not support multiple modules.");
}
return kotlinFiles;
return modules[0];
}
public static void openBrowser(@NotNull K2JSConfigurationSettings configurationSettings) {
if (!configurationSettings.isShouldOpenInBrowserAfterTranslation()) {
return;
}
String filePath = configurationSettings.getPageToOpenFilePath();
String url = VirtualFileManager.constructUrl(LocalFileSystem.PROTOCOL, filePath);
BrowsersConfiguration.launchBrowser(configurationSettings.getBrowserFamily(), url);
}
@NotNull
public static K2JSConfigurationSettings getSettings(@NotNull RunProfileState state) {
RunProfile profile = state.getRunnerSettings().getRunProfile();
assert profile instanceof K2JSRunConfiguration;
return ((K2JSRunConfiguration) profile).settings();
}
}