diff --git a/js/js.translator/src/org/jetbrains/k2js/config/IDEAConfig.java b/idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java similarity index 55% rename from js/js.translator/src/org/jetbrains/k2js/config/IDEAConfig.java rename to idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java index 6518839da61..16f4caee2cc 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/IDEAConfig.java +++ b/idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java @@ -14,18 +14,21 @@ * limitations under the License. */ -package org.jetbrains.k2js.config; +package org.jetbrains.jet.plugin.project; import com.google.common.collect.Lists; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.k2js.config.Config; import org.jetbrains.k2js.utils.JetFileUtils; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Collections; import java.util.Enumeration; import java.util.List; @@ -37,22 +40,62 @@ import java.util.zip.ZipFile; */ public final class IDEAConfig extends Config { - @NotNull + @Nullable private final String pathToLibZip; - public IDEAConfig(@NotNull Project project, @NotNull String pathToLibZip) { + public IDEAConfig(@NotNull Project project) { super(project); - this.pathToLibZip = pathToLibZip; + this.pathToLibZip = getLibLocationForProject(project); } - public IDEAConfig(@NotNull Project project) { - //TODO: testing purposes. Should not get anywhere near production - this(project, "C:\\Dev\\Projects\\Kotlin\\clean_jet\\js\\js.libraries\\src\\k2jslib.zip"); + //TODO: refactor + @Nullable + private static String getLibLocationForProject(@NotNull Project project) { + VirtualFile indicationFile = JsModuleDetector.findIndicationFileInContextRoots(project); + if (indicationFile == null) { + return null; + } + try { + InputStream stream = indicationFile.getInputStream(); + String path = FileUtil.loadTextAndClose(stream); + String pathToLibFile = getFirstLine(path); + if (pathToLibFile == null) { + return null; + } + try { + URI pathToLibFileUri = new URI(pathToLibFile); + URI pathToIndicationFileUri = new URI(indicationFile.getPath()); + return pathToIndicationFileUri.resolve(pathToLibFileUri).toString(); + } + catch (URISyntaxException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + return null; + } + } + catch (IOException e) { + return null; + } + } + + //TODO: util + @Nullable + private static String getFirstLine(@NotNull String path) throws IOException { + BufferedReader reader = new BufferedReader(new StringReader(path)); + try { + return reader.readLine(); + } + + finally { + reader.close(); + } } @NotNull @Override - public List getLibFiles() { + public List generateLibFiles() { + if (pathToLibZip == null) { + return Collections.emptyList(); + } try { File file = new File(pathToLibZip); ZipFile zipFile = new ZipFile(file); diff --git a/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java b/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java index 144fa6f49f5..cb830ee2d56 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/config/TestConfig.java @@ -71,7 +71,7 @@ public final class TestConfig extends Config { } @NotNull - public List getLibFiles() { + public List generateLibFiles() { if (jsLibFiles == null) { jsLibFiles = initLibFiles(getProject()); } diff --git a/js/js.translator/js.translator.iml b/js/js.translator/js.translator.iml index a827f7758ae..f877327f1c0 100644 --- a/js/js.translator/js.translator.iml +++ b/js/js.translator/js.translator.iml @@ -10,6 +10,7 @@ + diff --git a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java index 525919411e7..354ead5cd2f 100644 --- a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java +++ b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java @@ -18,6 +18,8 @@ package org.jetbrains.k2js.analyze; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; @@ -37,13 +39,10 @@ import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; +import org.jetbrains.jet.plugin.project.IDEAConfig; import org.jetbrains.k2js.config.Config; -import org.jetbrains.k2js.config.IDEAConfig; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * @author Pavel Talanov @@ -101,9 +100,9 @@ public enum AnalyzerFacadeForJS implements AnalyzerFacade { @NotNull public static Collection withJsLibAdded(@NotNull Collection files, @NotNull Config config) { - List allFiles = new ArrayList(); - allFiles.addAll(files); - allFiles.addAll(config.getLibFiles()); + Set allFiles = Sets.newHashSet(); + allFiles.addAll(toOriginal(files)); + allFiles.addAll(toOriginal(config.getLibFiles())); return allFiles; } @@ -113,12 +112,21 @@ public enum AnalyzerFacadeForJS implements AnalyzerFacade { @Override public boolean apply(@Nullable PsiFile file) { assert file instanceof JetFile; - @SuppressWarnings("UnnecessaryLocalVariable") boolean notLibFile = !jsLibFiles.contains(file); + @SuppressWarnings("UnnecessaryLocalVariable") boolean notLibFile = !jsLibFiles.contains(file.getOriginalFile()); return notLibFile; } }; } + @NotNull + private static Collection toOriginal(@NotNull Collection files) { + Collection result = Lists.newArrayList(); + for (JetFile file : files) { + result.add(file); + } + return result; + } + //TODO: exclude? @NotNull public static BindingContext analyzeNamespace(@NotNull JetFile file) { diff --git a/js/js.translator/src/org/jetbrains/k2js/config/Config.java b/js/js.translator/src/org/jetbrains/k2js/config/Config.java index af75c6d253e..0be12f4fef0 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/Config.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/Config.java @@ -18,6 +18,7 @@ package org.jetbrains.k2js.config; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; import java.util.Arrays; @@ -52,6 +53,8 @@ public abstract class Config { @NotNull private final Project project; + @Nullable + private List libFiles = null; public Config(@NotNull Project project) { this.project = project; @@ -63,5 +66,13 @@ public abstract class Config { } @NotNull - public abstract List getLibFiles(); + protected abstract List generateLibFiles(); + + @NotNull + public final List getLibFiles() { + if (libFiles == null) { + libFiles = generateLibFiles(); + } + return libFiles; + } } 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 abd649410bb..d0cd2b05334 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java @@ -24,9 +24,9 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.plugin.JetMainDetector; +import org.jetbrains.jet.plugin.project.IDEAConfig; import org.jetbrains.k2js.analyze.AnalyzerFacadeForJS; import org.jetbrains.k2js.config.Config; -import org.jetbrains.k2js.config.IDEAConfig; import org.jetbrains.k2js.generate.CodeGenerator; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.utils.GenerationUtils; @@ -50,8 +50,7 @@ public final class K2JSTranslator { public static void translateWithCallToMainAndSaveToFile(@NotNull List files, @NotNull String outputPath, @NotNull Project project) throws Exception { - K2JSTranslator translator = new K2JSTranslator(new IDEAConfig(project, - "C:\\Dev\\Projects\\Kotlin\\clean_jet\\js\\js.libraries\\src\\k2jslib.zip")); + K2JSTranslator translator = new K2JSTranslator(new IDEAConfig(project)); String programCode = translator.generateProgramCode(files) + "\n"; JetFile fileWithMain = JetMainDetector.getFileWithMain(files); if (fileWithMain == null) {