KT-12877: add JsNonModule with support on front-end

This commit is contained in:
Alexey Andreev
2016-07-01 16:47:40 +03:00
committed by Alexey Andreev
parent 3f2ec6871d
commit 0238b182cc
20 changed files with 1581 additions and 57 deletions
@@ -537,12 +537,18 @@ public abstract class AbstractDiagnosticsTest extends BaseDiagnosticsTest {
}
dependencies.add(module.getBuiltIns().getBuiltInsModule());
dependencies.addAll(getAdditionalDependencies(module));
module.setDependencies(dependencies);
}
return modules;
}
@NotNull
protected List<ModuleDescriptorImpl> getAdditionalDependencies(@NotNull ModuleDescriptorImpl module) {
return Collections.emptyList();
}
@NotNull
@SuppressWarnings("unchecked")
protected ModuleDescriptorImpl createModule(@NotNull String moduleName, @NotNull StorageManager storageManager) {
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.checkers;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles;
@@ -29,11 +30,13 @@ import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult;
import org.jetbrains.kotlin.js.config.JSConfigurationKeys;
import org.jetbrains.kotlin.js.config.JsConfig;
import org.jetbrains.kotlin.js.config.LibrarySourcesConfig;
import org.jetbrains.kotlin.js.resolve.BindingContextSlicesJsKt;
import org.jetbrains.kotlin.js.resolve.JsPlatform;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.serialization.js.JsModuleDescriptor;
import org.jetbrains.kotlin.serialization.js.ModuleKind;
import org.jetbrains.kotlin.storage.StorageManager;
import org.jetbrains.kotlin.test.KotlinTestUtils;
@@ -77,9 +80,40 @@ public abstract class AbstractDiagnosticsTestWithJsStdLib extends AbstractDiagno
// TODO: support LANGUAGE directive in JS diagnostic tests
assert languageVersionSettings == null
: BaseDiagnosticsTest.LANGUAGE_DIRECTIVE + " directive is not supported in JS diagnostic tests";
moduleTrace.record(BindingContextSlicesJsKt.MODULE_KIND, moduleContext.getModule(), getModuleKind(ktFiles));
return TopDownAnalyzerFacadeForJS.analyzeFilesWithGivenTrace(ktFiles, moduleTrace, moduleContext, config);
}
@NotNull
private static ModuleKind getModuleKind(@NotNull List<KtFile> ktFiles) {
ModuleKind kind = ModuleKind.PLAIN;
for (KtFile file : ktFiles) {
String text = file.getText();
for (String line : StringUtil.splitByLines(text)) {
line = line.trim();
if (!line.startsWith("//")) continue;
line = line.substring(2).trim();
List<String> parts = StringUtil.split(line, ":");
if (parts.size() != 2) continue;
if (!parts.get(0).trim().equals("MODULE_KIND")) continue;
kind = ModuleKind.valueOf(parts.get(1).trim());
}
}
return kind;
}
@Override
@NotNull
protected List<ModuleDescriptorImpl> getAdditionalDependencies(@NotNull ModuleDescriptorImpl module) {
List<ModuleDescriptorImpl> dependencies = new ArrayList<ModuleDescriptorImpl>();
for (JsModuleDescriptor<ModuleDescriptorImpl> moduleDescriptor : config.getModuleDescriptors()) {
dependencies.add(moduleDescriptor.getData());
}
return dependencies;
}
@Override
public boolean shouldSkipJvmSignatureDiagnostics(Map<TestModule, List<TestFile>> groupedByModule) {
return true;
@@ -99,9 +133,7 @@ public abstract class AbstractDiagnosticsTestWithJsStdLib extends AbstractDiagno
List<ModuleDescriptorImpl> dependencies = new ArrayList<ModuleDescriptorImpl>();
dependencies.add(module);
for (JsModuleDescriptor<ModuleDescriptorImpl> moduleDescriptor : config.getModuleDescriptors()) {
dependencies.add(moduleDescriptor.getData());
}
dependencies.addAll(getAdditionalDependencies(module));
dependencies.add(module.getBuiltIns().getBuiltInsModule());
module.setDependencies(dependencies);
@@ -316,6 +316,18 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/module/prohibitedOnNonNative.kt");
doTest(fileName);
}
@TestMetadata("wrongCallToModule.kt")
public void testWrongCallToModule() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToModule.kt");
doTest(fileName);
}
@TestMetadata("wrongCallToNonModule.kt")
public void testWrongCallToNonModule() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/module/wrongCallToNonModule.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/name")