Fixing failed tests: do not report anything on casts that can never succeed
This commit is contained in:
+12
-12
@@ -221,21 +221,21 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
||||
if (!CastDiagnosticsUtil.isCastPossible(actualType, targetType, platformToKotlinClassMap)) {
|
||||
context.trace.report(CAST_NEVER_SUCCEEDS.on(expression.getOperationReference()));
|
||||
}
|
||||
|
||||
JetTypeChecker typeChecker = JetTypeChecker.INSTANCE;
|
||||
if (!typeChecker.isSubtypeOf(targetType, actualType)) {
|
||||
if (typeChecker.isSubtypeOf(actualType, targetType)) {
|
||||
context.trace.report(USELESS_CAST_STATIC_ASSERT_IS_FINE.on(expression.getOperationReference()));
|
||||
}
|
||||
}
|
||||
else {
|
||||
JetTypeChecker typeChecker = JetTypeChecker.INSTANCE;
|
||||
// Upcast?
|
||||
if (typeChecker.isSubtypeOf(actualType, targetType)) {
|
||||
context.trace.report(USELESS_CAST.on(expression.getOperationReference()));
|
||||
}
|
||||
else {
|
||||
if (CastDiagnosticsUtil.isCastErased(actualType, targetType, typeChecker)) {
|
||||
context.trace.report(Errors.UNCHECKED_CAST.on(expression, actualType, targetType));
|
||||
if (!typeChecker.isSubtypeOf(targetType, actualType)) {
|
||||
// proper upcast: String as Any
|
||||
context.trace.report(USELESS_CAST_STATIC_ASSERT_IS_FINE.on(expression.getOperationReference()));
|
||||
}
|
||||
else {
|
||||
// cast to itself: String as String
|
||||
context.trace.report(USELESS_CAST.on(expression.getOperationReference()));
|
||||
}
|
||||
}
|
||||
else if (CastDiagnosticsUtil.isCastErased(actualType, targetType, typeChecker)) {
|
||||
context.trace.report(Errors.UNCHECKED_CAST.on(expression, actualType, targetType));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ fun test(<!UNUSED_PARAMETER!>l<!> : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.util
|
||||
<!UNRESOLVED_REFERENCE!>List<!><Int>
|
||||
|
||||
|
||||
val <!UNUSED_VARIABLE!>o<!> = "sdf" <!CAST_NEVER_SUCCEEDS!>as<!> <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Object<!>
|
||||
val <!UNUSED_VARIABLE!>o<!> = "sdf" as <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Object<!>
|
||||
|
||||
try {
|
||||
// ...
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
|
||||
fun ff(c: MutableCollection<String>) = c <!CAST_NEVER_SUCCEEDS!>as<!> MutableList<Int>
|
||||
fun ff(c: MutableCollection<String>) = <!UNCHECKED_CAST!>c as MutableList<Int><!>
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ class MyProperty<R, T> {
|
||||
|
||||
public fun get(thisRef: R, desc: PropertyMetadata): T {
|
||||
println("get $thisRef ${desc.name}")
|
||||
return null <!CAST_NEVER_SUCCEEDS!>as<!> T
|
||||
return null as T
|
||||
}
|
||||
|
||||
public fun set(thisRef: R, desc: PropertyMetadata, value: T) {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// For KT-3491
|
||||
|
||||
fun <T: Any?> test1(t: Any?): Any {
|
||||
return t as T ?: ""
|
||||
return <!UNCHECKED_CAST!>t as T<!> ?: ""
|
||||
}
|
||||
|
||||
fun <T: Any> test2(t: Any?): Any {
|
||||
return <!USELESS_ELVIS!>t as T<!> ?: ""
|
||||
return <!UNCHECKED_CAST, USELESS_ELVIS!>t as T<!> ?: ""
|
||||
}
|
||||
|
||||
fun <T: Any?> test3(t: Any?): Any {
|
||||
|
||||
@@ -6,6 +6,6 @@ open class AL {
|
||||
|
||||
trait ALE<T> : AL {
|
||||
fun getOrNull(index: Int, value: T) : T {
|
||||
return get(index) as? T ?: value
|
||||
}
|
||||
return <!UNCHECKED_CAST!>get(index) as? T<!> ?: value
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
// KT-398 Internal error when property initializes with function
|
||||
|
||||
class X<T>() {
|
||||
val check = { (a : Any) -> a is T }
|
||||
val check = { (a : Any) -> a is <!CANNOT_CHECK_FOR_ERASED!>T<!> }
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
if(X<String>().check(10)) return "fail"
|
||||
if(!X<String>().check("lala")) return "fail"
|
||||
return "OK"
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
// KT-399 Type argument inference not implemented for CALL_EXPRESSION
|
||||
|
||||
fun <T> getSameTypeChecker(<!UNUSED_PARAMETER!>obj<!>: T) : Function1<Any,Boolean> {
|
||||
return { (a : Any) -> a is T }
|
||||
return { (a : Any) -> a is <!CANNOT_CHECK_FOR_ERASED!>T<!> }
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
if(getSameTypeChecker<String>("lala")(10)) return "fail"
|
||||
if(!getSameTypeChecker<String>("mama")("lala")) return "fail"
|
||||
return "OK"
|
||||
}
|
||||
}
|
||||
@@ -3,5 +3,5 @@
|
||||
class IdUnavailableException() : Exception() {}
|
||||
|
||||
fun <T : Any> T.getJavaClass() : Class<T> {
|
||||
return <!UNCHECKED_CAST!>((this <!CAST_NEVER_SUCCEEDS!>as<!> <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Object<!>).getClass()) as Class<T><!> // Some error here, because of Exception() used above. ?!!!
|
||||
return <!UNCHECKED_CAST!>((this as <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Object<!>).getClass()) as Class<T><!> // Some error here, because of Exception() used above. ?!!!
|
||||
}
|
||||
@@ -5,7 +5,7 @@ class TypeInfo<T>
|
||||
fun <T> typeinfo() : TypeInfo<T> = null <!CAST_NEVER_SUCCEEDS!>as<!> TypeInfo<T>
|
||||
|
||||
fun <T> TypeInfo<T>.getJavaClass() : java.lang.Class<T> {
|
||||
val t : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.Object<!> = this <!CAST_NEVER_SUCCEEDS!>as<!> <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.Object<!>
|
||||
val t : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.Object<!> = this as <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.Object<!>
|
||||
return <!UNCHECKED_CAST!>t.getClass() as java.lang.Class<T><!> // inferred type is Object but Serializable was expected
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ fun test(<warning>l</warning> : List<Int>) {
|
||||
<error>List</error><Int>
|
||||
|
||||
|
||||
val <warning>o</warning> = "sdf" <warning>as</warning> <warning>Object</warning>
|
||||
val <warning>o</warning> = "sdf" as <warning>Object</warning>
|
||||
|
||||
try {
|
||||
// ...
|
||||
|
||||
Reference in New Issue
Block a user