diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 8e7b19bee01..ff2b0fb173d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -389,6 +389,27 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.INTERFACE_AS_FUNCTION) { firDiagnostic -> + InterfaceAsFunctionImpl( + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firDiagnostic as KtPsiDiagnostic, + token, + ) + } + add(FirErrors.EXPECT_CLASS_AS_FUNCTION) { firDiagnostic -> + ExpectClassAsFunctionImpl( + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firDiagnostic as KtPsiDiagnostic, + token, + ) + } + add(FirErrors.INNER_CLASS_CONSTRUCTOR_NO_RECEIVER) { firDiagnostic -> + InnerClassConstructorNoReceiverImpl( + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.RESOLUTION_TO_CLASSIFIER) { firDiagnostic -> ResolutionToClassifierImpl( firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 65ee64df13f..3e32432d275 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -313,6 +313,21 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val type: KtType } + interface InterfaceAsFunction : KtFirDiagnostic { + override val diagnosticClass get() = InterfaceAsFunction::class + val classSymbol: KtClassLikeSymbol + } + + interface ExpectClassAsFunction : KtFirDiagnostic { + override val diagnosticClass get() = ExpectClassAsFunction::class + val classSymbol: KtClassLikeSymbol + } + + interface InnerClassConstructorNoReceiver : KtFirDiagnostic { + override val diagnosticClass get() = InnerClassConstructorNoReceiver::class + val classSymbol: KtClassLikeSymbol + } + interface ResolutionToClassifier : KtFirDiagnostic { override val diagnosticClass get() = ResolutionToClassifier::class val classSymbol: KtClassLikeSymbol diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 75325a11278..a08cd2e55bf 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -361,6 +361,24 @@ internal class FunctionExpectedImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.FunctionExpected +internal class InterfaceAsFunctionImpl( + override val classSymbol: KtClassLikeSymbol, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InterfaceAsFunction + +internal class ExpectClassAsFunctionImpl( + override val classSymbol: KtClassLikeSymbol, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.ExpectClassAsFunction + +internal class InnerClassConstructorNoReceiverImpl( + override val classSymbol: KtClassLikeSymbol, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InnerClassConstructorNoReceiver + internal class ResolutionToClassifierImpl( override val classSymbol: KtClassLikeSymbol, firDiagnostic: KtPsiDiagnostic, diff --git a/compiler/fir/analysis-tests/testData/resolve/innerClasses/inner.kt b/compiler/fir/analysis-tests/testData/resolve/innerClasses/inner.kt index 85b94b55aaa..5eb3bbe140a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/innerClasses/inner.kt +++ b/compiler/fir/analysis-tests/testData/resolve/innerClasses/inner.kt @@ -31,7 +31,7 @@ class Owner { fun test() { val o = Owner() o.foo() - val err = Owner.Inner() + val err = Owner.Inner() err.baz() val i = o.Inner() i.gau() diff --git a/compiler/fir/analysis-tests/testData/resolve/references/incorrectReferenceOnInnerClassMember.kt b/compiler/fir/analysis-tests/testData/resolve/references/incorrectReferenceOnInnerClassMember.kt index 19068dc670d..e9f41093d6a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/references/incorrectReferenceOnInnerClassMember.kt +++ b/compiler/fir/analysis-tests/testData/resolve/references/incorrectReferenceOnInnerClassMember.kt @@ -9,6 +9,6 @@ class Outer { } fun test() { - foo.Outer.Inner(42) - foo.Outer.Inner(42)::method + foo.Outer.Inner(42) + foo.Outer.Inner(42)::method } diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 7afe3d1c41c..f86052859e6 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -159,6 +159,15 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("expression") parameter("type") } + val INTERFACE_AS_FUNCTION by error { + parameter("classSymbol") + } + val EXPECT_CLASS_AS_FUNCTION by error { + parameter("classSymbol") + } + val INNER_CLASS_CONSTRUCTOR_NO_RECEIVER by error { + parameter("classSymbol") + } val RESOLUTION_TO_CLASSIFIER by error { parameter("classSymbol") } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 6b244eefef4..942a5597088 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -168,6 +168,9 @@ object FirErrors { val ILLEGAL_SELECTOR by error0() val NO_RECEIVER_ALLOWED by error0() val FUNCTION_EXPECTED by error2(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) + val INTERFACE_AS_FUNCTION by error1() + val EXPECT_CLASS_AS_FUNCTION by error1() + val INNER_CLASS_CONSTRUCTOR_NO_RECEIVER by error1() val RESOLUTION_TO_CLASSIFIER by error1() val AMBIGUOUS_ALTERED_ASSIGN by error1>() val FORBIDDEN_BINARY_MOD by error2, String>(SourceElementPositioningStrategies.OPERATOR_MODIFIER) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 701a03f59cf..0e585cf14ad 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -228,6 +228,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_PROPERTY_ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_IDENTITY_EQUALS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECTED_EXTERNAL_DECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECTED_TAILREC_FUNCTION +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPECT_CLASS_AS_FUNCTION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FORBIDDEN_BINARY_MOD import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FORBIDDEN_IDENTITY_EQUALS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FORBIDDEN_IDENTITY_EQUALS_WARNING @@ -295,9 +296,11 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INITIALIZER_TYPE_ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_PROPERTY_WITH_BACKING_FIELD import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INNER_CLASS_CONSTRUCTOR_NO_RECEIVER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INNER_CLASS_INSIDE_VALUE_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INSTANCE_ACCESS_BEFORE_SUPER_CALL +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INTERFACE_AS_FUNCTION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INTERFACE_WITH_SUPERCLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INT_LITERAL_OUT_OF_RANGE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INVALID_CHARACTERS @@ -737,11 +740,14 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { FUNCTION_EXPECTED, "Expression ''{0}'' of type {1} cannot be invoked as a function. The function ''invoke()'' is not found", TO_STRING, RENDER_TYPE ) + map.put(INTERFACE_AS_FUNCTION, "Interface ''{0}'' does not have constructors.", SYMBOL) + map.put(EXPECT_CLASS_AS_FUNCTION, "Expected class ''{0}'' does not have default constructor.", SYMBOL) map.put( - RESOLUTION_TO_CLASSIFIER, - "Constructor of the inner class {0} can only be called with a receiver of the containing class", + INNER_CLASS_CONSTRUCTOR_NO_RECEIVER, + "Constructor of the inner class ''{0}'' can only be called with a receiver of the containing class", SYMBOL ) + map.put(RESOLUTION_TO_CLASSIFIER, "Resolution to the classifier ''{0}'' is not appropriate here.", SYMBOL) map.put( AMBIGUOUS_ALTERED_ASSIGN, "Multiple extensions tried to alter this assignment at the same time. Extensions: {0}", diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index 5b17e40547a..d915c3389c7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -8,12 +8,15 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.diagnostics.* import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.checkers.declaration.isLocalMember import org.jetbrains.kotlin.fir.analysis.getChild import org.jetbrains.kotlin.fir.builder.FirSyntaxErrors +import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.isInfix +import org.jetbrains.kotlin.fir.declarations.utils.isInner import org.jetbrains.kotlin.fir.declarations.utils.isOperator import org.jetbrains.kotlin.fir.diagnostics.* import org.jetbrains.kotlin.fir.resolve.calls.* @@ -52,7 +55,15 @@ private fun ConeDiagnostic.toKtDiagnostic( is ConeUnresolvedTypeQualifierError -> FirErrors.UNRESOLVED_REFERENCE.createOn(source, this.qualifier) is ConeFunctionCallExpectedError -> FirErrors.FUNCTION_CALL_EXPECTED.createOn(source, this.name.asString(), this.hasValueParameters) is ConeFunctionExpectedError -> FirErrors.FUNCTION_EXPECTED.createOn(source, this.expression, this.type) - is ConeResolutionToClassifierError -> FirErrors.RESOLUTION_TO_CLASSIFIER.createOn(source, this.candidateSymbol) + is ConeResolutionToClassifierError -> when (this.candidateSymbol.classKind) { + ClassKind.INTERFACE -> FirErrors.INTERFACE_AS_FUNCTION.createOn(source, this.candidateSymbol) + ClassKind.CLASS -> when { + this.candidateSymbol.isInner -> FirErrors.INNER_CLASS_CONSTRUCTOR_NO_RECEIVER.createOn(source, this.candidateSymbol) + this.candidateSymbol.isExpect -> FirErrors.EXPECT_CLASS_AS_FUNCTION.createOn(source, this.candidateSymbol) + else -> FirErrors.RESOLUTION_TO_CLASSIFIER.createOn(source, this.candidateSymbol) + } + else -> FirErrors.RESOLUTION_TO_CLASSIFIER.createOn(source, this.candidateSymbol) + } is ConeHiddenCandidateError -> { // Usages of callables with @Deprecated(DeprecationLevel.HIDDEN) should look like unresolved references. // See: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-deprecated/ diff --git a/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_after.fir.kt b/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_after.fir.kt index 22157af461c..6b0a1bf635c 100644 --- a/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_after.fir.kt +++ b/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_after.fir.kt @@ -43,7 +43,7 @@ fun f() { C.O C.O.InO C.A() - C.B() + C.B() C.E3.O_O C.E3.G() diff --git a/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_before.fir.kt b/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_before.fir.kt index 642f2aaabea..13608377363 100644 --- a/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_before.fir.kt +++ b/compiler/testData/diagnostics/tests/classObjects/InnerClassAccessThroughEnum_before.fir.kt @@ -43,7 +43,7 @@ fun f() { C.O C.O.InO C.A() - C.B() + C.B() C.E3.O_O C.E3.G() diff --git a/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.fir.kt b/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.fir.kt index 2085c507099..aa030eddf55 100644 --- a/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.fir.kt +++ b/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.fir.kt @@ -6,7 +6,7 @@ typealias FunAlias = IsolatedFunFace fun referIsolatedFunFace(iff: IsolatedFunFace) {} fun callIsolatedFunFace() { - referIsolatedFunFace(IsolatedFunFace {}) - referIsolatedFunFace(FunAlias {}) + referIsolatedFunFace(IsolatedFunFace {}) + referIsolatedFunFace(FunAlias {}) referIsolatedFunFace({}) } diff --git a/compiler/testData/diagnostics/tests/inner/constructorAccess.fir.kt b/compiler/testData/diagnostics/tests/inner/constructorAccess.fir.kt new file mode 100644 index 00000000000..1009367594a --- /dev/null +++ b/compiler/testData/diagnostics/tests/inner/constructorAccess.fir.kt @@ -0,0 +1,32 @@ +class Outer1 { + class Nested + + class C1 { val b = Nested() } + class C2(val b: Any = Nested()) + inner class C3 { val b = Nested() } + inner class C4(val b: Any = Nested()) + + inner class Inner + + class C5 { val b = Inner() } + class C6(val b: Any = Inner()) + inner class C7 { val b = Inner() } + inner class C8(val b: Any = Inner()) +} + + +class Outer2 { + class Nested { + fun foo() = Outer2() + fun bar() = Inner() + } + inner class Inner { + fun foo() = Outer2() + fun bar() = Nested() + } + + fun foo() { + Nested() + Inner() + } +} diff --git a/compiler/testData/diagnostics/tests/inner/constructorAccess.kt b/compiler/testData/diagnostics/tests/inner/constructorAccess.kt index 0f6dea08c36..961c29b2585 100644 --- a/compiler/testData/diagnostics/tests/inner/constructorAccess.kt +++ b/compiler/testData/diagnostics/tests/inner/constructorAccess.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL class Outer1 { class Nested diff --git a/compiler/testData/diagnostics/tests/inner/innerConstructorsFromQualifiers.fir.kt b/compiler/testData/diagnostics/tests/inner/innerConstructorsFromQualifiers.fir.kt new file mode 100644 index 00000000000..c3b290d1058 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inner/innerConstructorsFromQualifiers.fir.kt @@ -0,0 +1,36 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +// SKIP_TXT +// FILE: Outer.kt +package abc +class Outer { + inner class Inner() { + constructor(x: Int) : this() {} + } + + companion object { + + fun baz() { + Inner() + Inner(1) + } + } +} + +fun foo() { + Outer.Inner() + Outer.Inner(1) +} + +// FILE: imported.kt +import abc.Outer +import abc.Outer.Inner + +fun bar() { + Inner() + Inner(1) + + with(Outer()) { + Inner() + Inner(1) + } +} diff --git a/compiler/testData/diagnostics/tests/inner/innerConstructorsFromQualifiers.kt b/compiler/testData/diagnostics/tests/inner/innerConstructorsFromQualifiers.kt index d9c0f080c19..e831c7955a3 100644 --- a/compiler/testData/diagnostics/tests/inner/innerConstructorsFromQualifiers.kt +++ b/compiler/testData/diagnostics/tests/inner/innerConstructorsFromQualifiers.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER // SKIP_TXT // FILE: Outer.kt diff --git a/compiler/testData/diagnostics/tests/inner/innerErrorForClassObjects.fir.kt b/compiler/testData/diagnostics/tests/inner/innerErrorForClassObjects.fir.kt index 85c710b9cbd..2a9f653a6a4 100644 --- a/compiler/testData/diagnostics/tests/inner/innerErrorForClassObjects.fir.kt +++ b/compiler/testData/diagnostics/tests/inner/innerErrorForClassObjects.fir.kt @@ -10,7 +10,7 @@ class Test { } fun more(): InnerClass { - val b = InnerClass() + val b = InnerClass() val testVal = inClass foo() diff --git a/compiler/testData/diagnostics/tests/inner/innerErrorForObjects.fir.kt b/compiler/testData/diagnostics/tests/inner/innerErrorForObjects.fir.kt index 186c9906639..5998f3f60ca 100644 --- a/compiler/testData/diagnostics/tests/inner/innerErrorForObjects.fir.kt +++ b/compiler/testData/diagnostics/tests/inner/innerErrorForObjects.fir.kt @@ -10,7 +10,7 @@ class Test { } fun more(): InnerClass { - val b = InnerClass() + val b = InnerClass() val testVal = inClass foo() diff --git a/compiler/testData/diagnostics/tests/inner/qualifiedExpression/constructNestedClass.fir.kt b/compiler/testData/diagnostics/tests/inner/qualifiedExpression/constructNestedClass.fir.kt new file mode 100644 index 00000000000..7028968110a --- /dev/null +++ b/compiler/testData/diagnostics/tests/inner/qualifiedExpression/constructNestedClass.fir.kt @@ -0,0 +1,17 @@ +class Outer { + class Nested { + class NestedNested + } + + inner class Inner { + inner class InnerInner + } +} + +fun f1() = Outer() +fun f2() = Outer.Nested() +fun f3() = Outer.Nested.NestedNested() +fun f4() = Outer.Inner() +fun f5() = Outer.Inner.InnerInner() +fun f6() = Outer().Inner() +fun f7() = Outer().Inner().InnerInner() diff --git a/compiler/testData/diagnostics/tests/inner/qualifiedExpression/constructNestedClass.kt b/compiler/testData/diagnostics/tests/inner/qualifiedExpression/constructNestedClass.kt index f1e205b5cec..8a67ae48bf4 100644 --- a/compiler/testData/diagnostics/tests/inner/qualifiedExpression/constructNestedClass.kt +++ b/compiler/testData/diagnostics/tests/inner/qualifiedExpression/constructNestedClass.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL class Outer { class Nested { class NestedNested diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectClassWithoutConstructor.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectClassWithoutConstructor.fir.kt new file mode 100644 index 00000000000..114c2bea785 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectClassWithoutConstructor.fir.kt @@ -0,0 +1,24 @@ +// MODULE: m1-common +// FILE: common.kt + +expect class Foo +expect class Bar() +expect class Baz constructor() +expect class FooBar { + constructor() +} + +fun test() { + Foo() + Bar() + Baz() + FooBar() +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt + +actual class Foo +actual class Bar +actual class Baz +actual class FooBar diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectClassWithoutConstructor.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectClassWithoutConstructor.kt index e12704f0e5a..92c6e2fae2b 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectClassWithoutConstructor.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectClassWithoutConstructor.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // MODULE: m1-common // FILE: common.kt diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/kt57320.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/kt57320.fir.kt index 2bdb9b24101..15a805de39d 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/hmpp/kt57320.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/kt57320.fir.kt @@ -34,7 +34,7 @@ interface KotlinXStringDemoInterface { // FILE: StringDemoInterface.kt actual typealias StringDemoInterface = KotlinXStringDemoInterface -; The following declaration is incompatible: expect fun StringDemoInterface.plusK(): String")!>actual fun StringDemoInterface.plusK() = StringValue(value).plus("K").value +; The following declaration is incompatible: expect fun StringDemoInterface.plusK(): String")!>actual fun StringDemoInterface.plusK() = StringValue(value).plus("K").value // FILE: main.kt class StringDemo(override val value: String) : StringDemoInterface diff --git a/compiler/testData/diagnostics/tests/regressions/kt4827.fir.kt b/compiler/testData/diagnostics/tests/regressions/kt4827.fir.kt new file mode 100644 index 00000000000..76da79b789b --- /dev/null +++ b/compiler/testData/diagnostics/tests/regressions/kt4827.fir.kt @@ -0,0 +1,16 @@ +// KT-4827 UOE at PackageType.throwException() +// EA-53605 + +public interface TestInterface { +} + +class C { + inner class I { + + } +} + +fun f() { + TestInterface() + C.I() +} diff --git a/compiler/testData/diagnostics/tests/regressions/kt4827.kt b/compiler/testData/diagnostics/tests/regressions/kt4827.kt index 1e6db596d62..76cfccefc69 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt4827.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt4827.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // KT-4827 UOE at PackageType.throwException() // EA-53605 diff --git a/compiler/testData/diagnostics/tests/resolve/noCandidates/kt2787.fir.kt b/compiler/testData/diagnostics/tests/resolve/noCandidates/kt2787.fir.kt new file mode 100644 index 00000000000..d95b8de0784 --- /dev/null +++ b/compiler/testData/diagnostics/tests/resolve/noCandidates/kt2787.fir.kt @@ -0,0 +1,6 @@ +interface MutableMatrix { +} + +fun toMutableMatrix(): MutableMatrix { + return MutableMatrix() +} diff --git a/compiler/testData/diagnostics/tests/resolve/noCandidates/kt2787.kt b/compiler/testData/diagnostics/tests/resolve/noCandidates/kt2787.kt index 13c925a09fd..b116923fd10 100644 --- a/compiler/testData/diagnostics/tests/resolve/noCandidates/kt2787.kt +++ b/compiler/testData/diagnostics/tests/resolve/noCandidates/kt2787.kt @@ -1,7 +1,6 @@ -// FIR_IDENTICAL interface MutableMatrix { } fun toMutableMatrix(): MutableMatrix { return MutableMatrix() -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/resolve/noCandidates/resolvedToClassifier.fir.kt b/compiler/testData/diagnostics/tests/resolve/noCandidates/resolvedToClassifier.fir.kt index 7c72da80486..adf21ddf327 100644 --- a/compiler/testData/diagnostics/tests/resolve/noCandidates/resolvedToClassifier.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/noCandidates/resolvedToClassifier.fir.kt @@ -6,7 +6,7 @@ object B class C fun test() { - val interface_as_fun = A() + val interface_as_fun = A() val interface_as_val = A val object_as_fun = B() diff --git a/compiler/testData/diagnostics/tests/resolve/noCandidates/resolvedToClassifierWithReceiver.fir.kt b/compiler/testData/diagnostics/tests/resolve/noCandidates/resolvedToClassifierWithReceiver.fir.kt index f3cffaadb1a..8b7abb71500 100644 --- a/compiler/testData/diagnostics/tests/resolve/noCandidates/resolvedToClassifierWithReceiver.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/noCandidates/resolvedToClassifierWithReceiver.fir.kt @@ -8,7 +8,7 @@ object X { } fun testX() { - val interface_as_fun = X.A() + val interface_as_fun = X.A() val interface_as_val = X.A val object_as_fun = X.B() @@ -23,7 +23,7 @@ class Y { } fun testY() { - val interface_as_fun = Y.A() + val interface_as_fun = Y.A() val interface_as_val = Y.A val object_as_fun = Y.B() diff --git a/compiler/testData/diagnostics/tests/scopes/classHeader/constructors.fir.kt b/compiler/testData/diagnostics/tests/scopes/classHeader/constructors.fir.kt new file mode 100644 index 00000000000..2684bf8538e --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/classHeader/constructors.fir.kt @@ -0,0 +1,65 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +class A( + n: Nested = foo(), + n2: Nested = Nested(), + inn: Inner = null!!, + inn2: Inner = Inner(), + i: Interface = null!!, + c: Int = CONST, + cc: Int = Companion.CONST, + cn: Int = Nested.CONST, + ci: Int = Interface.CONST, + t1: Int = a, + t2: Int = b() +) { + + constructor( + dummy: Int, + n: Nested = foo(), + n2: Nested = Nested(), + inn: Inner = null!!, + inn2: Inner = Inner(), + i: Interface = null!!, + c: Int = CONST, + cc: Int = Companion.CONST, + cn: Int = Nested.CONST, + ci: Int = Interface.CONST, + t1: Int = a, + t2: Int = b() + ) : this( + foo(), + Nested(), + inn, + Inner(), + i, + CONST, + Companion.CONST, + Nested.CONST, + Interface.CONST, + a, + b() + ) + + class Nested { + companion object { + const val CONST = 2 + } + } + + inner class Inner + + interface Interface { + companion object { + const val CONST = 3 + } + } + + val a = 1 + fun b() = 2 + + companion object { + const val CONST = 1 + fun foo(): Nested = null!! + } +} diff --git a/compiler/testData/diagnostics/tests/scopes/classHeader/constructors.kt b/compiler/testData/diagnostics/tests/scopes/classHeader/constructors.kt index 41e8461d79b..b554c0708fe 100644 --- a/compiler/testData/diagnostics/tests/scopes/classHeader/constructors.kt +++ b/compiler/testData/diagnostics/tests/scopes/classHeader/constructors.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER class A( diff --git a/compiler/testData/diagnostics/tests/scopes/classHeader/delegation.fir.kt b/compiler/testData/diagnostics/tests/scopes/classHeader/delegation.fir.kt new file mode 100644 index 00000000000..6ae9569096a --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/classHeader/delegation.fir.kt @@ -0,0 +1,50 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +interface I + +open class S( + n: A.Nested, + n2: A.Nested, + inn: A.Inner, + c: Int, + cc: Int, + cn: Int, + ci: Int, + t1: Int, + t2: Int +) : I + +class A : I by S( + foo(), + Nested(), + Inner(), + CONST, + Companion.CONST, + Nested.CONST, + Interface.CONST, + a, + b() +) { + + class Nested { + companion object { + const val CONST = 2 + } + } + + inner class Inner + + interface Interface { + companion object { + const val CONST = 3 + } + } + + val a = 1 + fun b() = 2 + + companion object { + const val CONST = 1 + fun foo(): Nested = null!! + } +} diff --git a/compiler/testData/diagnostics/tests/scopes/classHeader/delegation.kt b/compiler/testData/diagnostics/tests/scopes/classHeader/delegation.kt index 9d745b0ffd2..813443209c9 100644 --- a/compiler/testData/diagnostics/tests/scopes/classHeader/delegation.kt +++ b/compiler/testData/diagnostics/tests/scopes/classHeader/delegation.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER interface I diff --git a/compiler/testData/diagnostics/tests/scopes/classHeader/superConstructorArguments.fir.kt b/compiler/testData/diagnostics/tests/scopes/classHeader/superConstructorArguments.fir.kt new file mode 100644 index 00000000000..f235f8d6eb0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/classHeader/superConstructorArguments.fir.kt @@ -0,0 +1,48 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +open class S( + n: A.Nested, + n2: A.Nested, + inn: A.Inner, + c: Int, + cc: Int, + cn: Int, + ci: Int, + t1: Int, + t2: Int +) + +class A : S ( + foo(), + Nested(), + Inner(), + CONST, + Companion.CONST, + Nested.CONST, + Interface.CONST, + a, + b() +) { + + class Nested { + companion object { + const val CONST = 2 + } + } + + inner class Inner + + interface Interface { + companion object { + const val CONST = 3 + } + } + + val a = 1 + fun b() = 2 + + companion object { + const val CONST = 1 + fun foo(): Nested = null!! + } +} diff --git a/compiler/testData/diagnostics/tests/scopes/classHeader/superConstructorArguments.kt b/compiler/testData/diagnostics/tests/scopes/classHeader/superConstructorArguments.kt index 330ef988704..ec88083051b 100644 --- a/compiler/testData/diagnostics/tests/scopes/classHeader/superConstructorArguments.kt +++ b/compiler/testData/diagnostics/tests/scopes/classHeader/superConstructorArguments.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER open class S( diff --git a/compiler/testData/diagnostics/tests/scopes/inheritance/innerClasses.fir.kt b/compiler/testData/diagnostics/tests/scopes/inheritance/innerClasses.fir.kt index 47e0138e40b..6c040b3bfd6 100644 --- a/compiler/testData/diagnostics/tests/scopes/inheritance/innerClasses.fir.kt +++ b/compiler/testData/diagnostics/tests/scopes/inheritance/innerClasses.fir.kt @@ -35,10 +35,10 @@ class E: A() { object Z { init { - B().foo() - B().bar() + B().foo() + B().bar() - D() + D() C() } } @@ -60,7 +60,7 @@ class F: A() { companion object { init { B().fas() - D().f() + D().f() } } } diff --git a/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJava.fir.kt b/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJava.fir.kt new file mode 100644 index 00000000000..7d6865b8009 --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJava.fir.kt @@ -0,0 +1,90 @@ +// FILE: A.java +public interface A { + public class A_S { // static + + } +} + +// FILE: B.java +public class B { + public static class B_S { + + } + public class B_ { + + } +} + +// FILE: C.java +public class C extends B implements A { + +} + +// FILE: 1.kt + +class X: A { + val a_s: A_S = null!! + + init { + A_S() + A.A_S() + X.A_S() + } + + object xD { + val a_: A_S = null!! + + init { + A_S() + } + } +} + +class Y: B() { + val b_: B_ = null!! + val b_s: B_S = null!! + + init { + B_() + B.B_() + Y.B_() + + B_S() + B.B_S() + Y.B_S() + } + + object X { + val b_: B_ = null!! + val b_s: B_S = null!! + + init { + B_() + B_S() + } + } +} + +class Z: C() { + val a_s: A_S = null!! + val b_: B_ = null!! + val b_s: B_S = null!! + + init { + A_S() + B_() + B_S() + } + + object X { + val a_s: A_S = null!! + val b_: B_ = null!! + val b_s: B_S = null!! + + init { + A_S() + B_() + B_S() + } + } +} diff --git a/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJava.kt b/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJava.kt index 5f8d4720f80..dd7d7498570 100644 --- a/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJava.kt +++ b/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJava.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // FILE: A.java public interface A { public class A_S { // static diff --git a/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJavaAfterKotlin.fir.kt b/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJavaAfterKotlin.fir.kt new file mode 100644 index 00000000000..42f2eca742f --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJavaAfterKotlin.fir.kt @@ -0,0 +1,82 @@ +// FILE: A.java +public interface A { + class A_S { + + } +} + +// FILE: B.java +public class B { + static class B_S { + + } + class B_ { + + } +} + +// FILE: C.java +public class C extends B implements A { + +} + +// FILE: 1.kt +interface E { + class E_S +} + +open class D: C(), E + +// FILE: F.java +public class F extends D { + +} + +// FILE: 2.kt +class X: D() { + init { + B_() + B.B_() + C.B_() + D.B_() + X.B_() + + A_S() + A.A_S() + C.A_S() + D.A_S() + X.A_S() + + B_S() + B.B_S() + C.B_S() + D.B_S() + X.B_S() + + E_S() + E.E_S() + D.E_S() + X.E_S() + } +} + +class Y: F() { + init { + + B_() + F.B_() + Y.B_() + + A_S() + F.A_S() + Y.A_S() + + B_S() + F.B_S() + Y.B_S() + + E_S() + F.E_S() + Y.E_S() + } +} diff --git a/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJavaAfterKotlin.kt b/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJavaAfterKotlin.kt index 341a0373e4b..e4e00ca3e28 100644 --- a/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJavaAfterKotlin.kt +++ b/compiler/testData/diagnostics/tests/scopes/inheritance/nestedFromJavaAfterKotlin.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // FILE: A.java public interface A { class A_S { diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructor.fir.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructor.fir.kt index 8fd8bab2106..eb106b3df54 100644 --- a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructor.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructor.fir.kt @@ -17,8 +17,8 @@ typealias TI = Interface object AnObject typealias TO = AnObject -val test6 = TI() -val test6a = Interface() +val test6 = TI() +val test6a = Interface() val test7 = TO() val test7a = AnObject() diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForInterface.fir.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForInterface.fir.kt new file mode 100644 index 00000000000..73b05560783 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForInterface.fir.kt @@ -0,0 +1,6 @@ +interface IFoo + +typealias Test = IFoo + +val testAsFunction = Test() +val testAsValue = Test diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForInterface.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForInterface.kt index 079edd27166..9b7dda254d2 100644 --- a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForInterface.kt +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForInterface.kt @@ -1,7 +1,6 @@ -// FIR_IDENTICAL interface IFoo typealias Test = IFoo val testAsFunction = Test() -val testAsValue = Test \ No newline at end of file +val testAsValue = Test diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorWrongClass.fir.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorWrongClass.fir.kt index 80f924ea575..aeef821cb1a 100644 --- a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorWrongClass.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorWrongClass.fir.kt @@ -26,9 +26,9 @@ class Outer { } typealias Test5 = Outer.Inner -val test5 = Test5() -val test5a = Outer.Inner() -val test5b = Outer.TestInner() +val test5 = Test5() +val test5a = Outer.Inner() +val test5b = Outer.TestInner() val test5c = Outer().TestInner() val test5d = Outer().Inner() val test5e = Outer().Test5()