Reduce highlighting range for UNCHECKED_CAST

#KT-18985 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2017-07-28 16:41:21 +03:00
parent 8f8143d3ed
commit ae3497c6ce
21 changed files with 41 additions and 41 deletions
@@ -830,7 +830,7 @@ public interface Errors {
// Casts and is-checks // Casts and is-checks
DiagnosticFactory1<KtElement, KotlinType> CANNOT_CHECK_FOR_ERASED = DiagnosticFactory1.create(ERROR); DiagnosticFactory1<KtElement, KotlinType> CANNOT_CHECK_FOR_ERASED = DiagnosticFactory1.create(ERROR);
DiagnosticFactory2<KtBinaryExpressionWithTypeRHS, KotlinType, KotlinType> UNCHECKED_CAST = DiagnosticFactory2.create(WARNING); DiagnosticFactory2<KtBinaryExpressionWithTypeRHS, KotlinType, KotlinType> UNCHECKED_CAST = DiagnosticFactory2.create(WARNING, AS_TYPE);
DiagnosticFactory0<KtBinaryExpressionWithTypeRHS> USELESS_CAST = DiagnosticFactory0.create(WARNING, AS_TYPE); DiagnosticFactory0<KtBinaryExpressionWithTypeRHS> USELESS_CAST = DiagnosticFactory0.create(WARNING, AS_TYPE);
DiagnosticFactory0<KtSimpleNameExpression> CAST_NEVER_SUCCEEDS = DiagnosticFactory0.create(WARNING); DiagnosticFactory0<KtSimpleNameExpression> CAST_NEVER_SUCCEEDS = DiagnosticFactory0.create(WARNING);
+1 -1
View File
@@ -43,7 +43,7 @@ typealias ArrayOfEnumEntry = Array<Color.<!ENUM_ENTRY_AS_TYPE!>RED<!>>
typealias ArrayOfEnumEntryAlias = Array<RedAlias> typealias ArrayOfEnumEntryAlias = Array<RedAlias>
fun <T> bar(a: Any): T = <!UNCHECKED_CAST!>a as T<!> fun <T> bar(a: Any): T = a <!UNCHECKED_CAST!>as T<!>
fun <T> foo() { fun <T> foo() {
foo<Color.<!ENUM_ENTRY_AS_TYPE!>RED<!>>() foo<Color.<!ENUM_ENTRY_AS_TYPE!>RED<!>>()
+1 -1
View File
@@ -1 +1 @@
fun f(x: Any) = <!UNCHECKED_CAST!>x as Array<String><!> fun f(x: Any) = x <!UNCHECKED_CAST!>as Array<String><!>
+1 -1
View File
@@ -1,2 +1,2 @@
fun ff(c: MutableCollection<String>) = <!UNCHECKED_CAST!>c as MutableList<Int><!> fun ff(c: MutableCollection<String>) = c <!UNCHECKED_CAST!>as MutableList<Int><!>
@@ -1,2 +1,2 @@
fun ff(a: Any) = <!UNCHECKED_CAST!>a as MutableList<String><!> fun ff(a: Any) = a <!UNCHECKED_CAST!>as MutableList<String><!>
@@ -3,7 +3,7 @@
class Class<T>(val name: String, val instance: T) class Class<T>(val name: String, val instance: T)
fun <T> test(clazz: Class<T>) { fun <T> test(clazz: Class<T>) {
println((<!UNCHECKED_CAST!>clazz as Class<Any><!>).name) println((clazz <!UNCHECKED_CAST!>as Class<Any><!>).name)
} }
fun use() { fun use() {
@@ -12,22 +12,22 @@ fun use() {
fun checkArrays(): Array<Any> { fun checkArrays(): Array<Any> {
val someArray = arrayOfNulls<Any>(5) val someArray = arrayOfNulls<Any>(5)
<!UNCHECKED_CAST!>someArray as Array<Int><!> someArray <!UNCHECKED_CAST!>as Array<Int><!>
return <!UNCHECKED_CAST!>someArray as Array<Any><!> return someArray <!UNCHECKED_CAST!>as Array<Any><!>
} }
class Wrapper<T>(val x: T) class Wrapper<T>(val x: T)
fun checkArrays2(): Array<Wrapper<String>> { fun checkArrays2(): Array<Wrapper<String>> {
val someArray = arrayOf(Wrapper(1), Wrapper(2)) val someArray = arrayOf(Wrapper(1), Wrapper(2))
return <!UNCHECKED_CAST!>someArray as Array<Wrapper<String>><!> return someArray <!UNCHECKED_CAST!>as Array<Wrapper<String>><!>
} }
fun checkArrays3() { fun checkArrays3() {
val someArray = arrayOfNulls<String>(1) val someArray = arrayOfNulls<String>(1)
<!UNCHECKED_CAST!>someArray as Array<Any><!> someArray <!UNCHECKED_CAST!>as Array<Any><!>
val intArray = arrayOfNulls<Int>(1) val intArray = arrayOfNulls<Int>(1)
<!UNCHECKED_CAST!>intArray as Array<Any><!> intArray <!UNCHECKED_CAST!>as Array<Any><!>
} }
fun println(s: String) = s fun println(s: String) = s
@@ -10,9 +10,9 @@ fun <T, S : T> test(x: T?, y: S, z: T) {
<!USELESS_IS_CHECK!>z is T<!> <!USELESS_IS_CHECK!>z is T<!>
<!USELESS_IS_CHECK!>z is T?<!> <!USELESS_IS_CHECK!>z is T?<!>
<!UNCHECKED_CAST!>null as T<!> null <!UNCHECKED_CAST!>as T<!>
null <!USELESS_CAST!>as T?<!> null <!USELESS_CAST!>as T?<!>
<!UNCHECKED_CAST!>null as S<!> null <!UNCHECKED_CAST!>as S<!>
} }
inline fun <reified T> test(x: T?) { inline fun <reified T> test(x: T?) {
@@ -25,7 +25,7 @@ class MyProperty<R, T> {
operator fun getValue(thisRef: R, desc: KProperty<*>): T { operator fun getValue(thisRef: R, desc: KProperty<*>): T {
println("get $thisRef ${desc.name}") println("get $thisRef ${desc.name}")
return <!UNCHECKED_CAST!>null as T<!> return null <!UNCHECKED_CAST!>as T<!>
} }
operator fun setValue(thisRef: R, desc: KProperty<*>, value: T) { operator fun setValue(thisRef: R, desc: KProperty<*>, value: T) {
@@ -6,11 +6,11 @@ fun <E> foo(x: Any, y: Any) : Any {
} }
if (1 == 2) { if (1 == 2) {
<!UNCHECKED_CAST!>x as C<!> x <!UNCHECKED_CAST!>as C<!>
} }
if (2 == 3) { if (2 == 3) {
<!UNCHECKED_CAST!>x as? C<!> x <!UNCHECKED_CAST!>as? C<!>
} }
class Outer<F> { class Outer<F> {
@@ -22,7 +22,7 @@ fun <E> foo(x: Any, y: Any) : Any {
return y return y
} }
<!UNCHECKED_CAST!>y as Outer<*>.Inner<!> y <!UNCHECKED_CAST!>as Outer<*>.Inner<!>
return C() return C()
} }
@@ -5,7 +5,7 @@ import java.util.HashMap
public inline fun <K,V1, V: V1> Map<K,V>.getOrElse1(key: K, defaultValue: ()-> V1) : V1 { public inline fun <K,V1, V: V1> Map<K,V>.getOrElse1(key: K, defaultValue: ()-> V1) : V1 {
if (this.containsKey(key)) { if (this.containsKey(key)) {
return <!UNCHECKED_CAST!>this.get(key) as V<!> return this.get(key) <!UNCHECKED_CAST!>as V<!>
} else { } else {
return defaultValue() return defaultValue()
} }
+2 -2
View File
@@ -26,7 +26,7 @@ fun <T> testMutableCollection(c: MutableCollection<T>, t: T) {
val <!UNUSED_VARIABLE!>mutableIterator<!>: MutableIterator<T> = c.iterator() val <!UNUSED_VARIABLE!>mutableIterator<!>: MutableIterator<T> = c.iterator()
c.add(t) c.add(t)
c.remove(<!UNCHECKED_CAST!>1 as T<!>) c.remove(1 <!UNCHECKED_CAST!>as T<!>)
c.addAll(c) c.addAll(c)
c.removeAll(c) c.removeAll(c)
c.retainAll(c) c.retainAll(c)
@@ -84,7 +84,7 @@ fun <T> testMutableSet(s: MutableSet<T>, t: T) {
val <!UNUSED_VARIABLE!>mutableIterator<!>: MutableIterator<T> = s.iterator() val <!UNUSED_VARIABLE!>mutableIterator<!>: MutableIterator<T> = s.iterator()
s.add(t) s.add(t)
s.remove(<!UNCHECKED_CAST!>1 as T<!>) s.remove(1 <!UNCHECKED_CAST!>as T<!>)
s.addAll(s) s.addAll(s)
s.removeAll(s) s.removeAll(s)
s.retainAll(s) s.retainAll(s)
@@ -1,11 +1,11 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER, -SENSELESS_COMPARISON, -DEBUG_INFO_SMARTCAST // !DIAGNOSTICS: -UNUSED_PARAMETER, -SENSELESS_COMPARISON, -DEBUG_INFO_SMARTCAST
fun <T: Any?> test1(t: Any?): Any { fun <T: Any?> test1(t: Any?): Any {
return <!UNCHECKED_CAST!>t as T<!> ?: "" return t <!UNCHECKED_CAST!>as T<!> ?: ""
} }
fun <T: Any> test2(t: Any?): Any { fun <T: Any> test2(t: Any?): Any {
return <!UNCHECKED_CAST!>t as T<!> <!USELESS_ELVIS!>?: ""<!> return t <!UNCHECKED_CAST!>as T<!> <!USELESS_ELVIS!>?: ""<!>
} }
fun <T: Any?> test3(t: Any?): Any { fun <T: Any?> test3(t: Any?): Any {
@@ -27,7 +27,7 @@ fun main(
// Lists // Lists
a.foo(<!JAVA_TYPE_MISMATCH!>ml<!>) a.foo(<!JAVA_TYPE_MISMATCH!>ml<!>)
a.foo(l) a.foo(l)
a.foo(<!UNCHECKED_CAST!>ml as MutableList<Any><!>) a.foo(ml <!UNCHECKED_CAST!>as MutableList<Any><!>)
a.foo(l as List<Any>) a.foo(l as List<Any>)
// Iterables // Iterables
@@ -43,25 +43,25 @@ fun main(
// Sets // Sets
a.foo(<!JAVA_TYPE_MISMATCH!>ms<!>) a.foo(<!JAVA_TYPE_MISMATCH!>ms<!>)
a.foo(s) a.foo(s)
a.foo(<!UNCHECKED_CAST!>ms as MutableSet<Any><!>) a.foo(ms <!UNCHECKED_CAST!>as MutableSet<Any><!>)
a.foo(s as Set<Any>) a.foo(s as Set<Any>)
// Maps // Maps
a.foo(<!JAVA_TYPE_MISMATCH!>mm<!>) a.foo(<!JAVA_TYPE_MISMATCH!>mm<!>)
a.foo(m) a.foo(m)
a.foo(<!UNCHECKED_CAST!>mm as MutableMap<Any, Any><!>) a.foo(mm <!UNCHECKED_CAST!>as MutableMap<Any, Any><!>)
a.foo(m as Map<Any, Any>) a.foo(m as Map<Any, Any>)
// Map entries // Map entries
a.foo(<!JAVA_TYPE_MISMATCH!>mme<!>) a.foo(<!JAVA_TYPE_MISMATCH!>mme<!>)
a.foo(me) a.foo(me)
a.foo(<!UNCHECKED_CAST!>mme as MutableMap.MutableEntry<Any, Any><!>) a.foo(mme <!UNCHECKED_CAST!>as MutableMap.MutableEntry<Any, Any><!>)
a.foo(me as Map.Entry<Any, Any>) a.foo(me as Map.Entry<Any, Any>)
// Lists of lists // Lists of lists
a.foo(<!JAVA_TYPE_MISMATCH!>mll<!>) a.foo(<!JAVA_TYPE_MISMATCH!>mll<!>)
a.foo(ll) a.foo(ll)
a.foo(<!UNCHECKED_CAST!>mll as MutableList<MutableList<Any>><!>) a.foo(mll <!UNCHECKED_CAST!>as MutableList<MutableList<Any>><!>)
a.foo(ll as List<List<Any>>) a.foo(ll as List<List<Any>>)
} }
@@ -11,6 +11,6 @@ public class A {
fun main(a: A, ml: Any) { fun main(a: A, ml: Any) {
if (ml is <!CANNOT_CHECK_FOR_ERASED!>MutableList<String><!>) { if (ml is <!CANNOT_CHECK_FOR_ERASED!>MutableList<String><!>) {
a.foo(<!JAVA_TYPE_MISMATCH, DEBUG_INFO_SMARTCAST!>ml<!>) a.foo(<!JAVA_TYPE_MISMATCH, DEBUG_INFO_SMARTCAST!>ml<!>)
a.foo(<!UNCHECKED_CAST!>ml as List<Any><!>) a.foo(ml <!UNCHECKED_CAST!>as List<Any><!>)
} }
} }
+3 -3
View File
@@ -5,7 +5,7 @@ open class AL {
} }
interface ALE<T> : <!INTERFACE_WITH_SUPERCLASS!>AL<!> { interface ALE<T> : <!INTERFACE_WITH_SUPERCLASS!>AL<!> {
fun getOrNull(index: Int, value: T) : T { fun getOrNull(index: Int, value: T) : T {
return <!UNCHECKED_CAST!>get(index) as? T<!> ?: value return get(index) <!UNCHECKED_CAST!>as? T<!> ?: value
} }
} }
+1 -1
View File
@@ -3,5 +3,5 @@
class IdUnavailableException() : Exception() {} class IdUnavailableException() : Exception() {}
fun <T : Any> T.getJavaClass() : Class<T> { fun <T : Any> T.getJavaClass() : Class<T> {
return <!UNCHECKED_CAST!>((this as <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Object<!>).getClass()) as Class<T><!> // Some error here, because of Exception() used above. ?!!! return ((this as <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Object<!>).getClass()) <!UNCHECKED_CAST!>as Class<T><!> // Some error here, because of Exception() used above. ?!!!
} }
+1 -1
View File
@@ -6,7 +6,7 @@ fun <T> typeinfo() : TypeInfo<T> = null <!CAST_NEVER_SUCCEEDS!>as<!> TypeInfo<T>
fun <T> TypeInfo<T>.getJavaClass() : java.lang.Class<T> { fun <T> TypeInfo<T>.getJavaClass() : java.lang.Class<T> {
val t : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.Object<!> = this 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 return t.getClass() <!UNCHECKED_CAST!>as java.lang.Class<T><!> // inferred type is Object but Serializable was expected
} }
fun <T> getJavaClass() = typeinfo<T>().getJavaClass() fun <T> getJavaClass() = typeinfo<T>().getJavaClass()
+2 -2
View File
@@ -3,12 +3,12 @@
class Qwe<T : Any>(val a: T?) { class Qwe<T : Any>(val a: T?) {
fun test1(obj: Any) { fun test1(obj: Any) {
<!UNCHECKED_CAST!>obj as Qwe<T><!> obj <!UNCHECKED_CAST!>as Qwe<T><!>
check(<!DEBUG_INFO_SMARTCAST!>obj<!>.a) check(<!DEBUG_INFO_SMARTCAST!>obj<!>.a)
} }
fun test1(obj: Qwe<*>) { fun test1(obj: Qwe<*>) {
<!UNCHECKED_CAST!>obj as Qwe<T><!> obj <!UNCHECKED_CAST!>as Qwe<T><!>
check(<!DEBUG_INFO_SMARTCAST!>obj<!>.a) check(<!DEBUG_INFO_SMARTCAST!>obj<!>.a)
} }
+1 -1
View File
@@ -1,7 +1,7 @@
// Works already in M11 // Works already in M11
fun test(c : Class<*>) { fun test(c : Class<*>) {
val sc = <!UNCHECKED_CAST!>c as Class<String><!> val sc = c <!UNCHECKED_CAST!>as Class<String><!>
// No ambiguous overload // No ambiguous overload
c.getAnnotations(); c.getAnnotations();
sc.getAnnotations(); sc.getAnnotations();
@@ -3,6 +3,6 @@ package h
public class MyClass<S, T>(<!UNUSED_PARAMETER!>param<!>: MyClass<S, T>) { public class MyClass<S, T>(<!UNUSED_PARAMETER!>param<!>: MyClass<S, T>) {
fun test() { fun test() {
val result: MyClass<Any, Any>? = null val result: MyClass<Any, Any>? = null
MyClass<S, Any>(<!UNCHECKED_CAST!>result as MyClass<S, Any><!>) MyClass<S, Any>(result <!UNCHECKED_CAST!>as MyClass<S, Any><!>)
} }
} }
@@ -1,7 +1,7 @@
fun <T : CharSequence> foo(x: Array<Any>, block: (T, Int) -> Int) { fun <T : CharSequence> foo(x: Array<Any>, block: (T, Int) -> Int) {
var r: Any? var r: Any?
<!ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE!>@Suppress("UNCHECKED_CAST") r<!> = block(<!UNCHECKED_CAST!>x[0] as T<!>, "" <!CAST_NEVER_SUCCEEDS!>as<!> Int) <!ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE!>@Suppress("UNCHECKED_CAST") r<!> = block(x[0] <!UNCHECKED_CAST!>as T<!>, "" <!CAST_NEVER_SUCCEEDS!>as<!> Int)
// to prevent unused assignment diagnostic for the above statement // to prevent unused assignment diagnostic for the above statement
<!DEBUG_INFO_SMARTCAST!>r<!>.hashCode() <!DEBUG_INFO_SMARTCAST!>r<!>.hashCode()
@@ -9,11 +9,11 @@ fun <T : CharSequence> foo(x: Array<Any>, block: (T, Int) -> Int) {
var i = 1 var i = 1
if (i != 1) { if (i != 1) {
<!ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE!>@Suppress("UNCHECKED_CAST") i<!> += block(<!UNCHECKED_CAST!>x[0] as T<!>, "" <!CAST_NEVER_SUCCEEDS!>as<!> Int).toInt() <!ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE!>@Suppress("UNCHECKED_CAST") i<!> += block(x[0] <!UNCHECKED_CAST!>as T<!>, "" <!CAST_NEVER_SUCCEEDS!>as<!> Int).toInt()
} }
if (i != 1) @Suppress("UNCHECKED_CAST") if (i != 1) @Suppress("UNCHECKED_CAST")
i += block(x[0] as T, "" <!CAST_NEVER_SUCCEEDS!>as<!> Int).toInt() i += block(x[0] as T, "" <!CAST_NEVER_SUCCEEDS!>as<!> Int).toInt()
if (i != 1) <!ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE!>@Suppress("UNCHECKED_CAST") i<!> += block(<!UNCHECKED_CAST!>x[0] as T<!>, "" <!CAST_NEVER_SUCCEEDS!>as<!> Int).toInt() if (i != 1) <!ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE!>@Suppress("UNCHECKED_CAST") i<!> += block(x[0] <!UNCHECKED_CAST!>as T<!>, "" <!CAST_NEVER_SUCCEEDS!>as<!> Int).toInt()
} }