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
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<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>
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() {
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)
fun <T> test(clazz: Class<T>) {
println((<!UNCHECKED_CAST!>clazz as Class<Any><!>).name)
println((clazz <!UNCHECKED_CAST!>as Class<Any><!>).name)
}
fun use() {
@@ -12,22 +12,22 @@ fun use() {
fun checkArrays(): Array<Any> {
val someArray = arrayOfNulls<Any>(5)
<!UNCHECKED_CAST!>someArray as Array<Int><!>
return <!UNCHECKED_CAST!>someArray as Array<Any><!>
someArray <!UNCHECKED_CAST!>as Array<Int><!>
return someArray <!UNCHECKED_CAST!>as Array<Any><!>
}
class Wrapper<T>(val x: T)
fun checkArrays2(): Array<Wrapper<String>> {
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() {
val someArray = arrayOfNulls<String>(1)
<!UNCHECKED_CAST!>someArray as Array<Any><!>
someArray <!UNCHECKED_CAST!>as Array<Any><!>
val intArray = arrayOfNulls<Int>(1)
<!UNCHECKED_CAST!>intArray as Array<Any><!>
intArray <!UNCHECKED_CAST!>as Array<Any><!>
}
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?<!>
<!UNCHECKED_CAST!>null as T<!>
null <!UNCHECKED_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?) {
@@ -25,7 +25,7 @@ class MyProperty<R, T> {
operator fun getValue(thisRef: R, desc: KProperty<*>): T {
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) {
@@ -6,11 +6,11 @@ fun <E> foo(x: Any, y: Any) : Any {
}
if (1 == 2) {
<!UNCHECKED_CAST!>x as C<!>
x <!UNCHECKED_CAST!>as C<!>
}
if (2 == 3) {
<!UNCHECKED_CAST!>x as? C<!>
x <!UNCHECKED_CAST!>as? C<!>
}
class Outer<F> {
@@ -22,7 +22,7 @@ fun <E> foo(x: Any, y: Any) : Any {
return y
}
<!UNCHECKED_CAST!>y as Outer<*>.Inner<!>
y <!UNCHECKED_CAST!>as Outer<*>.Inner<!>
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 {
if (this.containsKey(key)) {
return <!UNCHECKED_CAST!>this.get(key) as V<!>
return this.get(key) <!UNCHECKED_CAST!>as V<!>
} else {
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()
c.add(t)
c.remove(<!UNCHECKED_CAST!>1 as T<!>)
c.remove(1 <!UNCHECKED_CAST!>as T<!>)
c.addAll(c)
c.removeAll(c)
c.retainAll(c)
@@ -84,7 +84,7 @@ fun <T> testMutableSet(s: MutableSet<T>, t: T) {
val <!UNUSED_VARIABLE!>mutableIterator<!>: MutableIterator<T> = s.iterator()
s.add(t)
s.remove(<!UNCHECKED_CAST!>1 as T<!>)
s.remove(1 <!UNCHECKED_CAST!>as T<!>)
s.addAll(s)
s.removeAll(s)
s.retainAll(s)
@@ -1,11 +1,11 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER, -SENSELESS_COMPARISON, -DEBUG_INFO_SMARTCAST
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 {
return <!UNCHECKED_CAST!>t as T<!> <!USELESS_ELVIS!>?: ""<!>
return t <!UNCHECKED_CAST!>as T<!> <!USELESS_ELVIS!>?: ""<!>
}
fun <T: Any?> test3(t: Any?): Any {
@@ -27,7 +27,7 @@ fun main(
// Lists
a.foo(<!JAVA_TYPE_MISMATCH!>ml<!>)
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>)
// Iterables
@@ -43,25 +43,25 @@ fun main(
// Sets
a.foo(<!JAVA_TYPE_MISMATCH!>ms<!>)
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>)
// Maps
a.foo(<!JAVA_TYPE_MISMATCH!>mm<!>)
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>)
// Map entries
a.foo(<!JAVA_TYPE_MISMATCH!>mme<!>)
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>)
// Lists of lists
a.foo(<!JAVA_TYPE_MISMATCH!>mll<!>)
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>>)
}
@@ -11,6 +11,6 @@ public class A {
fun main(a: A, ml: Any) {
if (ml is <!CANNOT_CHECK_FOR_ERASED!>MutableList<String><!>) {
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<!> {
fun getOrNull(index: Int, value: T) : T {
return <!UNCHECKED_CAST!>get(index) as? T<!> ?: value
}
fun getOrNull(index: Int, value: T) : T {
return get(index) <!UNCHECKED_CAST!>as? T<!> ?: value
}
}
+1 -1
View File
@@ -3,5 +3,5 @@
class IdUnavailableException() : Exception() {}
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> {
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()
+2 -2
View File
@@ -3,12 +3,12 @@
class Qwe<T : Any>(val a: T?) {
fun test1(obj: Any) {
<!UNCHECKED_CAST!>obj as Qwe<T><!>
obj <!UNCHECKED_CAST!>as Qwe<T><!>
check(<!DEBUG_INFO_SMARTCAST!>obj<!>.a)
}
fun test1(obj: Qwe<*>) {
<!UNCHECKED_CAST!>obj as Qwe<T><!>
obj <!UNCHECKED_CAST!>as Qwe<T><!>
check(<!DEBUG_INFO_SMARTCAST!>obj<!>.a)
}
+1 -1
View File
@@ -1,7 +1,7 @@
// Works already in M11
fun test(c : Class<*>) {
val sc = <!UNCHECKED_CAST!>c as Class<String><!>
val sc = c <!UNCHECKED_CAST!>as Class<String><!>
// No ambiguous overload
c.getAnnotations();
sc.getAnnotations();
@@ -3,6 +3,6 @@ package h
public class MyClass<S, T>(<!UNUSED_PARAMETER!>param<!>: MyClass<S, T>) {
fun test() {
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) {
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
<!DEBUG_INFO_SMARTCAST!>r<!>.hashCode()
@@ -9,11 +9,11 @@ fun <T : CharSequence> foo(x: Array<Any>, block: (T, Int) -> Int) {
var 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")
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()
}