diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirDoubleColonExpressionResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirDoubleColonExpressionResolver.kt index 38d70f02581..bad3d2e143a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirDoubleColonExpressionResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirDoubleColonExpressionResolver.kt @@ -10,6 +10,8 @@ package org.jetbrains.kotlin.fir.resolve import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirTypeAlias +import org.jetbrains.kotlin.fir.declarations.expandedConeType import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.types.ConeKotlinType @@ -117,16 +119,23 @@ class FirDoubleColonExpressionResolver( return resolve(expression) } + private fun FirResolvedQualifier.expandedRegularClassIfAny(): FirRegularClass? { + val classId = classId ?: return null + var fir = session.firSymbolProvider.getClassLikeSymbolByFqName(classId)?.fir + while (fir is FirTypeAlias) { + fir = fir.expandedConeType?.lookupTag?.toSymbol(session)?.fir ?: return null + } + return fir as? FirRegularClass + } + private fun resolveExpressionOnLHS(expression: FirExpression): DoubleColonLHS.Expression? { val type = (expression.typeRef as? FirResolvedTypeRef)?.type ?: return null if (expression is FirResolvedQualifier) { - val firClass = session.firSymbolProvider - .getClassLikeSymbolByFqName(expression.classId ?: return null) - ?.fir as? FirRegularClass - ?: return null - - if (firClass.classKind == ClassKind.OBJECT) return DoubleColonLHS.Expression(type, isObjectQualifier = true) + val firClass = expression.expandedRegularClassIfAny() ?: return null + if (firClass.classKind == ClassKind.OBJECT) { + return DoubleColonLHS.Expression(type, isObjectQualifier = true) + } return null } @@ -136,14 +145,10 @@ class FirDoubleColonExpressionResolver( private fun resolveTypeOnLHS( expression: FirExpression ): DoubleColonLHS.Type? { - val resolvedExpression = - expression as? FirResolvedQualifier - ?: return null + val resolvedExpression = expression as? FirResolvedQualifier + ?: return null - val firClass = session.firSymbolProvider - .getClassLikeSymbolByFqName(resolvedExpression.classId ?: return null) - // TODO: support type aliases - ?.fir as? FirRegularClass + val firClass = resolvedExpression.expandedRegularClassIfAny() ?: return null val type = ConeClassLikeTypeImpl( diff --git a/compiler/testData/diagnostics/tests/callableReference/typealiases.fir.kt b/compiler/testData/diagnostics/tests/callableReference/typealiases.fir.kt index 3fed265a53f..6d4bbab403e 100644 --- a/compiler/testData/diagnostics/tests/callableReference/typealiases.fir.kt +++ b/compiler/testData/diagnostics/tests/callableReference/typealiases.fir.kt @@ -11,5 +11,5 @@ inline fun Iterable.myMap(transform: (T) -> R): List { } fun usesGlobal(p: List) { - p.myMap(Global::toUpperCase) + p.myMap(Global::toUpperCase) } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/methodReference.fir.kt b/compiler/testData/diagnostics/tests/typealias/methodReference.fir.kt index 66da9ad11ee..c0914863e45 100644 --- a/compiler/testData/diagnostics/tests/typealias/methodReference.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/methodReference.fir.kt @@ -4,4 +4,4 @@ class C { typealias CA = C -val cf = CA::foo +val cf = CA::foo diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasesInQualifiers.fir.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasesInQualifiers.fir.kt index 5e69145cd2a..d1910623e44 100644 --- a/compiler/testData/diagnostics/tests/typealias/typeAliasesInQualifiers.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasesInQualifiers.fir.kt @@ -50,7 +50,7 @@ fun foo( test.ClassAlias::Nested test.ClassSample::func - test.ClassAlias::func + test.ClassAlias::func test.ClassSample.Nested::func test.ClassAlias.Nested::func @@ -68,7 +68,7 @@ fun foo( test.EnumAlias::Nested test.EnumSample::func - test.EnumAlias::func + test.EnumAlias::func test.EnumSample.Nested::func test.EnumAlias.Nested::func