Skip to content

Commit 6f6e37f

Browse files
demiurg906Space Team
authored andcommitted
[FIR] Report about recursion in implicit types for receivers of invoke
^KT-65576 Fixed
1 parent 234cc5b commit 6f6e37f

File tree

4 files changed

+32
-28
lines changed

4 files changed

+32
-28
lines changed

compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.*
1717
import org.jetbrains.kotlin.fir.resolve.calls.*
1818
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConePropertyAsOperator
1919
import org.jetbrains.kotlin.fir.symbols.impl.*
20-
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
21-
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
22-
import org.jetbrains.kotlin.fir.types.isExtensionFunctionType
23-
import org.jetbrains.kotlin.fir.types.typeApproximator
20+
import org.jetbrains.kotlin.fir.types.*
2421
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
2522
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability
2623
import org.jetbrains.kotlin.types.AbstractTypeChecker
@@ -317,15 +314,22 @@ private fun BodyResolveComponents.createExplicitReceiverForInvokeByCallable(
317314
): FirExpression {
318315
return FirPropertyAccessExpressionBuilder().apply {
319316
val fakeSource = info.fakeSourceForImplicitInvokeCallReceiver
317+
val returnTypeRef = returnTypeCalculator.tryCalculateReturnType(symbol.fir)
320318
calleeReference = when {
319+
returnTypeRef is FirErrorTypeRef -> FirErrorReferenceWithCandidate(
320+
fakeSource, symbol.callableId.callableName, candidate, returnTypeRef.diagnostic,
321+
)
322+
321323
candidate.isSuccessful -> FirNamedReferenceWithCandidate(fakeSource, symbol.callableId.callableName, candidate)
324+
322325
else -> FirErrorReferenceWithCandidate(
323326
fakeSource, symbol.callableId.callableName, candidate,
324327
createConeDiagnosticForCandidateWithError(candidate.applicability, candidate),
325328
)
326329
}
327330
dispatchReceiver = candidate.dispatchReceiverExpression()
328-
coneTypeOrNull = returnTypeCalculator.tryCalculateReturnType(symbol.fir).type
331+
332+
coneTypeOrNull = returnTypeRef.type
329333

330334
if (!invokeBuiltinExtensionMode) {
331335
extensionReceiver = extensionReceiverExpression

compiler/testData/diagnostics/tests/delegation/kt44843.fir.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
// WITH_STDLIB
22

33
// FILE: test.kt
4-
val bar2 by <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar2<!><!NO_VALUE_FOR_PARAMETER!>()<!>
4+
val bar2 by <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, RECURSION_IN_IMPLICIT_TYPES!>bar2<!><!NO_VALUE_FOR_PARAMETER!>()<!>
55

66
// FILE: lt/neworld/compiler/Foo.kt
77
package lt.neworld.compiler
88

99
class Foo {
10-
val bar by <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!><!NO_VALUE_FOR_PARAMETER!>()<!>
10+
val bar by <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, RECURSION_IN_IMPLICIT_TYPES!>bar<!><!NO_VALUE_FOR_PARAMETER!>()<!>
1111
}
1212

1313
// FILE: lt/neworld/compiler/bar/Bar.kt

compiler/testData/diagnostics/tests/inference/specialCallsWithCallableReferences.fir.kt

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ fun poll11(flag: Boolean) {
3535

3636
fun poll12(flag: Boolean) {
3737
val inv = if (flag) { ::<!UNRESOLVED_REFERENCE!>bar3<!> } else { ::<!UNRESOLVED_REFERENCE!>foo3<!> }
38-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
38+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
3939
}
4040

4141
fun poll13(flag: Boolean) {
@@ -45,12 +45,12 @@ fun poll13(flag: Boolean) {
4545

4646
fun poll14(flag: Boolean) {
4747
val inv = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>if (flag) { ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar4<!> } else { ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo4<!> }<!>
48-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
48+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
4949
}
5050

5151
fun poll15(flag: Boolean) {
5252
val inv = if (flag) { ::<!UNRESOLVED_REFERENCE!>bar5<!> } else { ::<!UNRESOLVED_REFERENCE!>foo5<!> }
53-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
53+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
5454
}
5555

5656
fun poll16(flag: Boolean) {
@@ -65,7 +65,7 @@ fun poll17(flag: Boolean) {
6565

6666
fun poll2(flag: Boolean) {
6767
val inv = when (flag) { true -> ::<!UNRESOLVED_REFERENCE!>bar<!> else -> ::<!UNRESOLVED_REFERENCE!>foo<!> }
68-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
68+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
6969
}
7070

7171
fun poll21(flag: Boolean) {
@@ -75,12 +75,12 @@ fun poll21(flag: Boolean) {
7575

7676
fun poll22(flag: Boolean) {
7777
val inv = when (flag) { true -> ::<!UNRESOLVED_REFERENCE!>bar3<!> else -> ::<!UNRESOLVED_REFERENCE!>foo3<!> }
78-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
78+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
7979
}
8080

8181
fun poll23(flag: Boolean) {
8282
val inv = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>when (flag) { true -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar4<!> else -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo4<!> }<!>
83-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
83+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
8484
}
8585

8686
fun poll24(flag: Boolean) {
@@ -100,7 +100,7 @@ fun poll26(flag: Boolean) {
100100

101101
fun poll3(flag: Boolean) {
102102
val inv = when (flag) { true -> ::<!UNRESOLVED_REFERENCE!>bar<!> false -> ::<!UNRESOLVED_REFERENCE!>foo<!> }
103-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
103+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
104104
}
105105

106106
fun poll31(flag: Boolean) {
@@ -110,12 +110,12 @@ fun poll31(flag: Boolean) {
110110

111111
fun poll32(flag: Boolean) {
112112
val inv = when (flag) { true -> ::<!UNRESOLVED_REFERENCE!>bar3<!> false -> ::<!UNRESOLVED_REFERENCE!>foo3<!> }
113-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
113+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
114114
}
115115

116116
fun poll33(flag: Boolean) {
117117
val inv = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>when (flag) { true -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar4<!> false -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo4<!> }<!>
118-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
118+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
119119
}
120120

121121
fun poll34(flag: Boolean) {
@@ -135,7 +135,7 @@ fun poll36(flag: Boolean) {
135135

136136
fun poll4() {
137137
val inv = try { ::<!UNRESOLVED_REFERENCE!>bar<!> } finally { ::<!UNRESOLVED_REFERENCE!>foo<!> }
138-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
138+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
139139
}
140140

141141
fun poll41() {
@@ -145,17 +145,17 @@ fun poll41() {
145145

146146
fun poll42() {
147147
val inv = try { ::<!UNRESOLVED_REFERENCE!>bar3<!> } finally { ::<!UNRESOLVED_REFERENCE!>foo3<!> }
148-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
148+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
149149
}
150150

151151
fun poll43() {
152152
val inv = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>try { ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar4<!> } finally { ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo4<!> }<!>
153-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
153+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
154154
}
155155

156156
fun poll44() {
157157
val inv = try { ::<!UNRESOLVED_REFERENCE!>bar5<!> } finally { ::<!UNRESOLVED_REFERENCE!>foo5<!> }
158-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
158+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
159159
}
160160

161161
fun poll45() {
@@ -170,7 +170,7 @@ fun poll46() {
170170

171171
fun poll5() {
172172
val inv = try { ::<!UNRESOLVED_REFERENCE!>bar<!> } catch (e: Exception) { ::<!UNRESOLVED_REFERENCE!>foo<!> } finally { ::<!UNRESOLVED_REFERENCE!>foo<!> }
173-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
173+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
174174
}
175175

176176
fun poll51() {
@@ -180,17 +180,17 @@ fun poll51() {
180180

181181
fun poll52() {
182182
val inv = try { ::<!UNRESOLVED_REFERENCE!>bar3<!> } catch (e: Exception) { ::<!UNRESOLVED_REFERENCE!>foo3<!> } finally { ::<!UNRESOLVED_REFERENCE!>foo3<!> }
183-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
183+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
184184
}
185185

186186
fun poll53() {
187187
val inv = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>try { ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar4<!> } catch (e: Exception) { ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo4<!> } finally { ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo4<!> }<!>
188-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
188+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
189189
}
190190

191191
fun poll54() {
192192
val inv = try { ::<!UNRESOLVED_REFERENCE!>bar5<!> } catch (e: Exception) { ::<!UNRESOLVED_REFERENCE!>foo5<!> } finally { ::<!UNRESOLVED_REFERENCE!>foo5<!> }
193-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
193+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
194194
}
195195

196196
fun poll55() {
@@ -240,7 +240,7 @@ fun poll66() {
240240

241241
fun poll7() {
242242
val inv = ::<!UNRESOLVED_REFERENCE!>bar<!><!NOT_NULL_ASSERTION_ON_CALLABLE_REFERENCE!>!!<!>
243-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
243+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
244244
}
245245

246246
fun poll71() {
@@ -250,7 +250,7 @@ fun poll71() {
250250

251251
fun poll72() {
252252
val inv = ::<!UNRESOLVED_REFERENCE!>bar3<!><!NOT_NULL_ASSERTION_ON_CALLABLE_REFERENCE!>!!<!>
253-
inv<!NO_VALUE_FOR_PARAMETER!>()<!>
253+
<!CANNOT_INFER_PARAMETER_TYPE!>inv<!><!NO_VALUE_FOR_PARAMETER!>()<!>
254254
}
255255

256256
fun poll73() {

compiler/testData/diagnostics/tests/operatorsOverloading/implicitInvokeOnPropertyInItsInitializer.fir.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ fun foo(): Int = 0
55
object Implicit {
66
operator fun Any.invoke(): String = "Fail"
77

8-
val foo = foo()
8+
val foo = <!RECURSION_IN_IMPLICIT_TYPES!>foo<!>()
99
}
1010

1111
object Explicit {
@@ -27,7 +27,7 @@ object ImplicitIndirect {
2727

2828
val foo get() = bar()
2929
val bar get() = baz()
30-
val baz get() = foo()
30+
val baz get() = <!RECURSION_IN_IMPLICIT_TYPES!>foo<!>()
3131
}
3232

3333
fun takeInt(x: Int) {}

0 commit comments

Comments
 (0)