FIR: Report diagnostics introduced during call completion
This commit is contained in:
committed by
teamcityserver
parent
09321e5e41
commit
a700fdc312
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+20
-10
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+8
@@ -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"<!> }
|
||||
+8
@@ -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"<!> }<!>
|
||||
Generated
+6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user