[FIR IDE] Fix TypeRef resolve to error type caused by invalid number of arguments

This commit is contained in:
Igor Yakovlev
2021-02-05 16:15:46 +03:00
parent f9e5584a3e
commit 04017b00a1
4 changed files with 32 additions and 3 deletions
@@ -429,6 +429,11 @@ public class FirReferenceResolveTestGenerated extends AbstractFirReferenceResolv
runTest("idea/testData/resolve/references/WrongNumberOfTypeArguments2.kt");
}
@TestMetadata("WrongNumberOfTypeArguments3.kt")
public void testWrongNumberOfTypeArguments3() throws Exception {
runTest("idea/testData/resolve/references/WrongNumberOfTypeArguments3.kt");
}
@TestMetadata("WrongNumberOfTypeArgumentsInSupertype.kt")
public void testWrongNumberOfTypeArgumentsInSupertype() throws Exception {
runTest("idea/testData/resolve/references/WrongNumberOfTypeArgumentsInSupertype.kt");
@@ -16,14 +16,17 @@ import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguityError
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeInapplicableCandidateError
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeOperatorAmbiguityError
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeWrongNumberOfTypeArgumentsError
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType
import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.idea.fir.*
import org.jetbrains.kotlin.idea.fir.getCandidateSymbols
import org.jetbrains.kotlin.idea.fir.isImplicitFunctionCall
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirSafe
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
@@ -42,8 +45,15 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
internal object FirReferenceResolveHelper {
fun FirResolvedTypeRef.toTargetSymbol(session: FirSession, symbolBuilder: KtSymbolByFirBuilder): KtSymbol? {
val type = type as? ConeLookupTagBasedType ?: return null
val symbol = type.lookupTag.toSymbol(session) as? AbstractFirBasedSymbol<*>
val type = type as? ConeLookupTagBasedType
val resolvedSymbol = type?.lookupTag?.toSymbol(session) as? AbstractFirBasedSymbol<*>
val symbol = resolvedSymbol ?: run {
val diagnostic = (this as? FirErrorTypeRef)?.diagnostic
(diagnostic as? ConeWrongNumberOfTypeArgumentsError)?.type
}
return symbol?.fir?.buildSymbol(symbolBuilder)
}
@@ -0,0 +1,9 @@
package foo
class CC<T>
class DD<T, T2>
val v1 = D<caret>D<C<caret>C>
// REF1: (foo).DD
// REF2: (foo).CC
@@ -429,6 +429,11 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest
runTest("idea/testData/resolve/references/WrongNumberOfTypeArguments2.kt");
}
@TestMetadata("WrongNumberOfTypeArguments3.kt")
public void testWrongNumberOfTypeArguments3() throws Exception {
runTest("idea/testData/resolve/references/WrongNumberOfTypeArguments3.kt");
}
@TestMetadata("WrongNumberOfTypeArgumentsInSupertype.kt")
public void testWrongNumberOfTypeArgumentsInSupertype() throws Exception {
runTest("idea/testData/resolve/references/WrongNumberOfTypeArgumentsInSupertype.kt");