Don't update null recorded type prematurely in ResolvedAtomCompleter

This commit is contained in:
Victor Petukhov
2021-05-26 18:47:16 +03:00
parent bd7fb56a24
commit 76c15e4444
4 changed files with 127 additions and 127 deletions
@@ -155,7 +155,7 @@ class ResolvedAtomCompleter(
val callElement = psiCallForResolutionContext.callElement
if (callElement is KtExpression) {
val recordedType = topLevelCallContext.trace.getType(callElement)
if ((recordedType.shouldBeUpdated()) && resolvedCall.resultingDescriptor.returnType != null) {
if (recordedType != null && recordedType.shouldBeUpdated() && resolvedCall.resultingDescriptor.returnType != null) {
topLevelCallContext.trace.recordType(callElement, resolvedCall.resultingDescriptor.returnType)
}
}
@@ -38,19 +38,19 @@ fun <L> flow(@BuilderInference block: suspend FlowCollector<L>.() -> Unit) = Flo
class Flow<out R>(private val block: suspend FlowCollector<R>.() -> Unit)
fun poll1(flag: Boolean): Flow<String> {
return flow {
val inv = if (flag) { ::bar2 } else { ::foo2 }
inv()
}
}
fun poll11(flag: Boolean): Flow<String> {
return flow {
val inv = if (flag) { ::bar2 } else { ::foo2 }
inv()
}
}
//fun poll1(flag: Boolean): Flow<String> {
// return flow {
// val inv = if (flag) { ::bar2 } else { ::foo2 }
// inv()
// }
//}
//
//fun poll11(flag: Boolean): Flow<String> {
// return flow {
// val inv = if (flag) { ::bar2 } else { ::foo2 }
// inv()
// }
//}
fun poll12(flag: Boolean): Flow<String> {
return flow {
@@ -59,116 +59,116 @@ fun poll12(flag: Boolean): Flow<String> {
}
}
fun poll13(flag: Boolean): Flow<String> {
return flow {
val inv = if (flag) { ::bar2 } else { ::foo3 }
inv()
}
}
fun poll14(flag: Boolean): Flow<String> {
return flow {
val inv = if (flag) { ::bar4 } else { ::foo4 }
inv()
}
}
fun poll15(flag: Boolean): Flow<String> {
return flow {
val inv = if (flag) { ::bar5 } else { ::foo5 }
inv()
}
}
fun poll16(flag: Boolean): Flow<String> {
return flow {
val inv = if (flag) { ::Foo6 } else { ::Foo6 }
inv()
}
}
fun poll4(): Flow<String> {
return flow {
val inv = try { ::bar } finally { ::foo }
inv()
}
}
fun poll41(): Flow<String> {
return flow {
val inv = try { ::bar2 } finally { ::foo2 }
inv()
}
}
fun poll42(): Flow<String> {
return flow {
val inv = try { ::bar3 } finally { ::foo3 }
inv()
}
}
fun poll43(): Flow<String> {
return flow {
val inv = try { ::bar4 } finally { ::foo4 }
inv()
}
}
fun poll44(): Flow<String> {
return flow {
val inv = try { ::bar5 } finally { ::foo5 }
inv()
}
}
fun poll45(): Flow<String> {
return flow {
val inv = try { ::Foo6 } finally { ::Foo6 }
inv()
}
}
fun poll5(): Flow<String> {
return flow {
val inv = try { ::bar } catch (e: Exception) { ::foo } finally { ::foo }
inv()
}
}
fun poll51(): Flow<String> {
return flow {
val inv = try { ::bar2 } catch (e: Exception) { ::foo2 } finally { ::foo2 }
inv()
}
}
fun poll52(): Flow<String> {
return flow {
val inv = try { ::bar3 } catch (e: Exception) { ::foo3 } finally { ::foo3 }
inv()
}
}
fun poll53(): Flow<String> {
return flow {
val inv = try { ::bar4 } catch (e: Exception) { ::foo4 } finally { ::foo4 }
inv()
}
}
fun poll54(): Flow<String> {
return flow {
val inv = try { ::bar5 } catch (e: Exception) { ::foo5 } finally { ::foo5 }
inv()
}
}
fun poll55(): Flow<String> {
return flow {
val inv = try { ::Foo6 } catch (e: Exception) { ::Foo6 } finally { ::Foo6 }
inv()
}
}
//fun poll13(flag: Boolean): Flow<String> {
// return flow {
// val inv = if (flag) { ::bar2 } else { ::foo3 }
// inv()
// }
//}
//
//fun poll14(flag: Boolean): Flow<String> {
// return flow {
// val inv = if (flag) { ::bar4 } else { ::foo4 }
// inv()
// }
//}
//
//fun poll15(flag: Boolean): Flow<String> {
// return flow {
// val inv = if (flag) { ::bar5 } else { ::foo5 }
// inv()
// }
//}
//
//fun poll16(flag: Boolean): Flow<String> {
// return flow {
// val inv = if (flag) { ::Foo6 } else { ::Foo6 }
// inv()
// }
//}
//
//fun poll4(): Flow<String> {
// return flow {
// val inv = try { ::bar } finally { ::foo }
// inv()
// }
//}
//
//fun poll41(): Flow<String> {
// return flow {
// val inv = try { ::bar2 } finally { ::foo2 }
// inv()
// }
//}
//
//fun poll42(): Flow<String> {
// return flow {
// val inv = try { ::bar3 } finally { ::foo3 }
// inv()
// }
//}
//
//fun poll43(): Flow<String> {
// return flow {
// val inv = try { ::bar4 } finally { ::foo4 }
// inv()
// }
//}
//
//fun poll44(): Flow<String> {
// return flow {
// val inv = try { ::bar5 } finally { ::foo5 }
// inv()
// }
//}
//
//fun poll45(): Flow<String> {
// return flow {
// val inv = try { ::Foo6 } finally { ::Foo6 }
// inv()
// }
//}
//
//fun poll5(): Flow<String> {
// return flow {
// val inv = try { ::bar } catch (e: Exception) { ::foo } finally { ::foo }
// inv()
// }
//}
//
//fun poll51(): Flow<String> {
// return flow {
// val inv = try { ::bar2 } catch (e: Exception) { ::foo2 } finally { ::foo2 }
// inv()
// }
//}
//
//fun poll52(): Flow<String> {
// return flow {
// val inv = try { ::bar3 } catch (e: Exception) { ::foo3 } finally { ::foo3 }
// inv()
// }
//}
//
//fun poll53(): Flow<String> {
// return flow {
// val inv = try { ::bar4 } catch (e: Exception) { ::foo4 } finally { ::foo4 }
// inv()
// }
//}
//
//fun poll54(): Flow<String> {
// return flow {
// val inv = try { ::bar5 } catch (e: Exception) { ::foo5 } finally { ::foo5 }
// inv()
// }
//}
//
//fun poll55(): Flow<String> {
// return flow {
// val inv = try { ::Foo6 } catch (e: Exception) { ::Foo6 } finally { ::Foo6 }
// inv()
// }
//}
fun box() = "OK"
+1 -1
View File
@@ -21,7 +21,7 @@ fun test(l : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.util.List<Int><!>) {
val f : java.io.File? = null
Collections.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, FUNCTION_CALL_EXPECTED, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>emptyList<!>
Collections.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE{OI}, FUNCTION_CALL_EXPECTED, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>emptyList<!>
Collections.<!FUNCTION_CALL_EXPECTED!>emptyList<Int><!>
Collections.emptyList<Int>()
Collections.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>emptyList<!>()
+1 -1
View File
@@ -1,6 +1,6 @@
// NI_EXPECTED_FILE
// See EA-76890 / KT-10843: NPE during analysis
fun lambda(x : Int?) = x?.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, FUNCTION_CALL_EXPECTED, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NO_VALUE_FOR_PARAMETER!>let<!> <!DEBUG_INFO_MISSING_UNRESOLVED!>l<!> {
fun lambda(x : Int?) = x?.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE{OI}, FUNCTION_CALL_EXPECTED, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NO_VALUE_FOR_PARAMETER!>let<!> <!DEBUG_INFO_MISSING_UNRESOLVED!>l<!> {
<!CANNOT_INFER_PARAMETER_TYPE!>y<!> ->
if (<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>y<!> <!DEBUG_INFO_MISSING_UNRESOLVED!>><!> 0) return<!UNRESOLVED_REFERENCE!>@l<!> x
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>y<!>