[K/JS] Deprecate external enum declarations
^KT-57254 Fixed
This commit is contained in:
+6
@@ -4904,6 +4904,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirJsErrors.ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING) { firDiagnostic ->
|
||||
EnumClassInExternalDeclarationWarningImpl(
|
||||
firDiagnostic as KtPsiDiagnostic,
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirJsErrors.INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING) { firDiagnostic ->
|
||||
InlineClassInExternalDeclarationWarningImpl(
|
||||
firDiagnostic as KtPsiDiagnostic,
|
||||
|
||||
+4
@@ -3409,6 +3409,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
override val diagnosticClass get() = InlineExternalDeclaration::class
|
||||
}
|
||||
|
||||
abstract class EnumClassInExternalDeclarationWarning : KtFirDiagnostic<KtDeclaration>() {
|
||||
override val diagnosticClass get() = EnumClassInExternalDeclarationWarning::class
|
||||
}
|
||||
|
||||
abstract class InlineClassInExternalDeclarationWarning : KtFirDiagnostic<KtElement>() {
|
||||
override val diagnosticClass get() = InlineClassInExternalDeclarationWarning::class
|
||||
}
|
||||
|
||||
+5
@@ -4126,6 +4126,11 @@ internal class InlineExternalDeclarationImpl(
|
||||
override val token: KtLifetimeToken,
|
||||
) : KtFirDiagnostic.InlineExternalDeclaration(), KtAbstractFirDiagnostic<KtDeclaration>
|
||||
|
||||
internal class EnumClassInExternalDeclarationWarningImpl(
|
||||
override val firDiagnostic: KtPsiDiagnostic,
|
||||
override val token: KtLifetimeToken,
|
||||
) : KtFirDiagnostic.EnumClassInExternalDeclarationWarning(), KtAbstractFirDiagnostic<KtDeclaration>
|
||||
|
||||
internal class InlineClassInExternalDeclarationWarningImpl(
|
||||
override val firDiagnostic: KtPsiDiagnostic,
|
||||
override val token: KtLifetimeToken,
|
||||
|
||||
+1
@@ -78,6 +78,7 @@ object JS_DIAGNOSTICS_LIST : DiagnosticList("FirJsErrors") {
|
||||
val NESTED_CLASS_IN_EXTERNAL_INTERFACE by error<KtExpression>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val INLINE_EXTERNAL_DECLARATION by error<KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING by warning<KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING by warning<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val INLINE_CLASS_IN_EXTERNAL_DECLARATION by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val EXTENSION_FUNCTION_IN_EXTERNAL_DECLARATION by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
|
||||
+1
@@ -69,6 +69,7 @@ object FirJsErrors {
|
||||
val NESTED_CLASS_IN_EXTERNAL_INTERFACE by error0<KtExpression>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val INLINE_EXTERNAL_DECLARATION by error0<KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING by warning0<KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING by warning0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val INLINE_CLASS_IN_EXTERNAL_DECLARATION by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val EXTENSION_FUNCTION_IN_EXTERNAL_DECLARATION by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
|
||||
+5
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.DELEGATION_B
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.IMPLEMENTING_FUNCTION_INTERFACE
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.INLINE_CLASS_IN_EXTERNAL_DECLARATION
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.INLINE_EXTERNAL_DECLARATION
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_MODULE_PROHIBITED_ON_NON_NATIVE
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_MODULE_PROHIBITED_ON_VAR
|
||||
@@ -106,6 +107,10 @@ object FirJsErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
|
||||
INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING,
|
||||
"Using value classes as parameter type or return type of external declarations is experimental"
|
||||
)
|
||||
map.put(
|
||||
ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING,
|
||||
"Using enum classes with an `external` qualifier becomes deprecated and will be an error in future releases"
|
||||
)
|
||||
map.put(
|
||||
INLINE_CLASS_IN_EXTERNAL_DECLARATION,
|
||||
"Using value classes as parameter type or return type of external declarations is not supported"
|
||||
|
||||
+5
-1
@@ -64,6 +64,10 @@ object FirJsExternalChecker : FirBasicDeclarationChecker() {
|
||||
if (classKind != null) {
|
||||
reporter.reportOn(declaration.source, FirJsErrors.WRONG_EXTERNAL_DECLARATION, classKind, context)
|
||||
}
|
||||
|
||||
if (declaration.isEnumClass) {
|
||||
reporter.reportOn(declaration.source, FirJsErrors.ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING, context)
|
||||
}
|
||||
}
|
||||
|
||||
if (declaration is FirPropertyAccessor && declaration.isDirectlyExternal(context.session)) {
|
||||
@@ -184,7 +188,7 @@ object FirJsExternalChecker : FirBasicDeclarationChecker() {
|
||||
declaration.checkAnonymousInitializer(context, reporter)
|
||||
declaration.checkEnumEntry(context, reporter)
|
||||
declaration.checkConstructorPropertyParam(context, reporter)
|
||||
}
|
||||
}
|
||||
|
||||
private val KtSourceElement.allowsReporting
|
||||
get() = kind !is KtFakeSourceElementKind || kind == KtFakeSourceElementKind.PropertyFromParameter
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
external enum class E {
|
||||
// !DIAGNOSTICS: +ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING
|
||||
external enum class <!ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>E<!> {
|
||||
X,
|
||||
<!EXTERNAL_ENUM_ENTRY_WITH_BODY!>Y {
|
||||
fun foo()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
external enum class E {
|
||||
external enum class <!ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>E<!> {
|
||||
X,
|
||||
Y <!EXTERNAL_ENUM_ENTRY_WITH_BODY!>{
|
||||
fun foo()
|
||||
|
||||
+2
-1
@@ -1,4 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: +ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING
|
||||
external interface I {
|
||||
interface J
|
||||
|
||||
@@ -6,7 +7,7 @@ external interface I {
|
||||
|
||||
<!NESTED_CLASS_IN_EXTERNAL_INTERFACE!>object O<!>
|
||||
|
||||
enum class <!NESTED_CLASS_IN_EXTERNAL_INTERFACE!>E<!>
|
||||
enum class <!ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING, NESTED_CLASS_IN_EXTERNAL_INTERFACE!>E<!>
|
||||
|
||||
companion <!NESTED_CLASS_IN_EXTERNAL_INTERFACE!>object<!>
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: +ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING
|
||||
open class A
|
||||
|
||||
interface I
|
||||
@@ -11,10 +12,10 @@ external class <!EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE!>D<!> : B, I
|
||||
|
||||
external interface <!EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE!>K<!> : I
|
||||
|
||||
external enum class E {
|
||||
external enum class <!ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>E<!> {
|
||||
X
|
||||
}
|
||||
|
||||
external enum class <!EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE!>F<!> : I {
|
||||
external enum class <!ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING, EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE!>F<!> : I {
|
||||
X
|
||||
}
|
||||
@@ -1,10 +1,11 @@
|
||||
// FIR_IDENTICAL
|
||||
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
||||
// !DIAGNOSTICS: +ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING
|
||||
|
||||
external inline class <!WRONG_EXTERNAL_DECLARATION!>C(<!EXTERNAL_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER!>val a: Int<!>)<!> {
|
||||
fun foo()
|
||||
}
|
||||
|
||||
<!WRONG_MODIFIER_TARGET!>inline<!> external enum class <!WRONG_EXTERNAL_DECLARATION!>E<!> {
|
||||
<!WRONG_MODIFIER_TARGET!>inline<!> external enum class <!ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING, WRONG_EXTERNAL_DECLARATION!>E<!> {
|
||||
A
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: +ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING
|
||||
external class C {
|
||||
inner class <!WRONG_EXTERNAL_DECLARATION!>Inner<!>
|
||||
}
|
||||
|
||||
external enum class E {
|
||||
external enum class <!ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>E<!> {
|
||||
X;
|
||||
|
||||
inner class <!WRONG_EXTERNAL_DECLARATION!>Inner<!>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: +ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING
|
||||
external annotation class <!WRONG_EXTERNAL_DECLARATION!>A(val x: Int)<!>
|
||||
|
||||
val x: Int
|
||||
@@ -19,4 +20,8 @@ external class D {
|
||||
<!WRONG_EXTERNAL_DECLARATION!>external get()<!> = definedExternally
|
||||
}
|
||||
|
||||
external data class <!WRONG_EXTERNAL_DECLARATION!>E(val x: Int)<!>
|
||||
external data class <!WRONG_EXTERNAL_DECLARATION!>E(val x: Int)<!>
|
||||
|
||||
external enum class <!ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>F<!> {
|
||||
A, B, C
|
||||
}
|
||||
@@ -43,3 +43,26 @@ public final external data class E {
|
||||
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final external enum class F : kotlin.Enum<F> {
|
||||
enum entry A
|
||||
|
||||
enum entry B
|
||||
|
||||
enum entry C
|
||||
|
||||
private constructor F()
|
||||
@kotlin.internal.IntrinsicConstEvaluation public final override /*1*/ /*fake_override*/ val name: kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
|
||||
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: F): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public final /*synthesized*/ val entries: kotlin.enums.EnumEntries<F>
|
||||
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): F
|
||||
public final /*synthesized*/ fun values(): kotlin.Array<F>
|
||||
}
|
||||
|
||||
|
||||
+1
@@ -31,6 +31,7 @@ private val DIAGNOSTIC_FACTORY_TO_RENDERER by lazy {
|
||||
put(ErrorsJs.EXTENSION_FUNCTION_IN_EXTERNAL_DECLARATION, "Function types with receiver are prohibited in external declarations")
|
||||
put(ErrorsJs.INLINE_CLASS_IN_EXTERNAL_DECLARATION, "Using value classes as parameter type or return type of external declarations is not supported")
|
||||
put(ErrorsJs.INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING, "Using value classes as parameter type or return type of external declarations is experimental")
|
||||
put(ErrorsJs.ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING, "Using enum classes with an `external` qualifier becomes deprecated and will be an error in future releases")
|
||||
|
||||
put(ErrorsJs.JS_NAME_CLASH, "JavaScript name ({0}) generated for this declaration clashes with another declaration: {1}",
|
||||
STRING, Renderers.COMPACT)
|
||||
|
||||
@@ -33,6 +33,7 @@ public interface ErrorsJs {
|
||||
DiagnosticFactory0<KtElement> EXTENSION_FUNCTION_IN_EXTERNAL_DECLARATION = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
|
||||
DiagnosticFactory0<KtExpression> NESTED_EXTERNAL_DECLARATION = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
|
||||
DiagnosticFactory0<KtElement> INLINE_CLASS_IN_EXTERNAL_DECLARATION = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
|
||||
DiagnosticFactory0<KtElement> ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING = DiagnosticFactory0.create(WARNING, DECLARATION_SIGNATURE_OR_DEFAULT);
|
||||
DiagnosticFactory0<KtElement> INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING = DiagnosticFactory0.create(WARNING, DECLARATION_SIGNATURE_OR_DEFAULT);
|
||||
|
||||
DiagnosticFactory2<KtElement, String, DeclarationDescriptor> JS_NAME_CLASH = DiagnosticFactory2.create(
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.js.PredefinedAnnotation
|
||||
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.JsStandardClassIds
|
||||
import org.jetbrains.kotlin.platform.isWasm
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
@@ -55,6 +56,10 @@ object JsExternalChecker : DeclarationChecker {
|
||||
if (classKind != null) {
|
||||
trace.report(ErrorsJs.WRONG_EXTERNAL_DECLARATION.on(declaration, classKind))
|
||||
}
|
||||
|
||||
if (DescriptorUtils.isEnumClass(descriptor) && context.moduleDescriptor.platform?.isWasm() != true) {
|
||||
trace.report(ErrorsJs.ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING.on(declaration))
|
||||
}
|
||||
}
|
||||
|
||||
if (descriptor is PropertyAccessorDescriptor && isDirectlyExternal(declaration, descriptor)) {
|
||||
|
||||
Reference in New Issue
Block a user