FIR: Report diagnostics introduced during call completion

This commit is contained in:
Denis.Zharkov
2021-04-14 10:51:33 +03:00
committed by teamcityserver
parent 09321e5e41
commit a700fdc312
6 changed files with 54 additions and 10 deletions
@@ -13200,6 +13200,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/tests/inference/completion/equalityConstraintUpstairs.kt");
}
@Test
@TestMetadata("errorAfterCompletion.kt")
public void testErrorAfterCompletion() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.kt");
}
@Test
@TestMetadata("flexibleType.kt")
public void testFlexibleType() throws Exception {
@@ -13200,6 +13200,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/tests/inference/completion/equalityConstraintUpstairs.kt");
}
@Test
@TestMetadata("errorAfterCompletion.kt")
public void testErrorAfterCompletion() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.kt");
}
@Test
@TestMetadata("flexibleType.kt")
public void testFlexibleType() throws Exception {
@@ -11,12 +11,14 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
import org.jetbrains.kotlin.fir.references.builder.buildResolvedCallableReference
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.dfa.FirDataFlowAnalyzer
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeInapplicableCandidateError
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeTypeParameterInQualifiedAccess
import org.jetbrains.kotlin.fir.resolve.inference.*
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
@@ -734,17 +736,25 @@ class FirCallCompletionResultsWriterTransformer(
return arrayOfCall
}
private fun FirNamedReferenceWithCandidate.toResolvedReference() = if (this is FirErrorReferenceWithCandidate) {
buildErrorNamedReference {
source = this@toResolvedReference.source
diagnostic = this@toResolvedReference.diagnostic
candidateSymbol = this@toResolvedReference.candidateSymbol
private fun FirNamedReferenceWithCandidate.toResolvedReference(): FirNamedReference {
val errorDiagnostic = when {
this is FirErrorReferenceWithCandidate -> this.diagnostic
!candidate.isSuccessful -> ConeInapplicableCandidateError(candidate.currentApplicability, candidate)
else -> null
}
} else {
buildResolvedNamedReference {
source = this@toResolvedReference.source
name = this@toResolvedReference.name
resolvedSymbol = this@toResolvedReference.candidateSymbol
return if (errorDiagnostic != null) {
buildErrorNamedReference {
source = this@toResolvedReference.source
diagnostic = errorDiagnostic
candidateSymbol = this@toResolvedReference.candidateSymbol
}
} else {
buildResolvedNamedReference {
source = this@toResolvedReference.source
name = this@toResolvedReference.name
resolvedSymbol = this@toResolvedReference.candidateSymbol
}
}
}
}
@@ -0,0 +1,8 @@
// SKIP_TXT
fun foo(x: () -> Int): Int = x()
fun <R> myRun(x: () -> R): R = x()
private val a = foo { myRun { <!ARGUMENT_TYPE_MISMATCH!>"OK"<!> } }
private val b: Int = myRun { <!ARGUMENT_TYPE_MISMATCH!>"OK"<!> }
@@ -0,0 +1,8 @@
// SKIP_TXT
fun foo(x: () -> Int): Int = x()
fun <R> myRun(x: () -> R): R = x()
private val a = foo { <!TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH!>myRun { <!TYPE_MISMATCH!>"OK"<!> }<!> }
private val b: Int = <!TYPE_MISMATCH!>myRun { <!TYPE_MISMATCH!>"OK"<!> }<!>
@@ -13206,6 +13206,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/inference/completion/equalityConstraintUpstairs.kt");
}
@Test
@TestMetadata("errorAfterCompletion.kt")
public void testErrorAfterCompletion() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.kt");
}
@Test
@TestMetadata("flexibleType.kt")
public void testFlexibleType() throws Exception {