Value classes: Add JvmInlineValueClasses language feature
This commit is contained in:
@@ -119,8 +119,7 @@ object ModifierCheckerCore {
|
||||
EXPECT_KEYWORD to listOf(LanguageFeature.MultiPlatformProjects),
|
||||
ACTUAL_KEYWORD to listOf(LanguageFeature.MultiPlatformProjects),
|
||||
LATEINIT_KEYWORD to listOf(LanguageFeature.LateinitTopLevelProperties, LanguageFeature.LateinitLocalVariables),
|
||||
FUN_KEYWORD to listOf(LanguageFeature.FunctionalInterfaceConversion),
|
||||
VALUE_KEYWORD to listOf(LanguageFeature.InlineClasses)
|
||||
FUN_KEYWORD to listOf(LanguageFeature.FunctionalInterfaceConversion)
|
||||
)
|
||||
|
||||
private val featureDependenciesTargets = mapOf(
|
||||
@@ -128,6 +127,7 @@ object ModifierCheckerCore {
|
||||
LanguageFeature.LateinitLocalVariables to setOf(LOCAL_VARIABLE),
|
||||
LanguageFeature.LateinitTopLevelProperties to setOf(TOP_LEVEL_PROPERTY),
|
||||
LanguageFeature.InlineClasses to setOf(CLASS_ONLY),
|
||||
LanguageFeature.JvmInlineValueClasses to setOf(CLASS_ONLY),
|
||||
LanguageFeature.FunctionalInterfaceConversion to setOf(INTERFACE)
|
||||
)
|
||||
|
||||
|
||||
+21
-3
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.resolve.checkers
|
||||
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.builtins.StandardNames
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
@@ -32,11 +33,28 @@ object InlineClassDeclarationChecker : DeclarationChecker {
|
||||
if (descriptor !is ClassDescriptor || !descriptor.isInline && !descriptor.isValue) return
|
||||
if (descriptor.kind != ClassKind.CLASS) return
|
||||
|
||||
val inlineOrValueKeyword = declaration.modifierList?.getModifier(KtTokens.INLINE_KEYWORD)
|
||||
?: declaration.modifierList?.getModifier(KtTokens.VALUE_KEYWORD)
|
||||
val trace = context.trace
|
||||
|
||||
val valueKeyword = declaration.modifierList?.getModifier(KtTokens.VALUE_KEYWORD)
|
||||
|
||||
// The check cannot be done in ModifierCheckerCore, since `value` keyword is enabled by one of two features, not by both of
|
||||
// them simultaneously
|
||||
if (valueKeyword != null) {
|
||||
if (!context.languageVersionSettings.supportsFeature(LanguageFeature.JvmInlineValueClasses) &&
|
||||
!context.languageVersionSettings.supportsFeature(LanguageFeature.InlineClasses)
|
||||
) {
|
||||
trace.report(
|
||||
Errors.UNSUPPORTED_FEATURE.on(
|
||||
valueKeyword, LanguageFeature.JvmInlineValueClasses to context.languageVersionSettings
|
||||
)
|
||||
)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
val inlineOrValueKeyword = declaration.modifierList?.getModifier(KtTokens.INLINE_KEYWORD) ?: valueKeyword
|
||||
require(inlineOrValueKeyword != null) { "Declaration of inline class must have 'inline' keyword" }
|
||||
|
||||
val trace = context.trace
|
||||
if (descriptor.isInner || DescriptorUtils.isLocal(descriptor)) {
|
||||
trace.report(Errors.INLINE_CLASS_NOT_TOP_LEVEL.on(inlineOrValueKeyword))
|
||||
return
|
||||
|
||||
+2
-1
@@ -21,7 +21,8 @@ class ResultClassInReturnTypeChecker : DeclarationChecker {
|
||||
val languageVersionSettings = context.languageVersionSettings
|
||||
if (
|
||||
languageVersionSettings.getFlag(AnalysisFlags.allowResultReturnType) ||
|
||||
languageVersionSettings.getFeatureSupport(LanguageFeature.InlineClasses) == LanguageFeature.State.ENABLED &&
|
||||
(languageVersionSettings.getFeatureSupport(LanguageFeature.InlineClasses) == LanguageFeature.State.ENABLED ||
|
||||
languageVersionSettings.supportsFeature(LanguageFeature.JvmInlineValueClasses)) &&
|
||||
languageVersionSettings.supportsFeature(LanguageFeature.AllowResultInReturnType)
|
||||
) return
|
||||
|
||||
|
||||
Reference in New Issue
Block a user