diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt index 3ed05afb15a..dde33c42004 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt @@ -86,6 +86,8 @@ class FirSpecificTypeResolverTransformer( typeRef.source } + delegatedTypeRef = typeRef + diagnostic = resolvedType.diagnostic } }.compose() diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt index 7c5147f53dd..4c29b705a0a 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt @@ -39,7 +39,7 @@ internal class FirErrorFunctionImpl( override val symbol: FirErrorFunctionSymbol, override val typeParameters: MutableList, ) : FirErrorFunction() { - override var returnTypeRef: FirTypeRef = FirErrorTypeRefImpl(null, diagnostic) + override var returnTypeRef: FirTypeRef = FirErrorTypeRefImpl(null, null, diagnostic) override val receiverTypeRef: FirTypeRef? get() = null override var controlFlowGraphReference: FirControlFlowGraphReference? = null override val body: FirBlock? get() = null diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorPropertyImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorPropertyImpl.kt index e85bcf49249..532a3a6a3ba 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorPropertyImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorPropertyImpl.kt @@ -40,7 +40,7 @@ internal class FirErrorPropertyImpl( override val typeParameters: MutableList, override val symbol: FirErrorPropertySymbol, ) : FirErrorProperty() { - override var returnTypeRef: FirTypeRef = FirErrorTypeRefImpl(null, diagnostic) + override var returnTypeRef: FirTypeRef = FirErrorTypeRefImpl(null, null, diagnostic) override val receiverTypeRef: FirTypeRef? get() = null override val initializer: FirExpression? get() = null override val delegate: FirExpression? get() = null diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt index 2df4a84c90f..afe92ff17cf 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt @@ -23,7 +23,7 @@ internal class FirErrorExpressionImpl( override val source: FirSourceElement?, override val diagnostic: ConeDiagnostic, ) : FirErrorExpression() { - override var typeRef: FirTypeRef = FirErrorTypeRefImpl(source, ConeStubDiagnostic(diagnostic)) + override var typeRef: FirTypeRef = FirErrorTypeRefImpl(source, null, ConeStubDiagnostic(diagnostic)) override val annotations: List get() = emptyList() override fun acceptChildren(visitor: FirVisitor, data: D) { diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirErrorTypeRefBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirErrorTypeRefBuilder.kt index 07cb6c3276d..5b967ddfdd4 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirErrorTypeRefBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirErrorTypeRefBuilder.kt @@ -26,11 +26,13 @@ import org.jetbrains.kotlin.fir.visitors.* @FirBuilderDsl class FirErrorTypeRefBuilder : FirAnnotationContainerBuilder { override var source: FirSourceElement? = null + var delegatedTypeRef: FirTypeRef? = null lateinit var diagnostic: ConeDiagnostic override fun build(): FirErrorTypeRef { return FirErrorTypeRefImpl( source, + delegatedTypeRef, diagnostic, ) } @@ -55,6 +57,7 @@ inline fun buildErrorTypeRefCopy(original: FirErrorTypeRef, init: FirErrorTypeRe } val copyBuilder = FirErrorTypeRefBuilder() copyBuilder.source = original.source + copyBuilder.delegatedTypeRef = original.delegatedTypeRef copyBuilder.diagnostic = original.diagnostic return copyBuilder.apply(init).build() } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt index 567903e36a4..c376e7c25e3 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt @@ -21,18 +21,20 @@ import org.jetbrains.kotlin.fir.visitors.* internal class FirErrorTypeRefImpl( override val source: FirSourceElement?, + override var delegatedTypeRef: FirTypeRef?, override val diagnostic: ConeDiagnostic, ) : FirErrorTypeRef() { override val annotations: MutableList = mutableListOf() override val type: ConeKotlinType = ConeClassErrorType(diagnostic) - override val delegatedTypeRef: FirTypeRef? get() = null override fun acceptChildren(visitor: FirVisitor, data: D) { annotations.forEach { it.accept(visitor, data) } + delegatedTypeRef?.accept(visitor, data) } override fun transformChildren(transformer: FirTransformer, data: D): FirErrorTypeRefImpl { transformAnnotations(transformer, data) + delegatedTypeRef = delegatedTypeRef?.transformSingle(transformer, data) return this } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 11dfd0a1501..992324f0fa1 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -170,10 +170,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() val errorTypeRefImpl = impl(errorTypeRef) { default("type", "ConeClassErrorType(diagnostic)") - default("delegatedTypeRef") { - value = "null" - withGetter = true - } default("annotations", "mutableListOf()") useTypes(coneClassErrorTypeType) } @@ -201,7 +197,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() "getter", "setter", withGetter = true ) - default("returnTypeRef", "FirErrorTypeRefImpl(null, diagnostic)") + default("returnTypeRef", "FirErrorTypeRefImpl(null, null, diagnostic)") useTypes(errorTypeRefImpl) } @@ -396,13 +392,13 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() impl(errorExpression) { defaultEmptyList("annotations") - default("typeRef", "FirErrorTypeRefImpl(source, ConeStubDiagnostic(diagnostic))") + default("typeRef", "FirErrorTypeRefImpl(source, null, ConeStubDiagnostic(diagnostic))") useTypes(errorTypeRefImpl, coneStubDiagnosticType) } impl(errorFunction) { defaultNull("receiverTypeRef", "body", withGetter = true) - default("returnTypeRef", "FirErrorTypeRefImpl(null, diagnostic)") + default("returnTypeRef", "FirErrorTypeRefImpl(null, null, diagnostic)") useTypes(errorTypeRefImpl) } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FirElementsRecorder.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FirElementsRecorder.kt index 67a27e3825c..dd9694b6a7d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FirElementsRecorder.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FirElementsRecorder.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.realPsi import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.types.FirErrorTypeRef +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirUserTypeRef import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl @@ -68,9 +69,18 @@ internal open class FirElementsRecorder : FirVisitor) {} override fun visitSuperReference(superReference: FirSuperReference, data: MutableMap) {} override fun visitThisReference(thisReference: FirThisReference, data: MutableMap) {} - override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: MutableMap) {} //@formatter:on + override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: MutableMap) { + super.visitResolvedTypeRef(errorTypeRef, data) + errorTypeRef.delegatedTypeRef?.accept(this, data) + } + + override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: MutableMap) { + super.visitResolvedTypeRef(resolvedTypeRef, data) + resolvedTypeRef.delegatedTypeRef?.accept(this, data) + } + override fun visitUserTypeRef(userTypeRef: FirUserTypeRef, data: MutableMap) { userTypeRef.acceptChildren(this, data) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt index 91ca1f4e53c..c0928b8f1d6 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt @@ -388,8 +388,11 @@ internal object FirReferenceResolveHelper { ): ClassId? { val qualifierToResolve = qualifier.parent as KtUserType // FIXME make it work with generics in functional types (like () -> AA.BB) - val wholeType = - (wholeTypeFir.psi as KtTypeReference).typeElement?.unwrapNullable() as? KtUserType ?: return null + val wholeType = when (val psi = wholeTypeFir.psi) { + is KtUserType -> psi + is KtTypeReference -> psi.typeElement?.unwrapNullable() as? KtUserType + else -> null + } ?: return null val qualifiersToDrop = countQualifiersToDrop(wholeType, qualifierToResolve) return wholeTypeFir.type.classId?.dropLastNestedClasses(qualifiersToDrop) diff --git a/idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt b/idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt index 7b6b02313ca..e71361f94d8 100644 --- a/idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt +++ b/idea/testData/resolve/references/TypeArgumentUnresolvedClass.kt @@ -1,4 +1,3 @@ -// IGNORE_FIR val v: UnknownClass<String> // REF: (kotlin).String diff --git a/idea/testData/resolve/references/TypeArgumentUnresolvedConstructor.kt b/idea/testData/resolve/references/TypeArgumentUnresolvedConstructor.kt index c3074edbab5..52f75931936 100644 --- a/idea/testData/resolve/references/TypeArgumentUnresolvedConstructor.kt +++ b/idea/testData/resolve/references/TypeArgumentUnresolvedConstructor.kt @@ -1,4 +1,3 @@ -// IGNORE_FIR val v: UnknownClass<String>() // REF: (kotlin).String diff --git a/idea/testData/resolve/references/TypeArgumentWrongNumber.kt b/idea/testData/resolve/references/TypeArgumentWrongNumber.kt index a3df1c630cb..232ee88a284 100644 --- a/idea/testData/resolve/references/TypeArgumentWrongNumber.kt +++ b/idea/testData/resolve/references/TypeArgumentWrongNumber.kt @@ -1,4 +1,3 @@ -// IGNORE_FIR class Foo class Bar: Foo<String diff --git a/idea/testData/resolve/references/WrongNumberOfTypeArguments.kt b/idea/testData/resolve/references/WrongNumberOfTypeArguments.kt index 098725b1a63..fca2ff6eaf0 100644 --- a/idea/testData/resolve/references/WrongNumberOfTypeArguments.kt +++ b/idea/testData/resolve/references/WrongNumberOfTypeArguments.kt @@ -1,5 +1,3 @@ -// IGNORE_FIR - package foo class A diff --git a/idea/testData/resolve/references/WrongNumberOfTypeArguments2.kt b/idea/testData/resolve/references/WrongNumberOfTypeArguments2.kt index c328ab5c241..22647bdbf99 100644 --- a/idea/testData/resolve/references/WrongNumberOfTypeArguments2.kt +++ b/idea/testData/resolve/references/WrongNumberOfTypeArguments2.kt @@ -1,5 +1,3 @@ -// IGNORE_FIR - package foo class A diff --git a/idea/testData/resolve/references/WrongNumberOfTypeArgumentsInSupertype.kt b/idea/testData/resolve/references/WrongNumberOfTypeArgumentsInSupertype.kt index 9934b6c0d82..0e8071fd19c 100644 --- a/idea/testData/resolve/references/WrongNumberOfTypeArgumentsInSupertype.kt +++ b/idea/testData/resolve/references/WrongNumberOfTypeArgumentsInSupertype.kt @@ -1,4 +1,3 @@ -// IGNORE_FIR package foo class A