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 @@
+
+
+