Invert LanguageFeature responsible for warning on coroutines

The problem was that LanguageVersionSettingsImpl.DEFAULT did not have
"WarnOnCoroutines" as a feature and so it was manually added to the settings,
but only in two places: in the compiler and in the IDE
This commit is contained in:
Alexander Udalov
2017-02-16 18:41:23 +03:00
parent e3dab96715
commit a9678010a8
11 changed files with 38 additions and 33 deletions
@@ -288,19 +288,19 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> {
@Nullable
private static LanguageFeature chooseCoroutinesApplicabilityLevel(
@NotNull CompilerConfiguration configuration, @NotNull CommonCompilerArguments arguments) {
if (!arguments.coroutinesEnable && !arguments.coroutinesError && !arguments.coroutinesWarn) {
return LanguageFeature.WarnOnCoroutines;
}
else if (arguments.coroutinesError && !arguments.coroutinesWarn && !arguments.coroutinesEnable) {
@NotNull CompilerConfiguration configuration,
@NotNull CommonCompilerArguments arguments
) {
if (arguments.coroutinesError && !arguments.coroutinesWarn && !arguments.coroutinesEnable) {
return LanguageFeature.ErrorOnCoroutines;
}
else if (arguments.coroutinesWarn && !arguments.coroutinesError && !arguments.coroutinesEnable) {
return LanguageFeature.WarnOnCoroutines;
}
else if (arguments.coroutinesEnable && !arguments.coroutinesWarn && !arguments.coroutinesError) {
return LanguageFeature.DoNotWarnOnCoroutines;
}
else if (!arguments.coroutinesEnable && !arguments.coroutinesError) {
return null;
} else {
}
else {
String message = "The -Xcoroutines can only have one value";
configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY).report(
CompilerMessageSeverity.ERROR, message, CompilerMessageLocation.NO_LOCATION
@@ -103,8 +103,8 @@ object ModifierCheckerCore {
LanguageFeature.Coroutines to LanguageFeature.ErrorOnCoroutines
)
val warningOnFeature = mapOf(
LanguageFeature.Coroutines to LanguageFeature.WarnOnCoroutines
val noWarningOnFeature = mapOf(
LanguageFeature.Coroutines to LanguageFeature.DoNotWarnOnCoroutines
)
val featureDependenciesTargets = mapOf(
@@ -299,8 +299,8 @@ object ModifierCheckerCore {
return false
}
val pairedWarningFeature = warningOnFeature[dependency]
if (pairedWarningFeature != null && languageVersionSettings.supportsFeature(pairedWarningFeature)) {
val pairedNoWarningFeature = noWarningOnFeature[dependency]
if (pairedNoWarningFeature != null && !languageVersionSettings.supportsFeature(pairedNoWarningFeature)) {
trace.report(Errors.EXPERIMENTAL_FEATURE_WARNING.on(node.psi, diagnosticData))
}
@@ -96,7 +96,7 @@ fun checkCoroutinesFeature(languageVersionSettings: LanguageVersionSettings, dia
else if (languageVersionSettings.supportsFeature(LanguageFeature.ErrorOnCoroutines)) {
diagnosticHolder.report(Errors.EXPERIMENTAL_FEATURE_ERROR.on(reportOn, diagnosticData))
}
else if (languageVersionSettings.supportsFeature(LanguageFeature.WarnOnCoroutines)) {
else if (!languageVersionSettings.supportsFeature(LanguageFeature.DoNotWarnOnCoroutines)) {
diagnosticHolder.report(Errors.EXPERIMENTAL_FEATURE_WARNING.on(reportOn, diagnosticData))
}
}
@@ -1,5 +1,5 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !LANGUAGE: +WarnOnCoroutines
// !LANGUAGE: -DoNotWarnOnCoroutines
<!EXPERIMENTAL_FEATURE_WARNING!>suspend<!> fun suspendHere(): String = "OK"
@@ -1,4 +1,5 @@
// !API_VERSION: 1.1
// !LANGUAGE: +DoNotWarnOnCoroutines
// SKIP_TXT
import kotlin.coroutines.experimental.*
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.analyzer.common.DefaultAnalyzerFacade
import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport
import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.context.ModuleContext
@@ -63,6 +64,7 @@ import org.jetbrains.kotlin.test.util.DescriptorValidator
import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator
import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator.RECURSIVE
import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator.RECURSIVE_ALL
import org.jetbrains.kotlin.utils.keysToMap
import org.junit.Assert
import java.io.File
import java.util.*
@@ -198,7 +200,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
// To be overridden by diagnostic-like tests.
}
private fun loadLanguageVersionSettings(module: List<TestFile>): LanguageVersionSettings? {
private fun loadLanguageVersionSettings(module: List<TestFile>): LanguageVersionSettings {
var result: LanguageVersionSettings? = null
for (file in module) {
val current = file.customLanguageVersionSettings
@@ -213,7 +215,11 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
}
}
return result
return result ?: BaseDiagnosticsTest.DiagnosticTestLanguageVersionSettings(
BaseDiagnosticsTest.DEFAULT_DIAGNOSTIC_TESTS_FEATURES.keysToMap { true },
LanguageVersionSettingsImpl.DEFAULT.apiVersion,
LanguageVersionSettingsImpl.DEFAULT.languageVersion
)
}
private fun checkDynamicCallDescriptors(expectedFile: File, testFiles: List<TestFile>) {
@@ -253,19 +259,15 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
moduleContext: ModuleContext,
files: List<KtFile>,
moduleTrace: BindingTrace,
languageVersionSettings: LanguageVersionSettings?,
languageVersionSettings: LanguageVersionSettings,
separateModules: Boolean
): AnalysisResult {
@Suppress("NAME_SHADOWING")
var files = files
val configuration =
if (languageVersionSettings != null)
environment.configuration.copy().apply {
this.languageVersionSettings = languageVersionSettings
}
else
environment.configuration
val configuration = environment.configuration.copy().apply {
this.languageVersionSettings = languageVersionSettings
}
// New JavaDescriptorResolver is created for each module, which is good because it emulates different Java libraries for each module,
// albeit with same class names
@@ -286,6 +286,10 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava<TestModule, Tes
val LANGUAGE_VERSION = "LANGUAGE_VERSION"
private val LANGUAGE_PATTERN = Pattern.compile("([\\+\\-])(\\w+)\\s*")
val DEFAULT_DIAGNOSTIC_TESTS_FEATURES = listOf(
LanguageFeature.DoNotWarnOnCoroutines
)
val API_VERSION_DIRECTIVE = "API_VERSION"
val CHECK_TYPE_DIRECTIVE = "CHECK_TYPE"
@@ -62,11 +62,10 @@ abstract class AbstractDiagnosticsTestWithJsStdLib : AbstractDiagnosticsTest() {
moduleContext: ModuleContext,
files: List<KtFile>,
moduleTrace: BindingTrace,
languageVersionSettings: LanguageVersionSettings?,
languageVersionSettings: LanguageVersionSettings,
separateModules: Boolean
): JsAnalysisResult {
// TODO: support LANGUAGE directive in JS diagnostic tests
assert(languageVersionSettings == null) { "$LANGUAGE_DIRECTIVE directive is not supported in JS diagnostic tests" }
moduleTrace.record<ModuleDescriptor, ModuleKind>(MODULE_KIND, moduleContext.module, getModuleKind(files))
return TopDownAnalyzerFacadeForJS.analyzeFilesWithGivenTrace(files, moduleTrace, moduleContext, config)
}
@@ -30,7 +30,7 @@ abstract class AbstractDiagnosticsTestWithJsStdLibAndBackendCompilation : Abstra
moduleContext: ModuleContext,
files: List<KtFile>,
moduleTrace: BindingTrace,
languageVersionSettings: LanguageVersionSettings?,
languageVersionSettings: LanguageVersionSettings,
separateModules: Boolean
): JsAnalysisResult {
val analysisResult = super.analyzeModuleContents(moduleContext, files, moduleTrace, languageVersionSettings, separateModules)
@@ -52,7 +52,7 @@ enum class LanguageFeature(
MultiPlatformProjects(null),
MultiPlatformDoNotCheckImpl(null),
WarnOnCoroutines(null),
DoNotWarnOnCoroutines(null),
ErrorOnCoroutines(null)
;
@@ -100,7 +100,6 @@ interface LanguageVersionSettings {
// Please do not use this to enable/disable specific features/checks. Instead add a new LanguageFeature entry and call supportsFeature
val languageVersion: LanguageVersion
// TODO: refactor arguments related to coroutines so that this list is empty by default
val additionalFeatures: Collection<LanguageFeature>
@Deprecated("This is a temporary solution, please do not use.")
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.resolve.TargetPlatform
val KtElement.platform: TargetPlatform
get() = TargetPlatformDetector.getPlatform(getContainingKtFile())
get() = TargetPlatformDetector.getPlatform(containingKtFile)
val KtElement.builtIns: KotlinBuiltIns
get() = getResolutionFacade().moduleDescriptor.builtIns
@@ -130,8 +130,8 @@ private fun getExtraLanguageFeatures(
): List<LanguageFeature> {
return mutableListOf<LanguageFeature>().apply {
when (coroutineSupport) {
CoroutineSupport.ENABLED -> {}
CoroutineSupport.ENABLED_WITH_WARNING -> add(LanguageFeature.WarnOnCoroutines)
CoroutineSupport.ENABLED -> add(LanguageFeature.DoNotWarnOnCoroutines)
CoroutineSupport.ENABLED_WITH_WARNING -> {}
CoroutineSupport.DISABLED -> add(LanguageFeature.ErrorOnCoroutines)
}
if (targetPlatformKind == TargetPlatformKind.Common ||