FIR: pass the qualified access source when reporting ErrorNamedReference
Currently if there is an error in a function call, FIR would report the entire expression if this call is qualified, but *only* the name if it's not qualified. For example, assume the following two calls are all contains some errors. ``` a.foo(1,2,3) ^^^^^^^^^^^^ bar(1,2,3) ^^^ ``` The entire call of `foo` is reported since it's qualified. But only the reference `bar` is reported since it's not qualified. This limits the usage of position strategies because the IDE does not allow position strategies to go outside of the initially reported PSI element (org.jetbrains.kotlin.idea.fir.highlighter.KotlinHighLevelDiagnosticHighlightingPass#addDiagnostic). This change passes both the original error named reference and the surrounding qualified access expression and defer the decision of which to use to the reporting logic. For unresolved reference and checks on `super` keyword, the position strategy should not highlight the surrounding parentheses. Hence a new position strategy `REFERENCED_NAME_BY_QUALIFIED` is added. In addition, this change also has the following side effect * some diagnostics are no longer reported when there is a syntax error since the higher level structure does not exist when there is a syntax error
This commit is contained in:
committed by
Dmitriy Novozhilov
parent
8805675539
commit
d6907222cd
+1
-1
@@ -63,7 +63,7 @@ fun case3() {
|
||||
*/
|
||||
fun case4(marker : Marker?) {
|
||||
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.foo; typeCall: function")!>foo(y=1)<!>
|
||||
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.invoke; typeCall: variable&invoke")!>foo(x=1)<!><!UNSAFE_CALL!>><!><!SYNTAX!><!>
|
||||
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.invoke; typeCall: variable&invoke")!>foo(x=1)<!>><!SYNTAX!><!>
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -63,7 +63,7 @@ fun case3() {
|
||||
*/
|
||||
fun case4(marker: Marker?) {
|
||||
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.foo; typeCall: function")!>foo(y = { 1 })<!>
|
||||
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.invoke; typeCall: variable&invoke")!>foo(x = { 1 })<!><!UNSAFE_CALL!>><!><!SYNTAX!><!>
|
||||
marker?.<!DEBUG_INFO_CALL("fqName: libPackage.Marker.invoke; typeCall: variable&invoke")!>foo(x = { 1 })<!>><!SYNTAX!><!>
|
||||
}
|
||||
|
||||
|
||||
|
||||
+4
-4
@@ -26,9 +26,9 @@ import LibPackCase1.b.*
|
||||
|
||||
fun case1 (){
|
||||
var b: B? = B()
|
||||
<!AMBIGUITY, DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b += { C() }<!>
|
||||
<!DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b <!AMBIGUITY!>+=<!> { C() }<!>
|
||||
|
||||
<!AMBIGUITY, DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b += {1}<!>
|
||||
<!DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b <!AMBIGUITY!>+=<!> {1}<!>
|
||||
}
|
||||
|
||||
class B {
|
||||
@@ -63,9 +63,9 @@ import LibPackCase2.b.*
|
||||
|
||||
fun case2 (){
|
||||
var b: B = B()
|
||||
<!AMBIGUITY, DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b += { C() }<!>
|
||||
<!DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b <!AMBIGUITY!>+=<!> { C() }<!>
|
||||
|
||||
<!AMBIGUITY, DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b += {1}<!>
|
||||
<!DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b <!AMBIGUITY!>+=<!> {1}<!>
|
||||
}
|
||||
|
||||
class B {
|
||||
|
||||
+2
-2
@@ -10,9 +10,9 @@ import LibPackCase1.a.*
|
||||
import LibPackCase1.b.*
|
||||
fun case1 (){
|
||||
var b: B? = null
|
||||
<!AMBIGUITY, DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b += { C() }<!>
|
||||
<!DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b <!AMBIGUITY!>+=<!> { C() }<!>
|
||||
|
||||
<!AMBIGUITY, DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b += {1}<!>
|
||||
<!DEBUG_INFO_CALL("fqName: fqName is unknown; typeCall: unresolved")!>b <!AMBIGUITY!>+=<!> {1}<!>
|
||||
}
|
||||
|
||||
class B {
|
||||
|
||||
+2
-2
@@ -15,9 +15,9 @@ import LibPackCase1.b.*
|
||||
|
||||
fun case1 (){
|
||||
var b: B? = B()
|
||||
<!AMBIGUITY!>b += { C() }<!>
|
||||
b <!AMBIGUITY!>+=<!> { C() }
|
||||
|
||||
<!AMBIGUITY!>b += {1}<!>
|
||||
b <!AMBIGUITY!>+=<!> {1}
|
||||
}
|
||||
|
||||
class B {
|
||||
|
||||
+2
-2
@@ -15,9 +15,9 @@ import LibPackCase1.b.plusAssign
|
||||
|
||||
fun case1 (){
|
||||
var b: B? = B()
|
||||
<!AMBIGUITY!>b += { C() }<!>
|
||||
b <!AMBIGUITY!>+=<!> { C() }
|
||||
|
||||
<!AMBIGUITY!>b += {1}<!>
|
||||
b <!AMBIGUITY!>+=<!> {1}
|
||||
}
|
||||
|
||||
class B {
|
||||
|
||||
+4
-4
@@ -15,8 +15,8 @@ import LibPackCase1.b.plusAssign
|
||||
|
||||
fun case1 (){
|
||||
var b: B = B()
|
||||
<!AMBIGUITY!>b +={ C() }<!>
|
||||
<!AMBIGUITY!>b +={ 1 }<!>
|
||||
b <!AMBIGUITY!>+=<!>{ C() }
|
||||
b <!AMBIGUITY!>+=<!>{ 1 }
|
||||
}
|
||||
|
||||
class B
|
||||
@@ -48,8 +48,8 @@ import LibPackCase2.b.plusAssign
|
||||
|
||||
fun case2 (){
|
||||
var b: B = B()
|
||||
<!AMBIGUITY!>b +={ C() }<!>
|
||||
<!AMBIGUITY!>b +={ 1 }<!>
|
||||
b <!AMBIGUITY!>+=<!>{ C() }
|
||||
b <!AMBIGUITY!>+=<!>{ 1 }
|
||||
|
||||
b.<!AMBIGUITY!>plusAssign<!>{ C() }
|
||||
}
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ operator fun I2.invoke(): String = TODO()
|
||||
fun case1(a: A) {
|
||||
a.<!AMBIGUITY!>invoke<!>()
|
||||
<!AMBIGUITY!>a<!>()
|
||||
<!AMBIGUITY!>A<!>()()
|
||||
<!AMBIGUITY!>A()<!>()
|
||||
}
|
||||
|
||||
// FILE: TestCase2.kt
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ operator fun <R>I2.invoke(): String = TODO()
|
||||
fun case1(a: A) {
|
||||
a.<!AMBIGUITY!>invoke<!>()
|
||||
<!AMBIGUITY!>a<!>()
|
||||
<!AMBIGUITY!>A<!>()()
|
||||
<!AMBIGUITY!>A()<!>()
|
||||
}
|
||||
|
||||
// FILE: TestCase2.kt
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
fun case_1() {
|
||||
var x: Int? = 11
|
||||
x!!
|
||||
try {x = null;} finally { <!UNRESOLVED_REFERENCE!><!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?")!>x<!> += 10<!>; }
|
||||
try {x = null;} finally { <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?")!>x<!> <!UNRESOLVED_REFERENCE!>+=<!> 10; }
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
|
||||
Reference in New Issue
Block a user