diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageJsTest.java b/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageJsTest.java index a6342212b00..ca2863d4cb3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageJsTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageJsTest.java @@ -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 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 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); } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageTest.java b/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageTest.java index b28dd16671d..0fe23b7bb2c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageTest.java @@ -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 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 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 diagnostics = ContainerUtil.filter(bindingContext.getDiagnostics().all(), new Condition() { @@ -123,6 +124,34 @@ public abstract class AbstractDiagnosticMessageTest extends KotlinTestWithEnviro } } + private Map parseLanguageFeatures(String fileText) { + List directives = InTextDirectivesUtils.findListWithPrefixes(fileText, "// !LANGUAGE:"); + Map 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 directives) { String diagnosticsNumber = directives.get(DIAGNOSTICS_NUMBER_DIRECTIVE); assert diagnosticsNumber != null : DIAGNOSTICS_NUMBER_DIRECTIVE + " should be present.";