[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 org.jetbrains.kotlin.test.KotlinTestUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Map;
import static java.util.Collections.singletonList; import static java.util.Collections.singletonList;
@@ -32,8 +34,8 @@ public abstract class AbstractDiagnosticMessageJsTest extends AbstractDiagnostic
@NotNull @NotNull
@Override @Override
protected AnalysisResult analyze(@NotNull KtFile file, @Nullable LanguageVersion explicitLanguageVersion) { protected AnalysisResult analyze(@NotNull KtFile file, @Nullable LanguageVersion explicitLanguageVersion, @NotNull Map<LanguageFeature, LanguageFeature.State> specificFeatures) {
return TopDownAnalyzerFacadeForJS.analyzeFiles(singletonList(file), getConfig(explicitLanguageVersion)); return TopDownAnalyzerFacadeForJS.analyzeFiles(singletonList(file), getConfig(explicitLanguageVersion, specificFeatures));
} }
@NotNull @NotNull
@@ -49,17 +51,21 @@ public abstract class AbstractDiagnosticMessageJsTest extends AbstractDiagnostic
} }
@NotNull @NotNull
private JsConfig getConfig(@Nullable LanguageVersion explicitLanguageVersion) { private JsConfig getConfig(@Nullable LanguageVersion explicitLanguageVersion, @NotNull Map<LanguageFeature, LanguageFeature.State> specificFeatures) {
CompilerConfiguration configuration = getEnvironment().getConfiguration().copy(); CompilerConfiguration configuration = getEnvironment().getConfiguration().copy();
configuration.put(CommonConfigurationKeys.MODULE_NAME, KotlinTestUtils.TEST_MODULE_NAME); configuration.put(CommonConfigurationKeys.MODULE_NAME, KotlinTestUtils.TEST_MODULE_NAME);
configuration.put(JSConfigurationKeys.LIBRARIES, JsConfig.JS_STDLIB); configuration.put(JSConfigurationKeys.LIBRARIES, JsConfig.JS_STDLIB);
configuration.put(CommonConfigurationKeys.DISABLE_INLINE, true); configuration.put(CommonConfigurationKeys.DISABLE_INLINE, true);
if (explicitLanguageVersion != null) {
CommonConfigurationKeysKt.setLanguageVersionSettings( LanguageVersion languageVersion = explicitLanguageVersion == null
configuration, ? CommonConfigurationKeysKt.getLanguageVersionSettings(configuration).getLanguageVersion()
new LanguageVersionSettingsImpl(explicitLanguageVersion, LanguageVersionSettingsImpl.DEFAULT.getApiVersion()) : explicitLanguageVersion;
);
} CommonConfigurationKeysKt.setLanguageVersionSettings(configuration, new LanguageVersionSettingsImpl(
languageVersion,
LanguageVersionSettingsImpl.DEFAULT.getApiVersion(),
Collections.emptyMap(),
specificFeatures));
return new JsConfig(getProject(), configuration); return new JsConfig(getProject(), configuration);
} }
} }
@@ -12,10 +12,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.analyzer.AnalysisResult; import org.jetbrains.kotlin.analyzer.AnalysisResult;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.config.CommonConfigurationKeysKt; import org.jetbrains.kotlin.config.*;
import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.config.LanguageVersion;
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl;
import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory; import org.jetbrains.kotlin.diagnostics.DiagnosticFactory;
import org.jetbrains.kotlin.diagnostics.Errors; import org.jetbrains.kotlin.diagnostics.Errors;
@@ -64,14 +61,17 @@ public abstract class AbstractDiagnosticMessageTest extends KotlinTestWithEnviro
} }
@NotNull @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(); CompilerConfiguration configuration = getEnvironment().getConfiguration();
if (explicitLanguageVersion != null) { LanguageVersion languageVersion = explicitLanguageVersion == null
CommonConfigurationKeysKt.setLanguageVersionSettings( ? CommonConfigurationKeysKt.getLanguageVersionSettings(configuration).getLanguageVersion()
configuration, : explicitLanguageVersion;
new LanguageVersionSettingsImpl(explicitLanguageVersion, LanguageVersionSettingsImpl.DEFAULT.getApiVersion())
); CommonConfigurationKeysKt.setLanguageVersionSettings(configuration, new LanguageVersionSettingsImpl(
} languageVersion,
LanguageVersionSettingsImpl.DEFAULT.getApiVersion(),
Collections.emptyMap(),
specificFeatures));
return JvmResolveUtil.analyze(Collections.singleton(file), getEnvironment(), configuration); 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:"); String explicitLanguageVersion = InTextDirectivesUtils.findStringWithPrefixes(fileData, "// LANGUAGE_VERSION:");
LanguageVersion version = explicitLanguageVersion == null ? null : LanguageVersion.fromVersionString(explicitLanguageVersion); 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()); 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(); BindingContext bindingContext = analysisResult.getBindingContext();
List<Diagnostic> diagnostics = ContainerUtil.filter(bindingContext.getDiagnostics().all(), new Condition<Diagnostic>() { 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) { private static int getDiagnosticNumber(Map<String, String> directives) {
String diagnosticsNumber = directives.get(DIAGNOSTICS_NUMBER_DIRECTIVE); String diagnosticsNumber = directives.get(DIAGNOSTICS_NUMBER_DIRECTIVE);
assert diagnosticsNumber != null : DIAGNOSTICS_NUMBER_DIRECTIVE + " should be present."; assert diagnosticsNumber != null : DIAGNOSTICS_NUMBER_DIRECTIVE + " should be present.";