[TEST] Add configuration of language features in AbstractDiagnosticMessageTest

This commit is contained in:
Dmitriy Novozhilov
2019-04-22 19:27:29 +03:00
committed by Mikhail Zarechenskiy
parent 05aa36a858
commit 48e450684b
2 changed files with 56 additions and 21 deletions
@@ -20,6 +20,8 @@ import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.test.KotlinTestUtils;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Map;
import static java.util.Collections.singletonList;
@@ -32,8 +34,8 @@ public abstract class AbstractDiagnosticMessageJsTest extends AbstractDiagnostic
@NotNull
@Override
protected AnalysisResult analyze(@NotNull KtFile file, @Nullable LanguageVersion explicitLanguageVersion) {
return TopDownAnalyzerFacadeForJS.analyzeFiles(singletonList(file), getConfig(explicitLanguageVersion));
protected AnalysisResult analyze(@NotNull KtFile file, @Nullable LanguageVersion explicitLanguageVersion, @NotNull Map<LanguageFeature, LanguageFeature.State> specificFeatures) {
return TopDownAnalyzerFacadeForJS.analyzeFiles(singletonList(file), getConfig(explicitLanguageVersion, specificFeatures));
}
@NotNull
@@ -49,17 +51,21 @@ public abstract class AbstractDiagnosticMessageJsTest extends AbstractDiagnostic
}
@NotNull
private JsConfig getConfig(@Nullable LanguageVersion explicitLanguageVersion) {
private JsConfig getConfig(@Nullable LanguageVersion explicitLanguageVersion, @NotNull Map<LanguageFeature, LanguageFeature.State> specificFeatures) {
CompilerConfiguration configuration = getEnvironment().getConfiguration().copy();
configuration.put(CommonConfigurationKeys.MODULE_NAME, KotlinTestUtils.TEST_MODULE_NAME);
configuration.put(JSConfigurationKeys.LIBRARIES, JsConfig.JS_STDLIB);
configuration.put(CommonConfigurationKeys.DISABLE_INLINE, true);
if (explicitLanguageVersion != null) {
CommonConfigurationKeysKt.setLanguageVersionSettings(
configuration,
new LanguageVersionSettingsImpl(explicitLanguageVersion, LanguageVersionSettingsImpl.DEFAULT.getApiVersion())
);
}
LanguageVersion languageVersion = explicitLanguageVersion == null
? CommonConfigurationKeysKt.getLanguageVersionSettings(configuration).getLanguageVersion()
: explicitLanguageVersion;
CommonConfigurationKeysKt.setLanguageVersionSettings(configuration, new LanguageVersionSettingsImpl(
languageVersion,
LanguageVersionSettingsImpl.DEFAULT.getApiVersion(),
Collections.emptyMap(),
specificFeatures));
return new JsConfig(getProject(), configuration);
}
}
@@ -12,10 +12,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.analyzer.AnalysisResult;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.config.CommonConfigurationKeysKt;
import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.config.LanguageVersion;
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl;
import org.jetbrains.kotlin.config.*;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory;
import org.jetbrains.kotlin.diagnostics.Errors;
@@ -64,14 +61,17 @@ public abstract class AbstractDiagnosticMessageTest extends KotlinTestWithEnviro
}
@NotNull
protected AnalysisResult analyze(@NotNull KtFile file, @Nullable LanguageVersion explicitLanguageVersion) {
protected AnalysisResult analyze(@NotNull KtFile file, @Nullable LanguageVersion explicitLanguageVersion, @NotNull Map<LanguageFeature, LanguageFeature.State> specificFeatures) {
CompilerConfiguration configuration = getEnvironment().getConfiguration();
if (explicitLanguageVersion != null) {
CommonConfigurationKeysKt.setLanguageVersionSettings(
configuration,
new LanguageVersionSettingsImpl(explicitLanguageVersion, LanguageVersionSettingsImpl.DEFAULT.getApiVersion())
);
}
LanguageVersion languageVersion = explicitLanguageVersion == null
? CommonConfigurationKeysKt.getLanguageVersionSettings(configuration).getLanguageVersion()
: explicitLanguageVersion;
CommonConfigurationKeysKt.setLanguageVersionSettings(configuration, new LanguageVersionSettingsImpl(
languageVersion,
LanguageVersionSettingsImpl.DEFAULT.getApiVersion(),
Collections.emptyMap(),
specificFeatures));
return JvmResolveUtil.analyze(Collections.singleton(file), getEnvironment(), configuration);
}
@@ -87,9 +87,10 @@ public abstract class AbstractDiagnosticMessageTest extends KotlinTestWithEnviro
String explicitLanguageVersion = InTextDirectivesUtils.findStringWithPrefixes(fileData, "// LANGUAGE_VERSION:");
LanguageVersion version = explicitLanguageVersion == null ? null : LanguageVersion.fromVersionString(explicitLanguageVersion);
Map<LanguageFeature, LanguageFeature.State> specificFeatures = parseLanguageFeatures(fileData);
KtFile psiFile = KotlinTestUtils.createFile(fileName, KotlinTestUtils.doLoadFile(getTestDataPath(), fileName), getProject());
AnalysisResult analysisResult = analyze(psiFile, version);
AnalysisResult analysisResult = analyze(psiFile, version, specificFeatures);
BindingContext bindingContext = analysisResult.getBindingContext();
List<Diagnostic> diagnostics = ContainerUtil.filter(bindingContext.getDiagnostics().all(), new Condition<Diagnostic>() {
@@ -123,6 +124,34 @@ public abstract class AbstractDiagnosticMessageTest extends KotlinTestWithEnviro
}
}
private Map<LanguageFeature, LanguageFeature.State> parseLanguageFeatures(String fileText) {
List<String> directives = InTextDirectivesUtils.findListWithPrefixes(fileText, "// !LANGUAGE:");
Map<LanguageFeature, LanguageFeature.State> result = new HashMap<>();
for (String directive : directives) {
LanguageFeature.State state;
char sign = directive.charAt(0);
switch (sign) {
case '+':
state = LanguageFeature.State.ENABLED;
break;
case '-':
state = LanguageFeature.State.DISABLED;
break;
default:
continue;
}
String featureName = directive.substring(1);
LanguageFeature feature;
try {
feature = LanguageFeature.fromString(featureName);
} catch (Exception e) {
continue;
}
result.put(feature, state);
}
return result;
}
private static int getDiagnosticNumber(Map<String, String> directives) {
String diagnosticsNumber = directives.get(DIAGNOSTICS_NUMBER_DIRECTIVE);
assert diagnosticsNumber != null : DIAGNOSTICS_NUMBER_DIRECTIVE + " should be present.";