Don't update null recorded type prematurely in ResolvedAtomCompleter
This commit is contained in:
+1
-1
@@ -155,7 +155,7 @@ class ResolvedAtomCompleter(
|
|||||||
val callElement = psiCallForResolutionContext.callElement
|
val callElement = psiCallForResolutionContext.callElement
|
||||||
if (callElement is KtExpression) {
|
if (callElement is KtExpression) {
|
||||||
val recordedType = topLevelCallContext.trace.getType(callElement)
|
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)
|
topLevelCallContext.trace.recordType(callElement, resolvedCall.resultingDescriptor.returnType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+124
-124
@@ -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)
|
class Flow<out R>(private val block: suspend FlowCollector<R>.() -> Unit)
|
||||||
|
|
||||||
fun poll1(flag: Boolean): Flow<String> {
|
//fun poll1(flag: Boolean): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = if (flag) { ::bar2 } else { ::foo2 }
|
// val inv = if (flag) { ::bar2 } else { ::foo2 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll11(flag: Boolean): Flow<String> {
|
//fun poll11(flag: Boolean): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = if (flag) { ::bar2 } else { ::foo2 }
|
// val inv = if (flag) { ::bar2 } else { ::foo2 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
fun poll12(flag: Boolean): Flow<String> {
|
fun poll12(flag: Boolean): Flow<String> {
|
||||||
return flow {
|
return flow {
|
||||||
@@ -59,116 +59,116 @@ fun poll12(flag: Boolean): Flow<String> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun poll13(flag: Boolean): Flow<String> {
|
//fun poll13(flag: Boolean): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = if (flag) { ::bar2 } else { ::foo3 }
|
// val inv = if (flag) { ::bar2 } else { ::foo3 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll14(flag: Boolean): Flow<String> {
|
//fun poll14(flag: Boolean): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = if (flag) { ::bar4 } else { ::foo4 }
|
// val inv = if (flag) { ::bar4 } else { ::foo4 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll15(flag: Boolean): Flow<String> {
|
//fun poll15(flag: Boolean): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = if (flag) { ::bar5 } else { ::foo5 }
|
// val inv = if (flag) { ::bar5 } else { ::foo5 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll16(flag: Boolean): Flow<String> {
|
//fun poll16(flag: Boolean): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = if (flag) { ::Foo6 } else { ::Foo6 }
|
// val inv = if (flag) { ::Foo6 } else { ::Foo6 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll4(): Flow<String> {
|
//fun poll4(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::bar } finally { ::foo }
|
// val inv = try { ::bar } finally { ::foo }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll41(): Flow<String> {
|
//fun poll41(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::bar2 } finally { ::foo2 }
|
// val inv = try { ::bar2 } finally { ::foo2 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll42(): Flow<String> {
|
//fun poll42(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::bar3 } finally { ::foo3 }
|
// val inv = try { ::bar3 } finally { ::foo3 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll43(): Flow<String> {
|
//fun poll43(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::bar4 } finally { ::foo4 }
|
// val inv = try { ::bar4 } finally { ::foo4 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll44(): Flow<String> {
|
//fun poll44(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::bar5 } finally { ::foo5 }
|
// val inv = try { ::bar5 } finally { ::foo5 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll45(): Flow<String> {
|
//fun poll45(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::Foo6 } finally { ::Foo6 }
|
// val inv = try { ::Foo6 } finally { ::Foo6 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll5(): Flow<String> {
|
//fun poll5(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::bar } catch (e: Exception) { ::foo } finally { ::foo }
|
// val inv = try { ::bar } catch (e: Exception) { ::foo } finally { ::foo }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll51(): Flow<String> {
|
//fun poll51(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::bar2 } catch (e: Exception) { ::foo2 } finally { ::foo2 }
|
// val inv = try { ::bar2 } catch (e: Exception) { ::foo2 } finally { ::foo2 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll52(): Flow<String> {
|
//fun poll52(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::bar3 } catch (e: Exception) { ::foo3 } finally { ::foo3 }
|
// val inv = try { ::bar3 } catch (e: Exception) { ::foo3 } finally { ::foo3 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll53(): Flow<String> {
|
//fun poll53(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::bar4 } catch (e: Exception) { ::foo4 } finally { ::foo4 }
|
// val inv = try { ::bar4 } catch (e: Exception) { ::foo4 } finally { ::foo4 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll54(): Flow<String> {
|
//fun poll54(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::bar5 } catch (e: Exception) { ::foo5 } finally { ::foo5 }
|
// val inv = try { ::bar5 } catch (e: Exception) { ::foo5 } finally { ::foo5 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
fun poll55(): Flow<String> {
|
//fun poll55(): Flow<String> {
|
||||||
return flow {
|
// return flow {
|
||||||
val inv = try { ::Foo6 } catch (e: Exception) { ::Foo6 } finally { ::Foo6 }
|
// val inv = try { ::Foo6 } catch (e: Exception) { ::Foo6 } finally { ::Foo6 }
|
||||||
inv()
|
// inv()
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
fun box() = "OK"
|
fun box() = "OK"
|
||||||
+1
-1
@@ -21,7 +21,7 @@ fun test(l : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.util.List<Int><!>) {
|
|||||||
|
|
||||||
val f : java.io.File? = null
|
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.<!FUNCTION_CALL_EXPECTED!>emptyList<Int><!>
|
||||||
Collections.emptyList<Int>()
|
Collections.emptyList<Int>()
|
||||||
Collections.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>emptyList<!>()
|
Collections.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>emptyList<!>()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// NI_EXPECTED_FILE
|
// NI_EXPECTED_FILE
|
||||||
// See EA-76890 / KT-10843: NPE during analysis
|
// 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<!> ->
|
<!CANNOT_INFER_PARAMETER_TYPE!>y<!> ->
|
||||||
if (<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>y<!> <!DEBUG_INFO_MISSING_UNRESOLVED!>><!> 0) return<!UNRESOLVED_REFERENCE!>@l<!> x
|
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<!>
|
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>y<!>
|
||||||
|
|||||||
Reference in New Issue
Block a user