Reduce highlighting range for UNCHECKED_CAST
#KT-18985 Fixed
This commit is contained in:
@@ -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
@@ -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
@@ -1 +1 @@
|
||||
fun f(x: Any) = <!UNCHECKED_CAST!>x as Array<String><!>
|
||||
fun f(x: Any) = x <!UNCHECKED_CAST!>as Array<String><!>
|
||||
@@ -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?) {
|
||||
|
||||
Vendored
+1
-1
@@ -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) {
|
||||
|
||||
+3
-3
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
+5
-5
@@ -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>>)
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -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><!>)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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. ?!!!
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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,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><!>)
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user