diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibTestSupport.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibTestBase.java similarity index 50% rename from js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibTestSupport.java rename to js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibTestBase.java index 1381212893f..4fef9e739f3 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibTestSupport.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibTestBase.java @@ -17,29 +17,25 @@ */ package org.jetbrains.k2js.test.semantics; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.cli.common.ExitCode; -import org.jetbrains.jet.cli.js.K2JSCompiler; -import org.jetbrains.jet.cli.js.K2JSCompilerArguments; import org.jetbrains.k2js.config.Config; import org.jetbrains.k2js.config.EcmaVersion; +import org.jetbrains.k2js.facade.MainCallParameters; import org.jetbrains.k2js.test.SingleFileTranslationTest; +import org.jetbrains.k2js.test.utils.TranslationUtils; import java.io.File; import java.util.EnumSet; import java.util.List; -import java.util.Set; -abstract class StdLibTestSupport extends SingleFileTranslationTest { +abstract class StdLibTestBase extends SingleFileTranslationTest { - protected StdLibTestSupport() { + protected StdLibTestBase() { super("stdlib/"); } - protected void generateJavaScriptFiles(@NotNull EnumSet ecmaVersions, + protected void performStdLibTest(@NotNull EnumSet ecmaVersions, @NotNull String sourceDir, @NotNull String... stdLibFiles) throws Exception { List files = Lists.newArrayList(); @@ -49,41 +45,22 @@ abstract class StdLibTestSupport extends SingleFileTranslationTest { files.add(new File(stdlibDir, file).getPath()); } - Set ignoreFiles = Sets.newHashSet( - "/jquery/common.kt", - "/jquery/ui.kt", - "/dom/domcore.kt", - "/dom/html/htmlcore.kt", - "/dom/html5/canvas.kt", - "/dom/html/window.kt"); // lets add the standard JS library files - Iterable names = Iterables.concat(Config.LIB_FILE_NAMES, Config.LIB_FILE_NAMES_DEPENDENT_ON_STDLIB); + Iterable names = Config.LIB_FILE_NAMES_DEPENDENT_ON_STDLIB; for (String libFileName : names) { - if (!ignoreFiles.contains(libFileName)) { - System.out.println("Compiling " + libFileName); - files.add(Config.LIBRARIES_LOCATION + libFileName); - } + System.out.println("Compiling " + libFileName); + files.add(Config.LIBRARIES_LOCATION + libFileName); } // lets add the standard Kotlin library files for (String libFileName : Config.STDLIB_FILE_NAMES) { - if (!ignoreFiles.contains(libFileName)) { - System.out.println("Compiling " + libFileName); - files.add(Config.STDLIB_LOCATION + libFileName); - } + System.out.println("Compiling " + libFileName); + files.add(Config.STDLIB_LOCATION + libFileName); } - - // now lets try invoke the compiler for (EcmaVersion version : ecmaVersions) { - K2JSCompiler compiler = new K2JSCompiler(); - K2JSCompilerArguments arguments = new K2JSCompilerArguments(); - arguments.outputFile = getOutputFilePath(getTestName(false) + ".compiler.kt", version); - arguments.sourceFiles = files.toArray(new String[files.size()]); - arguments.verbose = true; - System.out.println("Compiling with version: " + version + " to: " + arguments.outputFile); - ExitCode answer = compiler.exec(System.out, arguments); - assertEquals("Compile failed", ExitCode.OK, answer); + String outputFilePath = getOutputFilePath(getTestName(false) + ".compiler.kt", version); + TranslationUtils.translateFiles(getProject(), files, outputFilePath, MainCallParameters.noCall(), version); } } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibTestToJSTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibTestToJSTest.java index 8b86362b056..969457c95b6 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibTestToJSTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibTestToJSTest.java @@ -20,13 +20,13 @@ import org.jetbrains.k2js.config.EcmaVersion; /** */ -public class StdLibTestToJSTest extends StdLibTestSupport { +public class StdLibTestToJSTest extends StdLibTestBase { public void testGenerateTestCase() throws Exception { - generateJavaScriptFiles(EcmaVersion.all(), - "libraries/stdlib/test", - //"dom/DomTest.kt", - "js/MapTest.kt", - "ListTest.kt", - "StringTest.kt"); + performStdLibTest(EcmaVersion.all(), + "libraries/stdlib/test", + //"dom/DomTest.kt", + //"js/MapTest.kt", + "ListTest.kt", + "StringTest.kt"); } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibToJSTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibToJSTest.java index 1a6b70ff925..51cf40a85e4 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibToJSTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibToJSTest.java @@ -20,14 +20,10 @@ import org.jetbrains.k2js.config.EcmaVersion; /** */ -//TODO: fails due to some frontend bug -public abstract class StdLibToJSTest extends StdLibTestSupport { +public class StdLibToJSTest extends StdLibTestBase { public void testCompileJavaScriptFiles() throws Exception { - generateJavaScriptFiles(EcmaVersion.all(), - "libraries/stdlib/src", - "kotlin/Preconditions.kt", - "kotlin/dom/Dom.kt", - "kotlin/support/AbstractIterator.kt"); + performStdLibTest(EcmaVersion.all(), + "libraries/stdlib/src"); } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/WebDemoExamples2Test.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/WebDemoExamples2Test.java index 28afb839d55..db3b2c65bbf 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/WebDemoExamples2Test.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/WebDemoExamples2Test.java @@ -36,7 +36,9 @@ public final class WebDemoExamples2Test extends SingleFileTranslationTest { performTestWithMain("life", "", "2"); } - public void testBuilder() throws Exception { + //TODO: fails because it need code from stdlib + @SuppressWarnings("UnusedDeclaration") + public void _testBuilder() throws Exception { performTestWithMain("builder", ""); performTestWithMain("builder", "1", "over9000"); } 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 18be76ab51f..cf9d3e3375f 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 @@ -38,7 +38,6 @@ import org.jetbrains.k2js.test.config.TestConfig; import org.jetbrains.k2js.utils.JetFileUtils; import java.io.*; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -58,9 +57,21 @@ public final class TranslationUtils { @Nullable private static BindingContext libraryContext = null; + @Nullable + private static List libFiles = null; + @NotNull - public static BindingContext getLibraryContext(@NotNull Project project, @NotNull List allLibFiles) { + private static List getAllLibFiles(@NotNull Project project) { + if (libFiles == null) { + libFiles = initLibFiles(project); + } + return libFiles; + } + + @NotNull + public static BindingContext getLibraryContext(@NotNull Project project) { if (libraryContext == null) { + List allLibFiles = getAllLibFiles(project); Predicate filesWithCode = new Predicate() { @Override public boolean apply(@javax.annotation.Nullable PsiFile file) { @@ -75,17 +86,6 @@ public final class TranslationUtils { return libraryContext; } - @NotNull - public static List getFilesWithCode(@NotNull List allLibFiles) { - List result = Lists.newArrayList(); - for (JetFile file : allLibFiles) { - if (isFileWithCode(file)) { - result.add(file); - } - } - return result; - } - private static boolean isFileWithCode(@NotNull JetFile file) { for (String filename : Config.LIB_FILES_WITH_CODE) { if (file.getName().contains(filename)) { @@ -99,8 +99,8 @@ public final class TranslationUtils { public static Config getConfig(@NotNull Project project, @NotNull EcmaVersion version) { Config config = testConfigs.get(version); if (config == null) { - List allLibFiles = initLibFiles(project); - config = new TestConfig(project, version, getFilesWithCode(allLibFiles), getLibraryContext(project, allLibFiles)); + BindingContext preanalyzedContext = getLibraryContext(project); + config = new TestConfig(project, version, getLibFilesWithCode(getAllLibFiles(project)), preanalyzedContext); testConfigs.put(version, config); } return config; @@ -127,9 +127,25 @@ public final class TranslationUtils { } @NotNull - public static List initLibFiles(@NotNull Project project) { - List libFiles = new ArrayList(); - for (String libFileName : Config.LIB_FILE_NAMES) { + private static List initLibFiles(@NotNull Project project) { + return getLibFiles(project, Config.LIB_FILE_NAMES); + } + + @NotNull + private static List getLibFilesWithCode(@NotNull List allFiles) { + List result = Lists.newArrayList(); + for (JetFile file : allFiles) { + if (isFileWithCode(file)) { + result.add(file); + } + } + return result; + } + + @NotNull + private static List getLibFiles(@NotNull Project project, @NotNull List list) { + List libFiles = Lists.newArrayList(); + for (String libFileName : list) { JetFile file = null; try { @SuppressWarnings("IOResourceOpenedButNotSafelyClosed") 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 3b5a10dafb1..cc1ce4e3b43 100644 --- a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java +++ b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java @@ -35,12 +35,11 @@ import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.k2js.config.Config; -import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -52,6 +51,11 @@ import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isRootNamespace; */ public final class AnalyzerFacadeForJS { + @NotNull + public static final List DEFAULT_IMPORT_PATHS = Arrays.asList(new ImportPath("js.*"), new ImportPath("java.lang.*"), + new ImportPath(JetStandardClasses.STANDARD_CLASSES_FQNAME, true), + new ImportPath("kotlin.*")); + private AnalyzerFacadeForJS() { } @@ -59,7 +63,7 @@ public final class AnalyzerFacadeForJS { public static BindingContext analyzeFilesAndCheckErrors(@NotNull List files, @NotNull Config config) { BindingContext bindingContext = analyzeFiles(files, Predicates.alwaysTrue(), config).getBindingContext(); - checkForErrors(withJsLibAdded(files, config), bindingContext); + checkForErrors(Config.withJsLibAdded(files, config), bindingContext); return bindingContext; } @@ -103,7 +107,7 @@ public final class AnalyzerFacadeForJS { try { Collection allFiles = libraryBindingContext != null ? files : - withJsLibAdded(files, config); + Config.withJsLibAdded(files, config); injector.getTopDownAnalyzer().analyzeFiles(allFiles, Collections.emptyList()); BodiesResolveContext bodiesResolveContext = storeContextForBodiesResolve ? new CachedBodiesResolveContext(injector.getTopDownAnalysisContext()) : @@ -133,14 +137,6 @@ public final class AnalyzerFacadeForJS { } } - @NotNull - public static Collection withJsLibAdded(@NotNull Collection files, @NotNull Config config) { - Collection allFiles = new ArrayList(); - allFiles.addAll(files); - allFiles.addAll(config.getLibFiles()); - return allFiles; - } - @NotNull private static Predicate notLibFiles(@NotNull final List jsLibFiles) { return new Predicate() { @@ -167,11 +163,9 @@ public final class AnalyzerFacadeForJS { @Override public void addDefaultImports(@NotNull Collection directives) { - //TODO: these things should not be hard-coded like that - directives.add(JetPsiFactory.createImportDirective(project, new ImportPath("js.*"))); - directives.add(JetPsiFactory.createImportDirective(project, new ImportPath("java.lang.*"))); - directives.add(JetPsiFactory.createImportDirective(project, new ImportPath(JetStandardClasses.STANDARD_CLASSES_FQNAME, true))); - directives.add(JetPsiFactory.createImportDirective(project, new ImportPath("kotlin.*"))); + for (ImportPath path : DEFAULT_IMPORT_PATHS) { + directives.add(JetPsiFactory.createImportDirective(project, path)); + } } @Override @@ -182,13 +176,20 @@ public final class AnalyzerFacadeForJS { if (contextToBaseOn == null) { return; } - if (!isRootNamespace(namespaceDescriptor)) { - return; + if (isNamespaceImportedByDefault(namespaceDescriptor) || isRootNamespace(namespaceDescriptor)) { + FqName descriptorName = DescriptorUtils.getFQName(namespaceDescriptor).toSafe(); + NamespaceDescriptor alreadyAnalyzedNamespace = contextToBaseOn.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, descriptorName); + namespaceMemberScope.importScope(alreadyAnalyzedNamespace.getMemberScope()); } - NamespaceDescriptor rootNamespaceScope = contextToBaseOn.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, FqName.ROOT); - assert rootNamespaceScope != null; - JetScope memberScope = rootNamespaceScope.getMemberScope(); - namespaceMemberScope.importScope(memberScope); + } + + private static boolean isNamespaceImportedByDefault(@NotNull NamespaceDescriptor namespaceDescriptor) { + for (ImportPath path : DEFAULT_IMPORT_PATHS) { + if (path.fqnPart().equals(DescriptorUtils.getFQName(namespaceDescriptor).toSafe())) { + return true; + } + } + return false; } } } 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 c2e89f832ec..bc6bac5b61b 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/Config.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/Config.java @@ -77,9 +77,7 @@ public abstract class Config { ); @NotNull - public static final List LIB_FILES_WITH_CODE = Arrays.asList( - "/stdlib/JUMaps.kt" - ); + public static final List LIB_FILES_WITH_CODE = Lists.newArrayList(); @NotNull public static final List LIB_FILE_NAMES = Lists.newArrayList(); @@ -94,7 +92,7 @@ public abstract class Config { @NotNull public static final List LIB_FILE_NAMES_DEPENDENT_ON_STDLIB = Arrays.asList( "/stdlib/jutil.kt", - "/stdlib/JUMaps.kt", + //"/stdlib/JUMaps.kt", "/stdlib/test.kt", "/core/stringDefs.kt", "/core/strings.kt"