From 0c25d280eeb480d4af7cf0b080c77623bb26b6a9 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Tue, 6 Jul 2021 22:21:33 +0300 Subject: [PATCH] [FIR] Fix calculating of source of TypeArgumentList, add source to FirQualifierPart Fix positioning for TYPE_ARGUMENTS_NOT_ALLOWED --- .../diagnostics/typeArgumentsNotAllowed.kt | 16 ++++++++-------- .../lightTree/converter/DeclarationsConverter.kt | 15 ++++++++++++--- .../kotlin/fir/builder/RawFirBuilder.kt | 3 ++- .../kotlin/fir/types/FirQualifierPart.kt | 1 + .../fir/types/impl/FirQualifierPartImpl.kt | 6 +++++- .../diagnostics/tests/PackageQualified.fir.kt | 2 +- .../tests/generics/argumentsForT.fir.kt | 4 ++-- .../diagnostics/tests/regressions/kt9620.fir.kt | 6 +++--- 8 files changed, 34 insertions(+), 19 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.kt index 3b908487d2d..588dcc85a0b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.kt @@ -1,14 +1,14 @@ package rest abstract class Foo { - abstract val x: T + abstract val x: T - abstract fun foo(): T + abstract fun foo(): T } fun foo() { - bar<T>() - barT>>>() + bar>() + bar>>>() } fun bar() {} @@ -26,9 +26,9 @@ class C<Boolean>> gest() {} fun fest() { - val b: List<T> - gest<T>() + val b: List> + gest>() gest() - val c: ListT>>> - gestT>>>() + val c: List>>> + gest>>>() } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index b67444cb4ec..3d18b026fb7 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -1843,12 +1843,20 @@ class DeclarationsConverter( ): FirTypeRef { var simpleFirUserType: FirUserTypeRef? = null var identifier: String? = null + var identifierSource: FirSourceElement? = null val firTypeArguments = mutableListOf() + var typeArgumentsSource: FirSourceElement? = null userType.forEachChildren { when (it.tokenType) { USER_TYPE -> simpleFirUserType = convertUserType(typeRefSource, it) as? FirUserTypeRef //simple user type - REFERENCE_EXPRESSION -> identifier = it.asText - TYPE_ARGUMENT_LIST -> firTypeArguments += convertTypeArguments(it) + REFERENCE_EXPRESSION -> { + identifierSource = it.toFirSourceElement() + identifier = it.asText + } + TYPE_ARGUMENT_LIST -> { + typeArgumentsSource = it.toFirSourceElement() + firTypeArguments += convertTypeArguments(it) + } } } @@ -1859,8 +1867,9 @@ class DeclarationsConverter( } val qualifierPart = FirQualifierPartImpl( + identifierSource!!, identifier.nameAsSafeName(), - FirTypeArgumentListImpl(typeRefSource).apply { + FirTypeArgumentListImpl(typeArgumentsSource ?: typeRefSource).apply { typeArguments += firTypeArguments } ) diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 4d99e3fb5c7..9f8b77a3f88 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1489,8 +1489,9 @@ open class RawFirBuilder( do { val firQualifier = FirQualifierPartImpl( + referenceExpression!!.toFirSourceElement(), referenceExpression!!.getReferencedNameAsName(), - FirTypeArgumentListImpl(source).apply { + FirTypeArgumentListImpl(ktQualifier?.typeArgumentList?.toFirPsiSourceElement() ?: source).apply { for (typeArgument in ktQualifier!!.typeArguments) { typeArguments += typeArgument.convert() } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirQualifierPart.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirQualifierPart.kt index c8c51fd9e19..b2e821836e9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirQualifierPart.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirQualifierPart.kt @@ -14,6 +14,7 @@ interface FirTypeArgumentList { } interface FirQualifierPart { + val source: FirSourceElement val name: Name val typeArgumentList: FirTypeArgumentList } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirQualifierPartImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirQualifierPartImpl.kt index ad233384167..33788b7e4f5 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirQualifierPartImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirQualifierPartImpl.kt @@ -15,4 +15,8 @@ class FirTypeArgumentListImpl(override val source: FirSourceElement) : FirTypeAr override val typeArguments = mutableListOf() } -class FirQualifierPartImpl(override val name: Name, override val typeArgumentList: FirTypeArgumentList) : FirQualifierPart \ No newline at end of file +class FirQualifierPartImpl( + override val source: FirSourceElement, + override val name: Name, + override val typeArgumentList: FirTypeArgumentList +) : FirQualifierPart \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/PackageQualified.fir.kt b/compiler/testData/diagnostics/tests/PackageQualified.fir.kt index a0ac4817423..9c2739ef43d 100644 --- a/compiler/testData/diagnostics/tests/PackageQualified.fir.kt +++ b/compiler/testData/diagnostics/tests/PackageQualified.fir.kt @@ -12,7 +12,7 @@ package foobar.a package foobar abstract class Foo() { - abstract val x : T + abstract val x : T } // FILE: c.kt diff --git a/compiler/testData/diagnostics/tests/generics/argumentsForT.fir.kt b/compiler/testData/diagnostics/tests/generics/argumentsForT.fir.kt index 9fd1bf6eac9..2f0e78f8bb9 100644 --- a/compiler/testData/diagnostics/tests/generics/argumentsForT.fir.kt +++ b/compiler/testData/diagnostics/tests/generics/argumentsForT.fir.kt @@ -1,7 +1,7 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -fun foo(t: T) {} +fun foo(t: T) {} interface A class B -fun foo1(t: T>) {} \ No newline at end of file +fun foo1(t: T>) {} diff --git a/compiler/testData/diagnostics/tests/regressions/kt9620.fir.kt b/compiler/testData/diagnostics/tests/regressions/kt9620.fir.kt index e37c2993c8e..086014b0c61 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt9620.fir.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt9620.fir.kt @@ -1,14 +1,14 @@ // KT-9620 AssertionError in checkBounds -interface E1D, D> +interface E1, D> interface A interface B interface D -interface E2D, D<B>> +interface E2, D<B>> // KT-11354 AE from DescriptorResolver open class L() -class M : L<C>() +class M : L>()