diff --git a/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSBrowserProgramRunner.java b/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSBrowserProgramRunner.java index 53a8034f951..5e4036f498d 100644 --- a/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSBrowserProgramRunner.java +++ b/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSBrowserProgramRunner.java @@ -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() { diff --git a/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java b/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java index 93a6e558695..bbb782d9033 100644 --- a/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java +++ b/idea/src/org/jetbrains/jet/plugin/k2jsrun/K2JSRunnerUtils.java @@ -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 allVirtualFiles = getAllProjectVirtualFiles(project); - List 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 getAllProjectVirtualFiles(@NotNull Project project) { - Module[] modules = ModuleManager.getInstance(project).getModules(); - Set 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 getJetFiles(@NotNull Collection virtualFiles, - @NotNull Project project) { - List 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(); } }