From c06b0efdfa26e21e86c3d85c085950cab8cbe2bb Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 13 Apr 2018 11:15:34 +0300 Subject: [PATCH] FIR: add implicit primary constructors, add delegated types to them So #KT-24088 In Progress --- .../kotlin/fir/builder/RawFirBuilder.kt | 49 ++++++++++++------- .../fir/resolve/impl/FirTypeResolverImpl.kt | 24 +++++---- .../org/jetbrains/kotlin/fir/FirRenderer.kt | 10 ++-- .../fir/types/impl/FirImplicitBuiltinType.kt | 40 +++++++++++++++ .../fir/types/impl/FirImplicitUnitType.kt | 19 ------- .../fir/rawBuilder/declarations/F.txt | 4 ++ .../declarations/NestedOfAliasedType.txt | 8 +++ .../declarations/NestedSuperType.txt | 10 ++++ .../rawBuilder/declarations/complexTypes.txt | 4 ++ .../rawBuilder/declarations/derivedClass.txt | 4 +- .../fir/rawBuilder/declarations/enums.txt | 18 ++++++- .../fir/rawBuilder/declarations/enums2.txt | 10 +++- .../rawBuilder/declarations/expectActual.txt | 4 ++ .../declarations/genericFunctions.txt | 2 + .../rawBuilder/declarations/nestedClass.txt | 8 ++- .../declarations/noPrimaryConstructor.kt | 9 ++++ .../declarations/noPrimaryConstructor.txt | 11 +++++ .../rawBuilder/declarations/simpleClass.txt | 4 ++ .../declarations/simpleTypeAlias.txt | 2 + .../declarations/typeAliasWithGeneric.txt | 4 ++ .../declarations/typeParameterVsNested.txt | 6 +++ .../declarations/typeParameters.txt | 4 ++ compiler/testData/fir/resolve/F.kt | 2 +- compiler/testData/fir/resolve/F.txt | 4 ++ .../fir/resolve/NestedOfAliasedType.txt | 8 +++ .../testData/fir/resolve/NestedSuperType.txt | 10 ++++ .../fir/resolve/TwoDeclarationsInSameFile.txt | 4 ++ .../testData/fir/resolve/builtins/lists.txt | 4 ++ compiler/testData/fir/resolve/companion.txt | 12 +++++ .../testData/fir/resolve/derivedClass.txt | 4 +- compiler/testData/fir/resolve/enum.txt | 10 +++- .../testData/fir/resolve/genericFunctions.txt | 2 + .../fir/resolve/multifile/Annotations.txt | 6 ++- .../fir/resolve/multifile/NestedSuperType.txt | 6 +++ .../resolve/multifile/TypeAliasExpansion.kt | 2 +- .../resolve/multifile/TypeAliasExpansion.txt | 2 + .../resolve/multifile/sealedStarImport.txt | 2 + .../resolve/multifile/simpleAliasedImport.kt | 2 +- .../resolve/multifile/simpleAliasedImport.txt | 2 + .../fir/resolve/multifile/simpleImport.kt | 2 +- .../fir/resolve/multifile/simpleImport.txt | 2 + .../resolve/multifile/simpleImportNested.txt | 2 + .../resolve/multifile/simpleImportOuter.txt | 2 + compiler/testData/fir/resolve/nestedClass.txt | 8 ++- compiler/testData/fir/resolve/simpleClass.txt | 2 + .../testData/fir/resolve/simpleTypeAlias.txt | 2 + .../testData/fir/resolve/stdlib/functionX.txt | 2 + .../fir/resolve/typeAliasWithGeneric.txt | 4 ++ .../fir/resolve/typeParameterVsNested.txt | 6 +++ .../RawFirBuilderTestCaseGenerated.java | 6 +++ 50 files changed, 308 insertions(+), 66 deletions(-) create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinType.kt delete mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitUnitType.kt create mode 100644 compiler/testData/fir/rawBuilder/declarations/noPrimaryConstructor.kt create mode 100644 compiler/testData/fir/rawBuilder/declarations/noPrimaryConstructor.txt diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index b412ed0c2b0..f898f6eaf61 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -37,6 +37,10 @@ class RawFirBuilder(val session: FirSession) { private val implicitUnitType = FirImplicitUnitType(session, null) + private val implicitAnyType = FirImplicitAnyType(session, null) + + private val implicitEnumType = FirImplicitEnumType(session, null) + fun buildFirFile(file: KtFile): FirFile { return file.accept(Visitor(), Unit) as FirFile } @@ -204,13 +208,15 @@ class RawFirBuilder(val session: FirSession) { private fun KtClassOrObject.extractSuperTypeListEntriesTo(container: FirClassImpl) { var superTypeCallEntry: KtSuperTypeCallEntry? = null + var delegatedSuperType: FirType? = null for (superTypeListEntry in superTypeListEntries) { when (superTypeListEntry) { is KtSuperTypeEntry -> { container.superTypes += superTypeListEntry.typeReference.toFirOrErrorType() } is KtSuperTypeCallEntry -> { - container.superTypes += superTypeListEntry.calleeExpression.typeReference.toFirOrErrorType() + delegatedSuperType = superTypeListEntry.calleeExpression.typeReference.toFirOrErrorType() + container.superTypes += delegatedSuperType superTypeCallEntry = superTypeListEntry } is KtDelegatedSuperTypeEntry -> { @@ -222,31 +228,40 @@ class RawFirBuilder(val session: FirSession) { } } } - val firPrimaryConstructor = primaryConstructor?.toFirConstructor(superTypeCallEntry) ?: return + fun isEnum() = this is KtClass && this.isEnum() + if (this is KtClass && this.isInterface()) return + if (!this.hasPrimaryConstructor()) return + val firPrimaryConstructor = primaryConstructor.toFirConstructor( + superTypeCallEntry, + delegatedSuperType = delegatedSuperType ?: (if (isEnum()) implicitEnumType else implicitAnyType), + owner = this + ) container.declarations += firPrimaryConstructor } - private fun KtPrimaryConstructor.toFirConstructor(superTypeCallEntry: KtSuperTypeCallEntry?): FirConstructor { + private fun KtPrimaryConstructor?.toFirConstructor( + superTypeCallEntry: KtSuperTypeCallEntry?, + delegatedSuperType: FirType, + owner: KtClassOrObject + ): FirConstructor { val constructorCallee = superTypeCallEntry?.calleeExpression - val firDelegatedCall = constructorCallee?.let { - FirDelegatedConstructorCallImpl( - session, - constructorCallee, - FirErrorTypeImpl(session, constructorCallee, "Not implemented yet"), - isThis = false - ).apply { - // TODO: arguments are not needed for light classes, but will be needed later - //superTypeCallEntry.extractArgumentsTo(this) - } + val firDelegatedCall = FirDelegatedConstructorCallImpl( + session, + constructorCallee ?: (this ?: owner), + delegatedSuperType, + isThis = false + ).apply { + // TODO: arguments are not needed for light classes, but will be needed later + //superTypeCallEntry.extractArgumentsTo(this) } val firConstructor = FirPrimaryConstructorImpl( session, - this, - visibility, + this ?: owner, + this?.visibility ?: Visibilities.UNKNOWN, firDelegatedCall ) - extractAnnotationsTo(firConstructor) - extractValueParametersTo(firConstructor) + this?.extractAnnotationsTo(firConstructor) + this?.extractValueParametersTo(firConstructor) return firConstructor } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt index c185e517987..61a7e25fa8a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.* +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance class FirTypeResolverImpl : FirTypeResolver { @@ -56,7 +57,9 @@ class FirTypeResolverImpl : FirTypeResolver { } } - private val implicitUnitTypeSymbols = mutableMapOf() + private data class NameInSession(val session: FirSession, val name: Name) + + private val implicitBuiltinTypeSymbols = mutableMapOf() override fun resolveToSymbol( type: FirType, @@ -91,14 +94,17 @@ class FirTypeResolverImpl : FirTypeResolver { // TODO: Imports resolvedSymbol ?: qualifierResolver.resolveSymbol(type.qualifier) } - is FirImplicitUnitType -> implicitUnitTypeSymbols[type.session] ?: run { - var resolvedSymbol: ConeSymbol? = null - scope.processClassifiersByName(KotlinBuiltIns.FQ_NAMES.unit.shortName(), position) { - resolvedSymbol = (it as ConeClassLikeSymbol) - resolvedSymbol == null + is FirImplicitBuiltinType -> { + val nameInSession = NameInSession(type.session, type.name) + implicitBuiltinTypeSymbols[nameInSession] ?: run { + var resolvedSymbol: ConeSymbol? = null + scope.processClassifiersByName(type.name, position) { + resolvedSymbol = (it as ConeClassLikeSymbol) + resolvedSymbol == null + } + implicitBuiltinTypeSymbols[nameInSession] = resolvedSymbol!! + resolvedSymbol } - implicitUnitTypeSymbols[type.session] = resolvedSymbol!! - resolvedSymbol } else -> null } @@ -129,7 +135,7 @@ class FirTypeResolverImpl : FirTypeResolver { type.returnType.coneTypeUnsafe() ) } - is FirImplicitUnitType -> { + is FirImplicitBuiltinType -> { resolveToSymbol(type, scope, position)!!.toConeKotlinType(emptyList())!! } is FirDynamicType, is FirImplicitType, is FirDelegatedType -> { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index f412e6affe4..b1ed00a9451 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.ConeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitType +import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinType import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.types.Variance @@ -387,10 +387,12 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) { if (delegatedConstructorCall.isSuper) { - print(": super") + print(": super<") } else if (delegatedConstructorCall.isThis) { - print(": this") + print(": this<") } + delegatedConstructorCall.constructedType.accept(this) + print(">") visitCall(delegatedConstructorCall) } @@ -411,7 +413,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { } override fun visitImplicitType(implicitType: FirImplicitType) { - print(if (implicitType is FirImplicitUnitType) "kotlin.Unit" else "") + print(if (implicitType is FirImplicitBuiltinType) "kotlin.${implicitType.name}" else "") } override fun visitTypeWithNullability(typeWithNullability: FirTypeWithNullability) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinType.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinType.kt new file mode 100644 index 00000000000..c5fa10bf744 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinType.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.types.impl + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.types.FirImplicitType +import org.jetbrains.kotlin.name.FqNameUnsafe +import org.jetbrains.kotlin.name.Name + +sealed class FirImplicitBuiltinType( + override val session: FirSession, + override val psi: PsiElement?, + val name: Name +) : FirImplicitType { + override val annotations: List + get() = emptyList() + + constructor(session: FirSession, psi: PsiElement?, name: FqNameUnsafe) : this(session, psi, name.shortName()) +} + +class FirImplicitUnitType( + session: FirSession, + psi: PsiElement? +) : FirImplicitBuiltinType(session, psi, KotlinBuiltIns.FQ_NAMES.unit) + +class FirImplicitAnyType( + session: FirSession, + psi: PsiElement? +) : FirImplicitBuiltinType(session, psi, KotlinBuiltIns.FQ_NAMES.any) + +class FirImplicitEnumType( + session: FirSession, + psi: PsiElement? +) : FirImplicitBuiltinType(session, psi, KotlinBuiltIns.FQ_NAMES._enum) \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitUnitType.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitUnitType.kt deleted file mode 100644 index 17a4a977094..00000000000 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitUnitType.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.fir.types.impl - -import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall -import org.jetbrains.kotlin.fir.types.FirImplicitType - -class FirImplicitUnitType( - override val session: FirSession, - override val psi: PsiElement? -) : FirImplicitType { - override val annotations: List - get() = emptyList() -} \ No newline at end of file diff --git a/compiler/testData/fir/rawBuilder/declarations/F.txt b/compiler/testData/fir/rawBuilder/declarations/F.txt index 55ab45c7a28..f3afb5219e0 100644 --- a/compiler/testData/fir/rawBuilder/declarations/F.txt +++ b/compiler/testData/fir/rawBuilder/declarations/F.txt @@ -1,5 +1,9 @@ FILE: F.kt public? open class A { + public? constructor(): super() + } public? final class B : A { + public? constructor(): super() + } diff --git a/compiler/testData/fir/rawBuilder/declarations/NestedOfAliasedType.txt b/compiler/testData/fir/rawBuilder/declarations/NestedOfAliasedType.txt index 2015ba1da00..a85a0f197de 100644 --- a/compiler/testData/fir/rawBuilder/declarations/NestedOfAliasedType.txt +++ b/compiler/testData/fir/rawBuilder/declarations/NestedOfAliasedType.txt @@ -1,12 +1,20 @@ FILE: NestedOfAliasedType.kt public? abstract class A { + public? constructor(): super() + public? abstract class Nested { + public? constructor(): super() + } } public? final typealias TA = A public? final class B : TA { + public? constructor(): super() + public? final class NestedInB : Nested { + public? constructor(): super() + } } diff --git a/compiler/testData/fir/rawBuilder/declarations/NestedSuperType.txt b/compiler/testData/fir/rawBuilder/declarations/NestedSuperType.txt index 972a98d58cb..a89d7850810 100644 --- a/compiler/testData/fir/rawBuilder/declarations/NestedSuperType.txt +++ b/compiler/testData/fir/rawBuilder/declarations/NestedSuperType.txt @@ -1,14 +1,24 @@ FILE: NestedSuperType.kt public? abstract class My { + public? constructor(): super() + public? abstract class NestedOne : My { + public? constructor(): super() + public? abstract class NestedTwo : NestedOne { + public? constructor(): super() + } } } public? final class Your : My { + public? constructor(): super() + public? final class NestedThree : NestedOne { + public? constructor(): super() + } } diff --git a/compiler/testData/fir/rawBuilder/declarations/complexTypes.txt b/compiler/testData/fir/rawBuilder/declarations/complexTypes.txt index f0e406db407..de69f6718b0 100644 --- a/compiler/testData/fir/rawBuilder/declarations/complexTypes.txt +++ b/compiler/testData/fir/rawBuilder/declarations/complexTypes.txt @@ -1,6 +1,10 @@ FILE: complexTypes.kt public? final class C { + public? constructor(): super() + public? final inner class D { + public? constructor(): super() + } } diff --git a/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt b/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt index 54b1d23c76a..dfc66446da1 100644 --- a/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt +++ b/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt @@ -1,13 +1,13 @@ FILE: derivedClass.kt public? open class Base { - public? constructor(x: T) + public? constructor(x: T): super() public? final? property x(val): T public? get(): T } public? final class Derived : Base { - public? constructor(x: T): super() + public? constructor(x: T): super>() } public? final? function create(x: T): Derived { diff --git a/compiler/testData/fir/rawBuilder/declarations/enums.txt b/compiler/testData/fir/rawBuilder/declarations/enums.txt index 5c4d76bd40f..5bc8f9684fb 100644 --- a/compiler/testData/fir/rawBuilder/declarations/enums.txt +++ b/compiler/testData/fir/rawBuilder/declarations/enums.txt @@ -1,17 +1,25 @@ FILE: enums.kt public? final enum class Order { + public? constructor(): super() + public? final enum entry FIRST { + public? constructor(): super() + } public? final enum entry SECOND { + public? constructor(): super() + } public? final enum entry THIRD { + public? constructor(): super() + } } public? final enum class Planet { - public? constructor(m: Double, r: Double) + public? constructor(m: Double, r: Double): super() public? final? property m(val): Double public? get(): Double @@ -20,18 +28,24 @@ FILE: enums.kt public? get(): Double public? final enum entry MERCURY : Planet { + public? constructor(): super() + public? open? override function sayHello(): kotlin.Unit { } } public? final enum entry VENERA : Planet { + public? constructor(): super() + public? open? override function sayHello(): kotlin.Unit { } } public? final enum entry EARTH : Planet { + public? constructor(): super() + public? open? override function sayHello(): kotlin.Unit { } @@ -43,6 +57,8 @@ FILE: enums.kt public? abstract function sayHello(): kotlin.Unit public? final companion object Companion { + public? constructor(): super() + public? final? const property G(val): = STUB public? get(): diff --git a/compiler/testData/fir/rawBuilder/declarations/enums2.txt b/compiler/testData/fir/rawBuilder/declarations/enums2.txt index 64668067331..6f09f54cf9c 100644 --- a/compiler/testData/fir/rawBuilder/declarations/enums2.txt +++ b/compiler/testData/fir/rawBuilder/declarations/enums2.txt @@ -2,16 +2,22 @@ FILE: enums2.kt public? abstract interface Some { } public? final object O1 : Some { + public? constructor(): super() + } public? final object O2 : Some { + public? constructor(): super() + } public? final enum class SomeEnum { - public? constructor(x: Some) + public? constructor(x: Some): super() public? final? property x(val): Some public? get(): Some public? final enum entry FIRST : SomeEnum { + public? constructor(): super() + public? open? override function check(y: Some): Boolean { STUB } @@ -19,6 +25,8 @@ FILE: enums2.kt } public? final enum entry SECOND : SomeEnum { + public? constructor(): super() + public? open? override function check(y: Some): Boolean { STUB } diff --git a/compiler/testData/fir/rawBuilder/declarations/expectActual.txt b/compiler/testData/fir/rawBuilder/declarations/expectActual.txt index 9cf502b918b..a857431f433 100644 --- a/compiler/testData/fir/rawBuilder/declarations/expectActual.txt +++ b/compiler/testData/fir/rawBuilder/declarations/expectActual.txt @@ -1,10 +1,14 @@ FILE: expectActual.kt public? final expect class MyClass { + public? constructor(): super() + } public? final? expect function foo(): String public? final? expect property x(val): Int public? get(): Int public? final actual class MyClass { + public? constructor(): super() + } public? final? actual function foo(): { STUB diff --git a/compiler/testData/fir/rawBuilder/declarations/genericFunctions.txt b/compiler/testData/fir/rawBuilder/declarations/genericFunctions.txt index 41382fc22ba..d0c75850ea8 100644 --- a/compiler/testData/fir/rawBuilder/declarations/genericFunctions.txt +++ b/compiler/testData/fir/rawBuilder/declarations/genericFunctions.txt @@ -5,6 +5,8 @@ FILE: genericFunctions.kt STUB } public? abstract class Summator { + public? constructor(): super() + public? abstract function plus(first: T, second: T): T } diff --git a/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt b/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt index d2b21c17e55..32153a043f4 100644 --- a/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt +++ b/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt @@ -1,18 +1,22 @@ FILE: nestedClass.kt public? abstract class Base { - public? constructor(s: String) + public? constructor(s: String): super() public? final? property s(val): String public? get(): String } public? final class Outer { + public? constructor(): super() + public? final class Derived : Base { - public? constructor(s: String): super() + public? constructor(s: String): super() } public? final object Obj : Base { + public? constructor(): super() + } } diff --git a/compiler/testData/fir/rawBuilder/declarations/noPrimaryConstructor.kt b/compiler/testData/fir/rawBuilder/declarations/noPrimaryConstructor.kt new file mode 100644 index 00000000000..fbd6b4e236e --- /dev/null +++ b/compiler/testData/fir/rawBuilder/declarations/noPrimaryConstructor.kt @@ -0,0 +1,9 @@ +class NoPrimary { + val x: String + + constructor(x: String) { + this.x = x + } + + constructor(): this("") +} \ No newline at end of file diff --git a/compiler/testData/fir/rawBuilder/declarations/noPrimaryConstructor.txt b/compiler/testData/fir/rawBuilder/declarations/noPrimaryConstructor.txt new file mode 100644 index 00000000000..a8da226377b --- /dev/null +++ b/compiler/testData/fir/rawBuilder/declarations/noPrimaryConstructor.txt @@ -0,0 +1,11 @@ +FILE: noPrimaryConstructor.kt + public? final class NoPrimary { + public? final? property x(val): String + public? get(): String + + public? constructor(x: String): this<>() { + } + + public? constructor(): this<>() + + } diff --git a/compiler/testData/fir/rawBuilder/declarations/simpleClass.txt b/compiler/testData/fir/rawBuilder/declarations/simpleClass.txt index c87891ef476..1db40b1bc52 100644 --- a/compiler/testData/fir/rawBuilder/declarations/simpleClass.txt +++ b/compiler/testData/fir/rawBuilder/declarations/simpleClass.txt @@ -7,6 +7,8 @@ FILE: simpleClass.kt } public? final class SomeClass : SomeInterface { + public? constructor(): super() + private final? property baz(val): = STUB public? get(): @@ -26,4 +28,6 @@ FILE: simpleClass.kt } public? final inline class InlineClass { + public? constructor(): super() + } diff --git a/compiler/testData/fir/rawBuilder/declarations/simpleTypeAlias.txt b/compiler/testData/fir/rawBuilder/declarations/simpleTypeAlias.txt index 6d693b98cf7..aa966b48654 100644 --- a/compiler/testData/fir/rawBuilder/declarations/simpleTypeAlias.txt +++ b/compiler/testData/fir/rawBuilder/declarations/simpleTypeAlias.txt @@ -3,4 +3,6 @@ FILE: simpleTypeAlias.kt } public? final typealias C = B public? final class D : C { + public? constructor(): super() + } diff --git a/compiler/testData/fir/rawBuilder/declarations/typeAliasWithGeneric.txt b/compiler/testData/fir/rawBuilder/declarations/typeAliasWithGeneric.txt index 7c0a8e87853..f756abd86d9 100644 --- a/compiler/testData/fir/rawBuilder/declarations/typeAliasWithGeneric.txt +++ b/compiler/testData/fir/rawBuilder/declarations/typeAliasWithGeneric.txt @@ -1,8 +1,12 @@ FILE: typeAliasWithGeneric.kt public? open class A { + public? constructor(): super() + } public? abstract interface B { } public? final typealias C = B public? final class D : C { + public? constructor(): super() + } diff --git a/compiler/testData/fir/rawBuilder/declarations/typeParameterVsNested.txt b/compiler/testData/fir/rawBuilder/declarations/typeParameterVsNested.txt index dd3c683f940..7a0f4f01a5e 100644 --- a/compiler/testData/fir/rawBuilder/declarations/typeParameterVsNested.txt +++ b/compiler/testData/fir/rawBuilder/declarations/typeParameterVsNested.txt @@ -2,7 +2,11 @@ FILE: typeParameterVsNested.kt public? abstract interface Some { } public? abstract class My { + public? constructor(): super() + public? final inner class T { + public? constructor(): super() + } public? abstract property x(val): T @@ -17,6 +21,8 @@ FILE: typeParameterVsNested.kt public? get(): test.My.T public? final class Some : T { + public? constructor(): super() + } } diff --git a/compiler/testData/fir/rawBuilder/declarations/typeParameters.txt b/compiler/testData/fir/rawBuilder/declarations/typeParameters.txt index 54931f7b4f8..8887b0a62bf 100644 --- a/compiler/testData/fir/rawBuilder/declarations/typeParameters.txt +++ b/compiler/testData/fir/rawBuilder/declarations/typeParameters.txt @@ -8,8 +8,12 @@ FILE: typeParameters.kt public? final typealias StringList = List public? final typealias AnyList = List<*> public? abstract class AbstractList : List { + public? constructor(): super() + } public? final class SomeList : AbstractList { + public? constructor(): super>() + public? open? override function get(index: Int): Int { STUB } diff --git a/compiler/testData/fir/resolve/F.kt b/compiler/testData/fir/resolve/F.kt index 3b2748ad007..ea56d48e954 100644 --- a/compiler/testData/fir/resolve/F.kt +++ b/compiler/testData/fir/resolve/F.kt @@ -1,4 +1,4 @@ open class A -class B : A \ No newline at end of file +class B : A() \ No newline at end of file diff --git a/compiler/testData/fir/resolve/F.txt b/compiler/testData/fir/resolve/F.txt index 8c38f4ba3c7..c1896ec5f08 100644 --- a/compiler/testData/fir/resolve/F.txt +++ b/compiler/testData/fir/resolve/F.txt @@ -1,5 +1,9 @@ FILE: F.kt public? open class A { + public? constructor(): super() + } public? final class B : R|A| { + public? constructor(): super() + } diff --git a/compiler/testData/fir/resolve/NestedOfAliasedType.txt b/compiler/testData/fir/resolve/NestedOfAliasedType.txt index 8b0db854e0d..9e2d4dd99dc 100644 --- a/compiler/testData/fir/resolve/NestedOfAliasedType.txt +++ b/compiler/testData/fir/resolve/NestedOfAliasedType.txt @@ -1,12 +1,20 @@ FILE: NestedOfAliasedType.kt public? abstract class A { + public? constructor(): super() + public? abstract class Nested { + public? constructor(): super() + } } public? final typealias TA = R|A| public? final class B : R|TA = A| { + public? constructor(): super() + public? final class NestedInB : R|A.Nested| { + public? constructor(): super() + } } diff --git a/compiler/testData/fir/resolve/NestedSuperType.txt b/compiler/testData/fir/resolve/NestedSuperType.txt index 5e6f94a83a2..204e31216ed 100644 --- a/compiler/testData/fir/resolve/NestedSuperType.txt +++ b/compiler/testData/fir/resolve/NestedSuperType.txt @@ -1,14 +1,24 @@ FILE: NestedSuperType.kt public? abstract class My { + public? constructor(): super() + public? abstract class NestedOne : R|p/My| { + public? constructor(): super() + public? abstract class NestedTwo : R|p/My.NestedOne| { + public? constructor(): super() + } } } public? final class Your : R|p/My| { + public? constructor(): super() + public? final class NestedThree : R|p/My.NestedOne| { + public? constructor(): super() + } } diff --git a/compiler/testData/fir/resolve/TwoDeclarationsInSameFile.txt b/compiler/testData/fir/resolve/TwoDeclarationsInSameFile.txt index fb131fe5f4f..95fbcfa7540 100644 --- a/compiler/testData/fir/resolve/TwoDeclarationsInSameFile.txt +++ b/compiler/testData/fir/resolve/TwoDeclarationsInSameFile.txt @@ -1,5 +1,9 @@ FILE: TwoDeclarationsInSameFile.kt public? open class A { + public? constructor(): super() + } public? final class B : R|p/A| { + public? constructor(): super() + } diff --git a/compiler/testData/fir/resolve/builtins/lists.txt b/compiler/testData/fir/resolve/builtins/lists.txt index 0983dbeb5f7..fb8132ee806 100644 --- a/compiler/testData/fir/resolve/builtins/lists.txt +++ b/compiler/testData/fir/resolve/builtins/lists.txt @@ -1,7 +1,11 @@ FILE: lists.kt public? abstract class MyStringList : R|kotlin/collections/List| { + public? constructor(): super() + } public? abstract class MyMutableStringList : R|kotlin/collections/MutableList| { + public? constructor(): super() + } public? final? function convert R|kotlin/collections/List|.(): R|MyStringList| { STUB diff --git a/compiler/testData/fir/resolve/companion.txt b/compiler/testData/fir/resolve/companion.txt index ff4526d342a..1951fe68b61 100644 --- a/compiler/testData/fir/resolve/companion.txt +++ b/compiler/testData/fir/resolve/companion.txt @@ -1,7 +1,13 @@ FILE: companion.kt public? abstract class Some { + public? constructor(): super() + public? final companion object Companion { + public? constructor(): super() + public? final class InCompanion { + public? constructor(): super() + } } @@ -11,8 +17,14 @@ FILE: companion.kt } public? abstract class Another { + public? constructor(): super() + public? final companion object NamedCompanion { + public? constructor(): super() + public? final class InCompanion { + public? constructor(): super() + } } diff --git a/compiler/testData/fir/resolve/derivedClass.txt b/compiler/testData/fir/resolve/derivedClass.txt index f8c491e58a2..3e4b9bc361c 100644 --- a/compiler/testData/fir/resolve/derivedClass.txt +++ b/compiler/testData/fir/resolve/derivedClass.txt @@ -1,13 +1,13 @@ FILE: derivedClass.kt public? open class Base { - public? constructor(x: R|T|) + public? constructor(x: R|T|): super() public? final? property x(val): R|T| public? get(): R|T| } public? final class Derived : R|Base| { - public? constructor(x: R|T|): super() + public? constructor(x: R|T|): super|>() } public? final? function create(x: R|T|): R|Derived| { diff --git a/compiler/testData/fir/resolve/enum.txt b/compiler/testData/fir/resolve/enum.txt index 4329aca11f0..3a472be4bdd 100644 --- a/compiler/testData/fir/resolve/enum.txt +++ b/compiler/testData/fir/resolve/enum.txt @@ -2,16 +2,22 @@ FILE: enum.kt public? abstract interface Some { } public? final object O1 : R|Some| { + public? constructor(): super() + } public? final object O2 : R|Some| { + public? constructor(): super() + } public? final enum class SomeEnum { - public? constructor(x: R|Some|) + public? constructor(x: R|Some|): super() public? final? property x(val): R|Some| public? get(): R|Some| public? final enum entry FIRST : R|SomeEnum| { + public? constructor(): super() + public? open? override function check(y: R|Some|): R|kotlin/Boolean| { STUB } @@ -19,6 +25,8 @@ FILE: enum.kt } public? final enum entry SECOND : R|SomeEnum| { + public? constructor(): super() + public? open? override function check(y: R|Some|): R|kotlin/Boolean| { STUB } diff --git a/compiler/testData/fir/resolve/genericFunctions.txt b/compiler/testData/fir/resolve/genericFunctions.txt index d3ef088da65..5ed7844a619 100644 --- a/compiler/testData/fir/resolve/genericFunctions.txt +++ b/compiler/testData/fir/resolve/genericFunctions.txt @@ -5,6 +5,8 @@ FILE: genericFunctions.kt STUB } public? abstract class Summator { + public? constructor(): super() + public? abstract function plus(first: R|T|, second: R|T|): R|T| } diff --git a/compiler/testData/fir/resolve/multifile/Annotations.txt b/compiler/testData/fir/resolve/multifile/Annotations.txt index bd697ddcfc1..8a4d941bb6e 100644 --- a/compiler/testData/fir/resolve/multifile/Annotations.txt +++ b/compiler/testData/fir/resolve/multifile/Annotations.txt @@ -1,6 +1,8 @@ FILE: Annotations.kt @FILE:R|annotations/Simple|() @R|annotations/WithInt|(STUB) public? abstract class First { + public? constructor(): super() + @R|annotations/Simple|() public? abstract function foo(@R|annotations/WithString|(STUB) arg: @R|annotations/Simple|() R|kotlin/Double|): R|kotlin/Unit| @R|annotations/Complex|(STUB, STUB) public? abstract property v(val): R|kotlin/String| @@ -8,7 +10,7 @@ FILE: Annotations.kt } @R|annotations/WithString|(STUB) public? final class Second : @R|annotations/WithInt|(STUB) R|test/First| { - public? constructor(y: R|kotlin/Char|): super() + public? constructor(y: R|kotlin/Char|): super<@R|annotations/WithInt|(STUB) R|test/First|>() public? final? property y(val): R|kotlin/Char| public? get(): R|kotlin/Char| @@ -21,7 +23,7 @@ FILE: Annotations.kt STUB } - @R|annotations/WithString|(STUB) public? constructor(): this() + @R|annotations/WithString|(STUB) public? constructor(): this() } @R|annotations/WithInt|(STUB) @R|annotations/WithInt|(STUB) public? final typealias Third = @R|annotations/Simple|() R|test/Second| diff --git a/compiler/testData/fir/resolve/multifile/NestedSuperType.txt b/compiler/testData/fir/resolve/multifile/NestedSuperType.txt index b335918d021..ff153045256 100644 --- a/compiler/testData/fir/resolve/multifile/NestedSuperType.txt +++ b/compiler/testData/fir/resolve/multifile/NestedSuperType.txt @@ -1,9 +1,15 @@ FILE: NestedSuperType.kt public? final class A : R|b/B| { + public? constructor(): super() + public? final class NestedInA1 : R|b/B.NestedInB| { + public? constructor(): super() + } public? final class NestedInA2 : R|c/C.NestedInC| { + public? constructor(): super() + } } diff --git a/compiler/testData/fir/resolve/multifile/TypeAliasExpansion.kt b/compiler/testData/fir/resolve/multifile/TypeAliasExpansion.kt index 589540900d7..3bd0301b470 100644 --- a/compiler/testData/fir/resolve/multifile/TypeAliasExpansion.kt +++ b/compiler/testData/fir/resolve/multifile/TypeAliasExpansion.kt @@ -2,6 +2,6 @@ package a import b.TA -class MyClass : TA +class MyClass : TA() // analyzePriority: 0 \ No newline at end of file diff --git a/compiler/testData/fir/resolve/multifile/TypeAliasExpansion.txt b/compiler/testData/fir/resolve/multifile/TypeAliasExpansion.txt index 786a8456004..d4e5c00f0e3 100644 --- a/compiler/testData/fir/resolve/multifile/TypeAliasExpansion.txt +++ b/compiler/testData/fir/resolve/multifile/TypeAliasExpansion.txt @@ -1,3 +1,5 @@ FILE: TypeAliasExpansion.kt public? final class MyClass : R|b/TA = b/A| { + public? constructor(): super() + } diff --git a/compiler/testData/fir/resolve/multifile/sealedStarImport.txt b/compiler/testData/fir/resolve/multifile/sealedStarImport.txt index 4fdb6f35f58..aeef5a0b0b2 100644 --- a/compiler/testData/fir/resolve/multifile/sealedStarImport.txt +++ b/compiler/testData/fir/resolve/multifile/sealedStarImport.txt @@ -1,5 +1,7 @@ FILE: sealedStarImport.kt public? abstract class Factory { + public? constructor(): super() + public? abstract function createTest(): R|error: Symbol not found| public? abstract function createObj(): R|test/Test.O| diff --git a/compiler/testData/fir/resolve/multifile/simpleAliasedImport.kt b/compiler/testData/fir/resolve/multifile/simpleAliasedImport.kt index 6657ab7935d..9bac226602b 100644 --- a/compiler/testData/fir/resolve/multifile/simpleAliasedImport.kt +++ b/compiler/testData/fir/resolve/multifile/simpleAliasedImport.kt @@ -1,4 +1,4 @@ package a import b.MyClass as HisClass -class YourClass : HisClass \ No newline at end of file +class YourClass : HisClass() \ No newline at end of file diff --git a/compiler/testData/fir/resolve/multifile/simpleAliasedImport.txt b/compiler/testData/fir/resolve/multifile/simpleAliasedImport.txt index 3d1e5b352a2..fbde8da0a17 100644 --- a/compiler/testData/fir/resolve/multifile/simpleAliasedImport.txt +++ b/compiler/testData/fir/resolve/multifile/simpleAliasedImport.txt @@ -1,3 +1,5 @@ FILE: simpleAliasedImport.kt public? final class YourClass : R|b/MyClass| { + public? constructor(): super() + } diff --git a/compiler/testData/fir/resolve/multifile/simpleImport.kt b/compiler/testData/fir/resolve/multifile/simpleImport.kt index f2ec0ea57b5..059b1c238a5 100644 --- a/compiler/testData/fir/resolve/multifile/simpleImport.kt +++ b/compiler/testData/fir/resolve/multifile/simpleImport.kt @@ -1,4 +1,4 @@ package a import b.MyClass -class YourClass : MyClass \ No newline at end of file +class YourClass : MyClass() \ No newline at end of file diff --git a/compiler/testData/fir/resolve/multifile/simpleImport.txt b/compiler/testData/fir/resolve/multifile/simpleImport.txt index c038a8696aa..25c6dfb546f 100644 --- a/compiler/testData/fir/resolve/multifile/simpleImport.txt +++ b/compiler/testData/fir/resolve/multifile/simpleImport.txt @@ -1,3 +1,5 @@ FILE: simpleImport.kt public? final class YourClass : R|b/MyClass| { + public? constructor(): super() + } diff --git a/compiler/testData/fir/resolve/multifile/simpleImportNested.txt b/compiler/testData/fir/resolve/multifile/simpleImportNested.txt index 8365fb4fa51..2d55acb5eb3 100644 --- a/compiler/testData/fir/resolve/multifile/simpleImportNested.txt +++ b/compiler/testData/fir/resolve/multifile/simpleImportNested.txt @@ -1,3 +1,5 @@ FILE: simpleImportNested.kt public? final class YourClass : R|a/MyClass.MyNested| { + public? constructor(): super() + } diff --git a/compiler/testData/fir/resolve/multifile/simpleImportOuter.txt b/compiler/testData/fir/resolve/multifile/simpleImportOuter.txt index e1530a450a2..6d209715281 100644 --- a/compiler/testData/fir/resolve/multifile/simpleImportOuter.txt +++ b/compiler/testData/fir/resolve/multifile/simpleImportOuter.txt @@ -1,3 +1,5 @@ FILE: simpleImportOuter.kt public? final class My : R|a/Outer.Nested| { + public? constructor(): super() + } diff --git a/compiler/testData/fir/resolve/nestedClass.txt b/compiler/testData/fir/resolve/nestedClass.txt index 47f1172f638..0c88a698396 100644 --- a/compiler/testData/fir/resolve/nestedClass.txt +++ b/compiler/testData/fir/resolve/nestedClass.txt @@ -1,18 +1,22 @@ FILE: nestedClass.kt public? abstract class Base { - public? constructor(s: R|kotlin/String|) + public? constructor(s: R|kotlin/String|): super() public? final? property s(val): R|kotlin/String| public? get(): R|kotlin/String| } public? final class Outer { + public? constructor(): super() + public? final class Derived : R|Base| { - public? constructor(s: R|kotlin/String|): super() + public? constructor(s: R|kotlin/String|): super() } public? final object Obj : R|Base| { + public? constructor(): super() + } } diff --git a/compiler/testData/fir/resolve/simpleClass.txt b/compiler/testData/fir/resolve/simpleClass.txt index 546162244ec..fa61dcd562b 100644 --- a/compiler/testData/fir/resolve/simpleClass.txt +++ b/compiler/testData/fir/resolve/simpleClass.txt @@ -7,6 +7,8 @@ FILE: simpleClass.kt } public? final class SomeClass : R|SomeInterface| { + public? constructor(): super() + private final? property baz(val): R|error: Not supported: FirImplicitTypeImpl| = STUB public? get(): R|error: Not supported: FirImplicitTypeImpl| diff --git a/compiler/testData/fir/resolve/simpleTypeAlias.txt b/compiler/testData/fir/resolve/simpleTypeAlias.txt index 7c88b7af68b..130b468163d 100644 --- a/compiler/testData/fir/resolve/simpleTypeAlias.txt +++ b/compiler/testData/fir/resolve/simpleTypeAlias.txt @@ -3,4 +3,6 @@ FILE: simpleTypeAlias.kt } public? final typealias C = R|B| public? final class D : R|C = B| { + public? constructor(): super() + } diff --git a/compiler/testData/fir/resolve/stdlib/functionX.txt b/compiler/testData/fir/resolve/stdlib/functionX.txt index 0a3ba057d98..443c3ac3428 100644 --- a/compiler/testData/fir/resolve/stdlib/functionX.txt +++ b/compiler/testData/fir/resolve/stdlib/functionX.txt @@ -4,6 +4,8 @@ FILE: functionX.kt public? final? property y(val): R|kotlin/Function1| = STUB public? get(): R|kotlin/Function1| public? final class MyFunction : R|kotlin/Function2| { + public? constructor(): super() + public? open? override function invoke(p1: R|kotlin/Int|, p2: R|kotlin/String|): R|kotlin/Unit| { } diff --git a/compiler/testData/fir/resolve/typeAliasWithGeneric.txt b/compiler/testData/fir/resolve/typeAliasWithGeneric.txt index 3b18247ec9b..f3b5a6d74ff 100644 --- a/compiler/testData/fir/resolve/typeAliasWithGeneric.txt +++ b/compiler/testData/fir/resolve/typeAliasWithGeneric.txt @@ -1,8 +1,12 @@ FILE: typeAliasWithGeneric.kt public? open class A { + public? constructor(): super() + } public? abstract interface B { } public? final class D : R|C = B| { + public? constructor(): super() + } public? final typealias C = R|B| diff --git a/compiler/testData/fir/resolve/typeParameterVsNested.txt b/compiler/testData/fir/resolve/typeParameterVsNested.txt index 5b1489670aa..f87d7e759d0 100644 --- a/compiler/testData/fir/resolve/typeParameterVsNested.txt +++ b/compiler/testData/fir/resolve/typeParameterVsNested.txt @@ -2,7 +2,11 @@ FILE: typeParameterVsNested.kt public? abstract interface Some { } public? abstract class My { + public? constructor(): super() + public? final inner class T { + public? constructor(): super() + } public? abstract property x(val): R|T| @@ -17,6 +21,8 @@ FILE: typeParameterVsNested.kt public? get(): R|test/My.T| public? final class Some : R|test/My.T| { + public? constructor(): super() + } } diff --git a/compiler/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java index 4d5a856b22f..98b770d103a 100644 --- a/compiler/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java @@ -96,6 +96,12 @@ public class RawFirBuilderTestCaseGenerated extends AbstractRawFirBuilderTestCas runTest("compiler/testData/fir/rawBuilder/declarations/NestedSuperType.kt"); } + @TestMetadata("noPrimaryConstructor.kt") + public void testNoPrimaryConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/rawBuilder/declarations/noPrimaryConstructor.kt"); + doRawFirTest(fileName); + } + @TestMetadata("simpleClass.kt") public void testSimpleClass() throws Exception { runTest("compiler/testData/fir/rawBuilder/declarations/simpleClass.kt");