diff --git a/build.xml b/build.xml index 31e5a827044..5ded5430511 100644 --- a/build.xml +++ b/build.xml @@ -219,6 +219,9 @@ + + + diff --git a/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java b/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java index 9d6a192f4d1..32fa16d371b 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/BasicTest.java @@ -19,8 +19,6 @@ package org.jetbrains.k2js.test; import com.google.common.collect.Lists; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.util.Function; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; @@ -31,10 +29,10 @@ import org.jetbrains.k2js.facade.MainCallParameters; import org.jetbrains.k2js.test.config.TestConfig; import org.jetbrains.k2js.test.config.TestConfigFactory; import org.jetbrains.k2js.test.rhino.RhinoResultChecker; +import org.jetbrains.k2js.test.utils.JsTestUtils; import org.jetbrains.k2js.test.utils.TranslationUtils; import java.io.File; -import java.io.FilenameFilter; import java.util.Collections; import java.util.List; import java.util.Map; @@ -174,8 +172,8 @@ public abstract class BasicTest extends KotlinTestWithEnvironment { @NotNull protected List additionalKotlinFiles() { List additionalFiles = Lists.newArrayList(); - additionalFiles.addAll(kotlinFilesInDirectory(pathToTestFilesRoot() + COMMON_FILES_DIR)); - additionalFiles.addAll(kotlinFilesInDirectory(pathToTestFiles() + COMMON_FILES_DIR)); + additionalFiles.addAll(JsTestUtils.kotlinFilesInDirectory(pathToTestFilesRoot() + COMMON_FILES_DIR)); + additionalFiles.addAll(JsTestUtils.kotlinFilesInDirectory(pathToTestFiles() + COMMON_FILES_DIR)); return additionalFiles; } @@ -238,30 +236,4 @@ public abstract class BasicTest extends KotlinTestWithEnvironment { return getExpectedPath() + testName + ".out"; } - @NotNull - private static List kotlinFilesInDirectory(@NotNull String directory) { - File dir = new File(directory); - - if (!dir.isDirectory()) { - return ContainerUtil.emptyList(); - } - - File[] kotlinFiles = dir.listFiles(new FilenameFilter() { - @Override - public boolean accept(@NotNull File dir, @NotNull String name) { - return name.endsWith(".kt"); - } - }); - - if (kotlinFiles == null) { - return ContainerUtil.emptyList(); - } - - return ContainerUtil.map2List(kotlinFiles, new Function() { - @Override - public String fun(File kotlinFile) { - return kotlinFile.getAbsolutePath(); - } - }); - } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java b/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java index 7114dc52fa1..b2369c70ebe 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/utils/JsTestUtils.java @@ -17,10 +17,13 @@ package org.jetbrains.k2js.test.utils; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.k2js.config.EcmaVersion; import java.io.File; +import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.EnumSet; @@ -61,4 +64,31 @@ public final class JsTestUtils { } return fullFilePaths; } + + @NotNull + public static List kotlinFilesInDirectory(@NotNull String directory) { + File dir = new File(directory); + + if (!dir.isDirectory()) { + return ContainerUtil.emptyList(); + } + + File[] kotlinFiles = dir.listFiles(new FilenameFilter() { + @Override + public boolean accept(@NotNull File dir, @NotNull String name) { + return name.endsWith(".kt"); + } + }); + + if (kotlinFiles == null) { + return ContainerUtil.emptyList(); + } + + return ContainerUtil.map2List(kotlinFiles, new Function() { + @Override + public String fun(File kotlinFile) { + return kotlinFile.getAbsolutePath(); + } + }); + } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/utils/LibraryFilePathsUtil.java b/js/js.tests/test/org/jetbrains/k2js/test/utils/LibraryFilePathsUtil.java index e4f38cff42d..916307b0d9e 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/utils/LibraryFilePathsUtil.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/utils/LibraryFilePathsUtil.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.config.Config; +import java.util.ArrayList; import java.util.List; public final class LibraryFilePathsUtil { @@ -30,12 +31,15 @@ public final class LibraryFilePathsUtil { @NotNull public static List getBasicLibraryFiles() { - return Lists.transform(Config.LIB_FILE_NAMES, new Function() { + List files = new ArrayList(); + files.addAll(Lists.transform(Config.LIB_FILE_NAMES, new Function() { @Override public String apply(@Nullable String s) { return Config.LIBRARIES_LOCATION + s; } - }); + })); + files.addAll(getReflectionLibraryFiles()); + return files; } @NotNull @@ -55,4 +59,9 @@ public final class LibraryFilePathsUtil { } return additionalKotlinFiles; } + + @NotNull + public static List getReflectionLibraryFiles() { + return JsTestUtils.kotlinFilesInDirectory(Config.REFLECTION_LIB_LOCATION); + } } 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 5720eb481eb..57dbd21efbc 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 @@ -127,7 +127,7 @@ public final class TranslationUtils { @NotNull private static List initLibFiles(@NotNull Project project) { - return createJetFileList(project, Config.LIB_FILE_NAMES, Config.LIBRARIES_LOCATION); + return createJetFileList(project, LibraryFilePathsUtil.getBasicLibraryFiles(), null); } @NotNull 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 44501640908..bff497272c3 100644 --- a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java +++ b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java @@ -55,15 +55,6 @@ public final class AnalyzerFacadeForJS { private AnalyzerFacadeForJS() { } - @NotNull - public static BindingContext analyzeFilesAndCheckErrors(@NotNull List files, - @NotNull Config config) { - BindingContext bindingContext = analyzeFiles(files, Predicates.alwaysTrue(), config).getBindingContext(); - checkForErrors(Config.withJsLibAdded(files, config), bindingContext); - return bindingContext; - } - - //NOTE: web demo related method @SuppressWarnings("UnusedDeclaration") @NotNull 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 fdf9cc33357..6eb88d115a2 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/Config.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/Config.java @@ -107,6 +107,7 @@ public abstract class Config { ); public static final String LIBRARIES_LOCATION = "js/js.libraries/src"; + public static final String REFLECTION_LIB_LOCATION = "core/reflection/src/kotlin/reflect"; /** * The file names in the standard library to compile 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 4196f2e7039..a4584a55b3d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java @@ -16,12 +16,14 @@ package org.jetbrains.k2js.facade; +import com.google.common.base.Predicates; import com.google.dart.compiler.backend.js.ast.JsProgram; import com.google.dart.compiler.util.TextOutputImpl; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; import com.intellij.util.Function; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; @@ -30,6 +32,8 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.OutputFileCollection; import org.jetbrains.jet.SimpleOutputFile; import org.jetbrains.jet.SimpleOutputFileCollection; +import org.jetbrains.jet.analyzer.AnalyzeExhaust; +import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.utils.fileUtils.FileUtilsPackage; @@ -141,8 +145,11 @@ public final class K2JSTranslator { public JsProgram generateProgram(@NotNull List filesToTranslate, @NotNull MainCallParameters mainCallParameters) throws TranslationException { - BindingContext bindingContext = AnalyzerFacadeForJS.analyzeFilesAndCheckErrors(filesToTranslate, config); - return Translation.generateAst(bindingContext, filesToTranslate, mainCallParameters, config); + AnalyzeExhaust analyzeExhaust = AnalyzerFacadeForJS.analyzeFiles(filesToTranslate, Predicates.alwaysTrue(), config); + BindingContext bindingContext = analyzeExhaust.getBindingContext(); + AnalyzerFacadeForJS.checkForErrors(Config.withJsLibAdded(filesToTranslate, config), bindingContext); + ModuleDescriptor moduleDescriptor = analyzeExhaust.getModuleDescriptor(); + return Translation.generateAst(bindingContext, filesToTranslate, mainCallParameters, moduleDescriptor, config); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index 7f5d99535af..b9e5c2c6670 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -24,6 +24,7 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.reflect.ReflectionTypes; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.k2js.config.EcmaVersion; @@ -48,12 +49,12 @@ import static org.jetbrains.k2js.translate.utils.TranslationUtils.getSuggestedNa */ public final class StaticContext { - public static StaticContext generateStaticContext(@NotNull BindingContext bindingContext, @NotNull EcmaVersion ecmaVersion) { + public static StaticContext generateStaticContext(@NotNull BindingContext bindingContext, @NotNull EcmaVersion ecmaVersion, @NotNull ModuleDescriptor moduleDescriptor) { JsProgram program = new JsProgram("main"); Namer namer = Namer.newInstance(program.getRootScope()); Intrinsics intrinsics = new Intrinsics(); StandardClasses standardClasses = StandardClasses.bindImplementations(namer.getKotlinScope()); - return new StaticContext(program, bindingContext, namer, intrinsics, standardClasses, program.getRootScope(), ecmaVersion); + return new StaticContext(program, bindingContext, namer, intrinsics, standardClasses, program.getRootScope(), ecmaVersion, moduleDescriptor); } @NotNull @@ -70,6 +71,9 @@ public final class StaticContext { @NotNull private final StandardClasses standardClasses; + @NotNull + private final ReflectionTypes reflectionTypes; + @NotNull private final JsScope rootScope; @@ -93,7 +97,7 @@ public final class StaticContext { //TODO: too many parameters in constructor private StaticContext(@NotNull JsProgram program, @NotNull BindingContext bindingContext, @NotNull Namer namer, @NotNull Intrinsics intrinsics, - @NotNull StandardClasses standardClasses, @NotNull JsScope rootScope, @NotNull EcmaVersion ecmaVersion) { + @NotNull StandardClasses standardClasses, @NotNull JsScope rootScope, @NotNull EcmaVersion ecmaVersion, @NotNull ModuleDescriptor moduleDescriptor) { this.program = program; this.bindingContext = bindingContext; this.namer = namer; @@ -101,6 +105,7 @@ public final class StaticContext { this.rootScope = rootScope; this.standardClasses = standardClasses; this.ecmaVersion = ecmaVersion; + this.reflectionTypes = new ReflectionTypes(moduleDescriptor); } public boolean isEcma5() { @@ -127,6 +132,11 @@ public final class StaticContext { return namer; } + @NotNull + public ReflectionTypes getReflectionTypes() { + return reflectionTypes; + } + @NotNull public JsScope getRootScope() { return rootScope; diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index 4f56a9fb61e..24ee7094042 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.reflect.ReflectionTypes; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; @@ -229,6 +230,11 @@ public class TranslationContext { return staticContext.getIntrinsics(); } + @NotNull + public ReflectionTypes getReflectionTypes() { + return staticContext.getReflectionTypes(); + } + @NotNull public JsProgram program() { return staticContext.getProgram(); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java index 8ca4cf7e573..8a98949a925 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java @@ -20,10 +20,12 @@ import com.google.dart.compiler.backend.js.ast.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.psi.JetDeclarationWithBody; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamedFunction; +import org.jetbrains.jet.lang.reflect.ReflectionTypes; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.plugin.MainFunctionDetector; import org.jetbrains.k2js.config.Config; @@ -108,10 +110,11 @@ public final class Translation { @NotNull public static JsProgram generateAst(@NotNull BindingContext bindingContext, @NotNull Collection files, @NotNull MainCallParameters mainCallParameters, + @NotNull ModuleDescriptor moduleDescriptor, @NotNull Config config) throws TranslationException { try { - return doGenerateAst(bindingContext, files, mainCallParameters, config); + return doGenerateAst(bindingContext, files, mainCallParameters, moduleDescriptor, config); } catch (UnsupportedOperationException e) { throw new UnsupportedFeatureException("Unsupported feature used.", e); @@ -124,8 +127,9 @@ public final class Translation { @NotNull private static JsProgram doGenerateAst(@NotNull BindingContext bindingContext, @NotNull Collection files, @NotNull MainCallParameters mainCallParameters, + @NotNull ModuleDescriptor moduleDescriptor, @NotNull Config config) throws MainFunctionNotFoundException { - StaticContext staticContext = StaticContext.generateStaticContext(bindingContext, config.getTarget()); + StaticContext staticContext = StaticContext.generateStaticContext(bindingContext, config.getTarget(), moduleDescriptor); JsProgram program = staticContext.getProgram(); JsBlock block = program.getGlobalBlock(); diff --git a/libraries/tools/kotlin-js-library/pom.xml b/libraries/tools/kotlin-js-library/pom.xml index 6d90531bcd6..1bbc3a2a7cf 100644 --- a/libraries/tools/kotlin-js-library/pom.xml +++ b/libraries/tools/kotlin-js-library/pom.xml @@ -38,6 +38,9 @@ + + +