diff --git a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompilerArguments.java b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompilerArguments.java index 0e728168598..b2e6a98735b 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompilerArguments.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompilerArguments.java @@ -24,13 +24,11 @@ import org.jetbrains.k2js.facade.MainCallParameters; /** * NOTE: for now K2JSCompiler supports only minimal amount of parameters required to launch it from the plugin. - * You can specify path to the file where generated file will be stored, path to zipped library sources. */ public class K2JSCompilerArguments extends CompilerArguments { @Argument(value = "output", description = "Output file path") public String outputFile; - //NOTE: may well be a subject to change soon @Argument(value = "libraryFiles", description = "Path to zipped lib sources or kotlin files") public String[] libraryFiles; diff --git a/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java b/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java index 772137b5842..cc85e8a86f1 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/utils/TranslationUtils.java @@ -35,14 +35,10 @@ import org.jetbrains.k2js.test.config.TestConfigFactory; import org.jetbrains.k2js.utils.JetFileUtils; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.lang.ref.SoftReference; import java.util.List; -import static org.jetbrains.k2js.utils.JetFileUtils.createPsiFileList; - //TODO: use method object public final class TranslationUtils { @@ -103,14 +99,14 @@ public final class TranslationUtils { @NotNull String outputFile, @NotNull MainCallParameters mainCallParameters, @NotNull EcmaVersion version, TestConfigFactory configFactory) throws Exception { - List psiFiles = createPsiFileList(inputFiles, project); + List jetFiles = createJetFileList(project, inputFiles, null); K2JSTranslator translator = new K2JSTranslator(getConfig(project, version, configFactory)); - FileUtil.writeToFile(new File(outputFile), translator.generateProgramCode(psiFiles, mainCallParameters)); + FileUtil.writeToFile(new File(outputFile), translator.generateProgramCode(jetFiles, mainCallParameters)); } @NotNull private static List initLibFiles(@NotNull Project project) { - return getLibFiles(project, Config.LIB_FILE_NAMES); + return createJetFileList(project, Config.LIB_FILE_NAMES, Config.LIBRARIES_LOCATION); } @NotNull @@ -124,28 +120,21 @@ public final class TranslationUtils { return result; } - @NotNull - private static List getLibFiles(@NotNull Project project, @NotNull List list) { + private static List createJetFileList(@NotNull Project project, @NotNull List list, @Nullable String root) { List libFiles = Lists.newArrayList(); for (String libFileName : list) { - 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); + String path = root == null ? libFileName : (root + libFileName); + String text = FileUtil.loadFile(new File(path)); + JetFile jetFile = JetFileUtils.createJetFile(path, text, project); + libFiles.add(jetFile); } - catch (Exception e) { + catch (IOException e) { //TODO: throw generic exception throw new IllegalStateException(e); } } return libFiles; + } } diff --git a/js/js.translator/lib/dart-ast.jar b/js/js.translator/lib/dart-ast.jar index 5d4ca629ddb..c27da6ad043 100644 Binary files a/js/js.translator/lib/dart-ast.jar and b/js/js.translator/lib/dart-ast.jar differ diff --git a/js/js.translator/lib/src/dart-ast-src.jar b/js/js.translator/lib/src/dart-ast-src.jar index 19865ea5944..787febdb181 100644 Binary files a/js/js.translator/lib/src/dart-ast-src.jar and b/js/js.translator/lib/src/dart-ast-src.jar differ diff --git a/js/js.translator/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java b/js/js.translator/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java index 8bb4460d70a..3bce3f989bb 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java @@ -21,11 +21,13 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.*; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.k2js.utils.JetFileUtils; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -37,7 +39,7 @@ import java.util.zip.ZipFile; public class LibrarySourcesConfig extends Config { @NotNull - public static final Key EXTERNAL_MODULE_NAME = new Key("externalModule"); + public static final Key EXTERNAL_MODULE_NAME = Key.create("externalModule"); @NotNull public static final String UNKNOWN_EXTERNAL_MODULE_NAME = ""; @@ -60,41 +62,53 @@ public class LibrarySourcesConfig extends Config { @NotNull @Override - public List generateLibFiles() { + protected List generateLibFiles() { if (files.isEmpty()) { return Collections.emptyList(); } - List jetFiles = new ArrayList(); + final List jetFiles = new ArrayList(); String moduleName = UNKNOWN_EXTERNAL_MODULE_NAME; + VirtualFileSystem fileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL); + final PsiManager psiManager = PsiManager.getInstance(getProject()); for (String path : files) { - File file = new File(path); - if (!file.exists()) continue; // The path here may be copying from a library root configuration, i.e. may be absent - try { - String name = file.getName(); - if (path.charAt(0) == '@') { - moduleName = path.substring(1); - continue; + if (path.charAt(0) == '@') { + moduleName = path.substring(1); + } + else if (path.endsWith(".jar") || path.endsWith(".zip")) { + try { + jetFiles.addAll(readZip(path)); } - - if (name.endsWith(".jar") || name.endsWith(".zip")) { - jetFiles.addAll(readZip(file)); - } - else { - JetFile psiFile = JetFileUtils.createPsiFile(path, FileUtil.loadFile(file), getProject()); - psiFile.putUserData(EXTERNAL_MODULE_NAME, moduleName); - jetFiles.add(psiFile); + catch (IOException e) { + LOG.error(e); } } - catch (IOException e) { - LOG.error("While processing " + file, e); + else { + VirtualFile file = fileSystem.findFileByPath(path); + assert file != null; + if (file.isDirectory()) { + final String currentModuleName = moduleName; + VfsUtilCore.visitChildrenRecursively(file, new VirtualFileVisitor() { + @Override + public boolean visitFile(@NotNull VirtualFile file) { + if (file.getName().endsWith(".kt")) { + addJetFile(jetFiles, currentModuleName, psiManager, file); + return false; + } + return true; + } + }); + } + else { + addJetFile(jetFiles, moduleName, psiManager, file); + } } } return jetFiles; } - private List readZip(File file) throws IOException { + private List readZip(String file) throws IOException { ZipFile zipFile = new ZipFile(file); try { return traverseArchive(zipFile); @@ -113,11 +127,18 @@ public class LibrarySourcesConfig extends Config { if (!entry.isDirectory() && entry.getName().endsWith(".kt")) { InputStream stream = file.getInputStream(entry); String text = FileUtil.loadTextAndClose(stream); - JetFile jetFile = JetFileUtils.createPsiFile(entry.getName(), text, getProject()); + JetFile jetFile = JetFileUtils.createJetFile(entry.getName(), text, getProject()); jetFile.putUserData(EXTERNAL_MODULE_NAME, UNKNOWN_EXTERNAL_MODULE_NAME); result.add(jetFile); } } return result; } -} + + private static void addJetFile(List jetFiles, String moduleName, PsiManager psiManager, VirtualFile file) { + PsiFile psiFile = psiManager.findFile(file); + assert psiFile != null; + psiFile.putUserData(EXTERNAL_MODULE_NAME, moduleName); + jetFiles.add((JetFile) psiFile); + } +} \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/config/MetaInfServices.java b/js/js.translator/src/org/jetbrains/k2js/config/MetaInfServices.java index 5ef1d51bae6..7baa309998b 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/MetaInfServices.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/MetaInfServices.java @@ -74,8 +74,7 @@ public final class MetaInfServices { InputStream stream = loadClasspathResource(line); if (stream != null) { String text = FileUtil.loadTextAndClose(stream); - JetFile file = JetFileUtils.createPsiFile(line, text, project); - libFiles.add(file); + libFiles.add(JetFileUtils.createJetFile(line, text, project)); } } } diff --git a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java index 2de524bfafc..305e9f7e127 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java @@ -75,7 +75,7 @@ public final class K2JSTranslator { @SuppressWarnings("UnusedDeclaration") @NotNull public String translateStringWithCallToMain(@NotNull String programText, @NotNull String argumentsString) throws TranslationException { - JetFile file = JetFileUtils.createPsiFile("test", programText, getProject()); + JetFile file = JetFileUtils.createJetFile("test", programText, getProject()); String programCode = generateProgramCode(file, MainCallParameters.mainWithArguments(parseString(argumentsString))) + "\n"; return FLUSH_SYSTEM_OUT + programCode + GET_SYSTEM_OUT; } diff --git a/js/js.translator/src/org/jetbrains/k2js/utils/JetFileUtils.java b/js/js.translator/src/org/jetbrains/k2js/utils/JetFileUtils.java index bfc78506de6..47b22f2413e 100644 --- a/js/js.translator/src/org/jetbrains/k2js/utils/JetFileUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/utils/JetFileUtils.java @@ -17,74 +17,23 @@ package org.jetbrains.k2js.utils; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.CharsetToolkit; -import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; -import com.intellij.psi.impl.PsiFileFactoryImpl; -import com.intellij.testFramework.LightVirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.plugin.JetLanguage; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - public final class JetFileUtils { private JetFileUtils() { } @NotNull - private static String loadFile(@NotNull String path) throws IOException { - return doLoadFile(path); - } - - @NotNull - private static String doLoadFile(@NotNull String path) throws IOException { - String text = FileUtil.loadFile(new File(path), CharsetToolkit.UTF8).trim(); - text = StringUtil.convertLineSeparators(text); - return text; - } - - @NotNull - public static JetFile createPsiFile(@NotNull String name, - @NotNull String text, - @NotNull Project project) { - String fileName = name.endsWith(".kt") ? name : name + ".jet"; - return (JetFile) createFile(fileName, text, project); - } - - @NotNull - private static JetFile loadPsiFile(@NotNull String name, @NotNull Project project) { - try { - return createPsiFile(name, loadFile(name), project); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @NotNull - private static PsiFile createFile(@NotNull String name, @NotNull String text, @NotNull Project project) { - LightVirtualFile virtualFile = new LightVirtualFile(name, JetLanguage.INSTANCE, text); - virtualFile.setCharset(CharsetToolkit.UTF8_CHARSET); - PsiFile result = ((PsiFileFactoryImpl) PsiFileFactory.getInstance(project)) - .trySetupPsiForFile(virtualFile, JetLanguage.INSTANCE, true, false); - assert result != null; - return result; - } - - - @NotNull - public static List createPsiFileList(@NotNull List inputFiles, - @NotNull Project project) { - List psiFiles = new ArrayList(); - for (String inputFile : inputFiles) { - psiFiles.add(loadPsiFile(inputFile, project)); - } - return psiFiles; + public static JetFile createJetFile( + @NotNull String name, + @NotNull String text, + @NotNull Project project + ) { + return (JetFile) PsiFileFactory.getInstance(project) + .createFileFromText(name.endsWith(".kt") ? name : name + ".jet", JetLanguage.INSTANCE, text, true, false); } }