[K/JS] Allow parameter properties inside external declarations ^KT-65965 Fixed

This commit is contained in:
Artem Kobzar
2024-02-29 09:46:59 +00:00
committed by Space Team
parent 5e83350576
commit 4f4c98ec73
12 changed files with 234 additions and 7 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.analysis.web.common.checkers.declaration
import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
@@ -124,7 +125,10 @@ abstract class FirWebCommonExternalChecker(private val allowCompanionInInterface
declaration.checkBody(context, reporter)
declaration.checkDelegation(context, reporter)
declaration.checkAnonymousInitializer(context, reporter)
declaration.checkConstructorPropertyParam(context, reporter)
if (!context.languageVersionSettings.supportsFeature(LanguageFeature.JsExternalPropertyParameters)) {
declaration.checkConstructorPropertyParam(context, reporter)
}
additionalCheck(declaration, context, reporter)
}
@@ -0,0 +1,66 @@
// FIR_IDENTICAL
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, -JsAllowValueClassesInExternals, +JsExternalPropertyParameters
// !DIAGNOSTICS: -OPT_IN_USAGE
// FILE: uint.kt
package kotlin
inline class UInt(private val i: Int)
// FILE: test.kt
inline class SomeIC(val a: Int)
external val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
external val ll
get(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!> = definedExternally
external var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
external var rr: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
get() = definedExternally
set(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>v: SomeIC<!>) { definedExternally }
external fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
external fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
external fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
external fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!><!FORBIDDEN_VARARG_PARAMETER_TYPE!>vararg<!> args: SomeIC<!>)
external fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>ui: UInt<!>, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>vararg args: UInt<!>)
external class CC(
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>a: SomeIC<!>,
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>val b: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!><!>,
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>var c: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!><!>
) {
val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
class N(
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>a: SomeIC<!>,
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>val b: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!><!>,
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>var c: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!><!>
) {
val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
}
}
external interface EI {
val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION!>SomeIC<!>
}
@@ -0,0 +1,66 @@
// FIR_IDENTICAL
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +JsAllowValueClassesInExternals, +JsExternalPropertyParameters
// !DIAGNOSTICS: +INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING -OPT_IN_USAGE
// FILE: uint.kt
package kotlin
inline class UInt(private val i: Int)
// FILE: test.kt
inline class SomeIC(val a: Int)
external val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
external val ll
get(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!> = definedExternally
external var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
external var rr: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
get() = definedExternally
set(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>v: SomeIC<!>) { definedExternally }
external fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
external fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
external fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
external fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!><!FORBIDDEN_VARARG_PARAMETER_TYPE!>vararg<!> args: SomeIC<!>)
external fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>ui: UInt<!>, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>vararg args: UInt<!>)
external class CC(
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>a: SomeIC<!>,
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>val b: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!><!>,
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>var c: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!><!>
) {
val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
class N(
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>a: SomeIC<!>,
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>val b: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!><!>,
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>var c: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!><!>
) {
val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
}
}
external interface EI {
val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
}
@@ -0,0 +1,11 @@
// FIR_IDENTICAL
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +JsExternalPropertyParameters
// !DIAGNOSTICS: +ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING
external inline class <!WRONG_EXTERNAL_DECLARATION!>C(val a: Int)<!> {
fun foo()
}
<!WRONG_MODIFIER_TARGET!>inline<!> external enum class <!ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING, WRONG_EXTERNAL_DECLARATION!>E<!> {
A
}
@@ -0,0 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +JsExternalPropertyParameters
external class C(x: Int, val y: String)
@@ -1,5 +1,6 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -INLINE_CLASS_DEPRECATED -NO_TAIL_CALLS_FOUND
// !LANGUAGE: +JsExternalPropertyParameters
// Classes
@@ -18,9 +19,9 @@ external class C5 {
inner class <!WRONG_EXTERNAL_DECLARATION!>C7<!>
}
external inline class <!WRONG_EXTERNAL_DECLARATION!>C8(<!EXTERNAL_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER!>val x: Int<!>)<!>
external inline class <!WRONG_EXTERNAL_DECLARATION!>C8(val x: Int)<!>
external value class <!WRONG_EXTERNAL_DECLARATION!>C9(<!EXTERNAL_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER!>val x: Int<!>)<!>
external value class <!WRONG_EXTERNAL_DECLARATION!>C9(val x: Int)<!>
// Interfaces
@@ -54,4 +55,4 @@ external fun foo1(): Int
// Property parameters
external class C(x: Int, <!EXTERNAL_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER!>val y: String<!>)
external class C(x: Int, val y: String)
@@ -310,7 +310,6 @@ enum class LanguageFeature(
DfaBooleanVariables(KOTLIN_2_0), // KT-25747
LightweightLambdas(KOTLIN_2_0, kind = OTHER), // KT-45375
ObjCSignatureOverrideAnnotation(KOTLIN_2_0, sinceApiVersion = ApiVersion.KOTLIN_2_0, kind = OTHER), // KT-61323
// 2.1
ReferencesToSyntheticJavaProperties(KOTLIN_2_1), // KT-8575
@@ -324,6 +323,7 @@ enum class LanguageFeature(
ProhibitPrivateOperatorCallInInline(KOTLIN_2_1, kind = BUG_FIX), // KT-65494
ProhibitTypealiasAsCallableQualifierInImport(KOTLIN_2_1, kind = BUG_FIX), // KT-64350
ProhibitConstructorAndSupertypeOnTypealiasWithTypeProjection(KOTLIN_2_1, kind = BUG_FIX), // KT-60305
JsExternalPropertyParameters(KOTLIN_2_1), // KT-65965
// End of 2.* language features --------------------------------------------------
@@ -157,7 +157,10 @@ class JsExternalChecker(private val allowCompanionInInterface: Boolean) : Declar
checkDelegation(declaration, descriptor, trace)
checkAnonymousInitializer(declaration, trace)
checkEnumEntry(declaration, trace)
checkConstructorPropertyParam(declaration, descriptor, trace)
if (!context.languageVersionSettings.supportsFeature(LanguageFeature.JsExternalPropertyParameters)) {
checkConstructorPropertyParam(declaration, descriptor, trace)
}
}
private fun checkBody(
@@ -986,6 +986,18 @@ public class FirLightTreeJsOldFrontendDiagnosticsTestGenerated extends AbstractF
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClass.kt");
}
@Test
@TestMetadata("inlineClassAsParameterOrReturnTypeWhenPropertyParametersAllowed.kt.kt")
public void testInlineClassAsParameterOrReturnTypeWhenPropertyParametersAllowed_kt() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassAsParameterOrReturnTypeWhenPropertyParametersAllowed.kt.kt");
}
@Test
@TestMetadata("inlineClassAsParameterOrReturnTypeWithPropertyParameters_allowed.kt.kt")
public void testInlineClassAsParameterOrReturnTypeWithPropertyParameters_allowed_kt() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassAsParameterOrReturnTypeWithPropertyParameters_allowed.kt.kt");
}
@Test
@TestMetadata("inlineClassAsParameterOrReturnType_allowed.kt.kt")
public void testInlineClassAsParameterOrReturnType_allowed_kt() {
@@ -998,6 +1010,12 @@ public class FirLightTreeJsOldFrontendDiagnosticsTestGenerated extends AbstractF
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassAsParameterOrReturnType.kt.kt");
}
@Test
@TestMetadata("inlineClassWithAllowedPropertyParameter.kt")
public void testInlineClassWithAllowedPropertyParameter() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassWithAllowedPropertyParameter.kt");
}
@Test
@TestMetadata("inlineExtensionToNative.kt")
public void testInlineExtensionToNative() {
@@ -1040,6 +1058,12 @@ public class FirLightTreeJsOldFrontendDiagnosticsTestGenerated extends AbstractF
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/propertyParameter.kt");
}
@Test
@TestMetadata("propertyParameterWhenItsAllowed.kt")
public void testPropertyParameterWhenItsAllowed() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/propertyParameterWhenItsAllowed.kt");
}
@Test
@TestMetadata("wrongTarget.kt")
public void testWrongTarget() {
@@ -986,6 +986,18 @@ public class FirPsiJsOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiJ
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClass.kt");
}
@Test
@TestMetadata("inlineClassAsParameterOrReturnTypeWhenPropertyParametersAllowed.kt.kt")
public void testInlineClassAsParameterOrReturnTypeWhenPropertyParametersAllowed_kt() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassAsParameterOrReturnTypeWhenPropertyParametersAllowed.kt.kt");
}
@Test
@TestMetadata("inlineClassAsParameterOrReturnTypeWithPropertyParameters_allowed.kt.kt")
public void testInlineClassAsParameterOrReturnTypeWithPropertyParameters_allowed_kt() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassAsParameterOrReturnTypeWithPropertyParameters_allowed.kt.kt");
}
@Test
@TestMetadata("inlineClassAsParameterOrReturnType_allowed.kt.kt")
public void testInlineClassAsParameterOrReturnType_allowed_kt() {
@@ -998,6 +1010,12 @@ public class FirPsiJsOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiJ
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassAsParameterOrReturnType.kt.kt");
}
@Test
@TestMetadata("inlineClassWithAllowedPropertyParameter.kt")
public void testInlineClassWithAllowedPropertyParameter() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassWithAllowedPropertyParameter.kt");
}
@Test
@TestMetadata("inlineExtensionToNative.kt")
public void testInlineExtensionToNative() {
@@ -1040,6 +1058,12 @@ public class FirPsiJsOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiJ
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/propertyParameter.kt");
}
@Test
@TestMetadata("propertyParameterWhenItsAllowed.kt")
public void testPropertyParameterWhenItsAllowed() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/propertyParameterWhenItsAllowed.kt");
}
@Test
@TestMetadata("wrongTarget.kt")
public void testWrongTarget() {
@@ -986,6 +986,18 @@ public class DiagnosticsWithJsStdLibTestGenerated extends AbstractDiagnosticsTes
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClass.kt");
}
@Test
@TestMetadata("inlineClassAsParameterOrReturnTypeWhenPropertyParametersAllowed.kt.kt")
public void testInlineClassAsParameterOrReturnTypeWhenPropertyParametersAllowed_kt() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassAsParameterOrReturnTypeWhenPropertyParametersAllowed.kt.kt");
}
@Test
@TestMetadata("inlineClassAsParameterOrReturnTypeWithPropertyParameters_allowed.kt.kt")
public void testInlineClassAsParameterOrReturnTypeWithPropertyParameters_allowed_kt() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassAsParameterOrReturnTypeWithPropertyParameters_allowed.kt.kt");
}
@Test
@TestMetadata("inlineClassAsParameterOrReturnType_allowed.kt.kt")
public void testInlineClassAsParameterOrReturnType_allowed_kt() {
@@ -998,6 +1010,12 @@ public class DiagnosticsWithJsStdLibTestGenerated extends AbstractDiagnosticsTes
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassAsParameterOrReturnType.kt.kt");
}
@Test
@TestMetadata("inlineClassWithAllowedPropertyParameter.kt")
public void testInlineClassWithAllowedPropertyParameter() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassWithAllowedPropertyParameter.kt");
}
@Test
@TestMetadata("inlineExtensionToNative.kt")
public void testInlineExtensionToNative() {
@@ -1040,6 +1058,12 @@ public class DiagnosticsWithJsStdLibTestGenerated extends AbstractDiagnosticsTes
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/propertyParameter.kt");
}
@Test
@TestMetadata("propertyParameterWhenItsAllowed.kt")
public void testPropertyParameterWhenItsAllowed() {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/propertyParameterWhenItsAllowed.kt");
}
@Test
@TestMetadata("wrongTarget.kt")
public void testWrongTarget() {