Support JVM_TARGET in diagnostic tests

This commit is contained in:
Mikhael Bogdanov
2018-01-23 15:31:10 +01:00
parent c4da370b0b
commit 8bfd6d7404
4 changed files with 40 additions and 7 deletions
@@ -105,7 +105,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
val separateModules = groupedByModule.size == 1 && groupedByModule.keys.single() == null
val result = analyzeModuleContents(
moduleContext, ktFiles, CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(),
languageVersionSettings, separateModules
languageVersionSettings, separateModules, loadJvmTarget(testFilesInModule)
)
if (oldModule != result.moduleDescriptor) {
// For common modules, we use DefaultAnalyzerFacade who creates ModuleDescriptor instances by itself
@@ -239,6 +239,24 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
)
}
protected open fun loadJvmTarget(module: List<TestFile>): JvmTarget {
var result: JvmTarget? = null
for (file in module) {
val current = file.jvmTarget
if (current != null) {
if (result != null && result != current) {
Assert.fail(
"More than one file in the module has $JVM_TARGET directive specified. " +
"This is not supported. Please move all directives into one file"
)
}
result = current
}
}
return result ?: JvmTarget.JVM_1_6
}
private fun checkDynamicCallDescriptors(expectedFile: File, testFiles: List<TestFile>) {
val serializer = RecursiveDescriptorComparator(RECURSIVE_ALL)
@@ -276,7 +294,8 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
files: List<KtFile>,
moduleTrace: BindingTrace,
languageVersionSettings: LanguageVersionSettings,
separateModules: Boolean
separateModules: Boolean,
jvmTarget: JvmTarget
): AnalysisResult {
@Suppress("NAME_SHADOWING")
var files = files
@@ -293,7 +312,10 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
moduleContext.project,
files,
moduleTrace,
environment.configuration.copy().apply { this.languageVersionSettings = languageVersionSettings },
environment.configuration.copy().apply {
this.languageVersionSettings = languageVersionSettings
this.put(JVMConfigurationKeys.JVM_TARGET, jvmTarget)
},
environment::createPackagePartProvider
)
}
@@ -329,7 +351,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
ExpectActualTracker.DoNothing,
environment.createPackagePartProvider(moduleContentScope),
moduleClassResolver,
JvmTarget.JVM_1_6,
jvmTarget,
languageVersionSettings
)
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.checkers
import com.intellij.openapi.util.text.StringUtil
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
@@ -59,7 +60,8 @@ abstract class AbstractDiagnosticsTestWithJsStdLib : AbstractDiagnosticsTest() {
files: List<KtFile>,
moduleTrace: BindingTrace,
languageVersionSettings: LanguageVersionSettings,
separateModules: Boolean
separateModules: Boolean,
jvmTarget: JvmTarget
): JsAnalysisResult {
// TODO: support LANGUAGE directive in JS diagnostic tests
moduleTrace.record<ModuleDescriptor, ModuleKind>(MODULE_KIND, moduleContext.module, getModuleKind(files))
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.checkers
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.hasError
@@ -32,9 +33,10 @@ abstract class AbstractDiagnosticsTestWithJsStdLibAndBackendCompilation : Abstra
files: List<KtFile>,
moduleTrace: BindingTrace,
languageVersionSettings: LanguageVersionSettings,
separateModules: Boolean
separateModules: Boolean,
jvmTarget: JvmTarget
): JsAnalysisResult {
val analysisResult = super.analyzeModuleContents(moduleContext, files, moduleTrace, languageVersionSettings, separateModules)
val analysisResult = super.analyzeModuleContents(moduleContext, files, moduleTrace, languageVersionSettings, separateModules, jvmTarget)
val diagnostics = analysisResult.bindingTrace.bindingContext.diagnostics
if (!hasError(diagnostics)) {
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.checkers.BaseDiagnosticsTest.TestFile
import org.jetbrains.kotlin.checkers.BaseDiagnosticsTest.TestModule
import org.jetbrains.kotlin.checkers.CheckerTestUtil.ActualDiagnostic
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
@@ -46,6 +47,8 @@ import java.util.*
import java.util.regex.Pattern
import kotlin.reflect.jvm.javaField
internal const val JVM_TARGET = "JVM_TARGET"
abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava<TestModule, TestFile>() {
protected lateinit var environment: KotlinCoreEnvironment
@@ -125,6 +128,7 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava<TestModule, Tes
private val createKtFile: Lazy<KtFile?>
private val whatDiagnosticsToConsider: Condition<Diagnostic>
val customLanguageVersionSettings: LanguageVersionSettings?
val jvmTarget: JvmTarget?
val declareCheckType: Boolean
val declareFlexibleType: Boolean
val checkLazyLog: Boolean
@@ -137,6 +141,7 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava<TestModule, Tes
this.declareCheckType = CHECK_TYPE_DIRECTIVE in directives
this.whatDiagnosticsToConsider = parseDiagnosticFilterDirective(directives, declareCheckType)
this.customLanguageVersionSettings = parseLanguageVersionSettings(directives)
this.jvmTarget = parseJvmTarget(directives)
this.checkLazyLog = CHECK_LAZY_LOG_DIRECTIVE in directives || CHECK_LAZY_LOG_DEFAULT
this.declareFlexibleType = EXPLICIT_FLEXIBLE_TYPES_DIRECTIVE in directives
this.markDynamicCalls = MARK_DYNAMIC_CALLS_DIRECTIVE in directives
@@ -413,4 +418,6 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava<TestModule, Tes
)
}
}
private fun parseJvmTarget(directiveMap: Map<String, String>) = directiveMap[JVM_TARGET]?.let { JvmTarget.fromString(it) }
}