Do not show warning about useless elvis for error function types
#KT-17214 Fixed #KT-12112 Fixed
This commit is contained in:
+5
-1
@@ -892,7 +892,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
return baseTypeInfo;
|
return baseTypeInfo;
|
||||||
}
|
}
|
||||||
DataFlowInfo dataFlowInfo = baseTypeInfo.getDataFlowInfo();
|
DataFlowInfo dataFlowInfo = baseTypeInfo.getDataFlowInfo();
|
||||||
if (isKnownToBeNotNull(baseExpression, baseType, context) && (!baseType.isError() || ErrorUtils.isUninferredParameter(baseType))) {
|
if (isKnownToBeNotNull(baseExpression, baseType, context)) {
|
||||||
context.trace.report(UNNECESSARY_NOT_NULL_ASSERTION.on(operationSign, TypeUtils.makeNotNullable(baseType)));
|
context.trace.report(UNNECESSARY_NOT_NULL_ASSERTION.on(operationSign, TypeUtils.makeNotNullable(baseType)));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -935,12 +935,16 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
return facade.getTypeInfo(baseExpression, context, isStatement);
|
return facade.getTypeInfo(baseExpression, context, isStatement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns `true` if warnings should be reported for left-hand side of elvis and not-null (!!) assertion
|
||||||
private static boolean isKnownToBeNotNull(
|
private static boolean isKnownToBeNotNull(
|
||||||
@NotNull KtExpression expression,
|
@NotNull KtExpression expression,
|
||||||
@Nullable KotlinType ktType,
|
@Nullable KotlinType ktType,
|
||||||
@NotNull ExpressionTypingContext context
|
@NotNull ExpressionTypingContext context
|
||||||
) {
|
) {
|
||||||
if (ktType == null) return false;
|
if (ktType == null) return false;
|
||||||
|
|
||||||
|
if (ktType.isError() && !ErrorUtils.isUninferredParameter(ktType)) return false;
|
||||||
|
|
||||||
if (!TypeUtils.isNullableType(ktType)) return true;
|
if (!TypeUtils.isNullableType(ktType)) return true;
|
||||||
|
|
||||||
DataFlowValue dataFlowValue = createDataFlowValue(expression, ktType, context);
|
DataFlowValue dataFlowValue = createDataFlowValue(expression, ktType, context);
|
||||||
|
|||||||
@@ -35,10 +35,14 @@ fun test() {
|
|||||||
takeNotNull(dependOn(dependOn(x)) <!USELESS_ELVIS!>?: ""<!>)
|
takeNotNull(dependOn(dependOn(x)) <!USELESS_ELVIS!>?: ""<!>)
|
||||||
takeNotNull(dependOn(dependOn(x) <!USELESS_CAST!>as? String<!>) ?: "")
|
takeNotNull(dependOn(dependOn(x) <!USELESS_CAST!>as? String<!>) ?: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
takeNotNull(bar()!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <reified T : Any> reifiedNull(): T? = null
|
inline fun <reified T : Any> reifiedNull(): T? = null
|
||||||
|
|
||||||
fun testFrom13648() {
|
fun testFrom13648() {
|
||||||
takeNotNull(reifiedNull() ?: "")
|
takeNotNull(reifiedNull() ?: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun bar() = <!UNRESOLVED_REFERENCE!>unresolved<!>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
|
public fun bar(): [ERROR : Error function type]
|
||||||
public fun </*0*/ T> dependOn(/*0*/ x: T): T
|
public fun </*0*/ T> dependOn(/*0*/ x: T): T
|
||||||
public fun </*0*/ T> notNull(): T
|
public fun </*0*/ T> notNull(): T
|
||||||
public fun </*0*/ T> nullable(): T?
|
public fun </*0*/ T> nullable(): T?
|
||||||
|
|||||||
+1
@@ -61,6 +61,7 @@ fun test() {
|
|||||||
takeNotNull(J.getNAny() ?: J())
|
takeNotNull(J.getNAny() ?: J())
|
||||||
|
|
||||||
val x = <!UNRESOLVED_REFERENCE!>unresolved<!> ?: null
|
val x = <!UNRESOLVED_REFERENCE!>unresolved<!> ?: null
|
||||||
|
<!UNREACHABLE_CODE!>val y =<!> <!UNRESOLVED_REFERENCE!>unresolved<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>foo<!> ?: return
|
||||||
}
|
}
|
||||||
|
|
||||||
fun takeNotNull(s: J) {}
|
fun takeNotNull(s: J) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user